2017-07-10 11 views
0

インストールされているMSIからアップグレードコードをレジストリから取得する方法についてのヒントが必要です。実際にはHKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\から取得できる製品コードがあります。レジストリから製品コードのアップグレードコードを取得

今、アップグレードコード(製品コードに基づいて)をHKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UpgradeCodesから取得したいと考えています。

私の問題は、製品コードが値の名前として使用されていることです。つまり、製品コードguidで値が空のREG_SZです。製品コードを取得する

一つの方法は、次のようになります。

 
PS HKLM:\SOFTW...Codes> Get-ItemProperty * | select -First 1 | gm 

    TypeName: System.Management.Automation.PSCustomObject 

Name        MemberType Definition 
----        ---------- ---------- 
Equals       Method  bool Equals(System.Object obj) 
GetHashCode      Method  int GetHashCode() 
GetType       Method  type GetType() 
ToString       Method  string ToString() 
42F79228D77BA4A4EB5150F3DC090CE3 NoteProperty System.String 42F79228D77BA4A4EB5150F3DC090CE3= 
... 

にはどうすればPSCustomObjectプロパティ42F79228D77BA4A4EB5150F3DC090CE3を持っているかどうかを確認することができますか?

もっとエレガントな方法があれば誰でも知っていますか?

+0

** WMIを使用すると、レジストリキーを読み取って解釈する必要はありません。実際のアップグレードコードを適切な形式で自動的に取得します。この回答を参照してください:[**インストールされているMSIファイルのアップグレードコードはどのように見つけることができますか?**](https://stackoverflow.com/questions/46637094/how-can-i-find-the-upgrade-code-インストールされているmsiファイル/ 46637095#46637095)(VBScriptが一番下にあります)。 –

+0

@SteinÅsmul:WMIを使用してインストールされたMSIを照会することは悪い考えです - >これを読んで - > https://stackoverflow.com/questions/25083520/wmi-select-from-win32-product-takes-a-long-time。 – Moerwald

+0

私はこれについて十分認識していますが、パッケージ敷地が適切にインストールされていれば、自己回復はありません**。稼働しているのは**パッケージ不動産**の完全性チェック(確かに非常に遅くなります)ですが、不一致が見つかった場合にのみ自己修復が実行されます。ほとんどの場合、あなたが忙しい場合は自己修復をキャンセルすることができます。私は既に、この問題について、私がここで製品コードを見つける方法について警告します:[**インストールされたMSIセットアップの製品GUIDを見つけるにはどうすればいいですか?**](https://stackoverflow.com/questions/29937568/howインストールされているmsi-setup/29937569#29937569)を参照してください。 –

答えて

1

これは確認方法です。


$properties = Get-ItemProperty * | select -first 1 | Get-Member | Where-object {$_.MemberType -eq "NoteProperty"} if("42F79228D77BA4A4EB5150F3DC090CE3" -in $properties.Name){ Write-Output "It's in there!" } 

編集

これはもう少しエレガントです...そのエレガントな解決策に取り組んでいます。 HKLMパスに移動し、コードと同じPSChildName(レジストリキー)を確認します。

見つかった場合は、名前とプロパティが返されます。見つからない場合、変数$codeExists$nullになります。

$code  = "42F79228D77BA4A4EB5150F3DC090CE3" 
$codeExists = Get-ChildItem "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UpgradeCodes" | Where-Object {$_.PSChildName -eq $code} 

if($codeExists){ 
    Write-Output "It's in there!" 
} 
関連する問題