2017-07-10 2 views
0

Ich brauche einen Hinweis, wie Sie den Upgrade-Code von einer installierten MSI aus der Registrierung abrufen. Tatsächlich habe ich den Produktcode, der von HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\ abgerufen werden kann.Holen Sie Upgrade-Code für Produktcode aus der Registrierung

Jetzt möchte ich den Upgrade-Code (basierend auf dem Produktcode) von HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UpgradeCodes abrufen.

Mein Problem ist, dass der Produktcode als Wert-Name verwendet wird, was bedeutet, ich habe eine REG_SZ, wo der Name ist der Produktcode GUID und der Wert ist leer.

Eine Möglichkeit, den Produktcode abrufen könnte sein:

 
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= 
... 

Wie kann ich überprüfen, ob ein PSCustomObject die Eigenschaft hat, 42F79228D77BA4A4EB5150F3DC090CE3?

Weiß jemand, ob es einen eleganteren Weg gibt?

+0

** Sie können dies mit WMI erreichen, sodass Sie Registrierungsschlüssel nicht lesen und interpretieren müssen **. Sie werden den richtigen Upgrade-Code automatisch im richtigen Format erhalten. Siehe diese Antwort: [** Wie finde ich den Upgrade-Code für eine installierte MSI-Datei? **] (https://stackoverflow.com/questions/46637094/how-can-i-find-the-upgrade-code- for-a-installed-msi-Datei/46637095 # 46637095) (das VBScript nach unten). –

+0

@ SteinÅsmul: Verwenden von WMI zum Abfragen von installierten MSIs ist eine schlechte Idee -> Lesen Sie diese -> https://stackoverflow.com/questions/25083520/wmi-select-from-win32-product-takes-a-long-time. – Moerwald

+0

Ich bin mir dessen voll bewusst, aber ** es gibt keine Selbstheilung, wenn das Paket gut installiert ist **. Was läuft, ist ein ** Integritätscheck des Pakets ** (was zugegebenermaßen sehr langsam ist), aber die Selbstreparatur läuft nur, wenn eine Diskrepanz gefunden wird. Und in den meisten Fällen kann die Selbstreparatur abgebrochen werden, wenn Sie beschäftigt sind. Ich warne bereits in meiner Antwort darauf, wie man hier Produktcodes findet: [** Wie finde ich die Produkt-GUID eines installierten MSI-Setups? **] (https://stackoverflow.com/questions/29937568/how -can-ich-finde-das-Produkt-Guid-of-ein-installiert-msi-setup/29937569 # 29937569). –

Antwort

1

So können Sie überprüfen. Die Arbeit an dieser elegante Lösung ...

$properties = Get-ItemProperty * | select -first 1 | Get-Member | Where-object {$_.MemberType -eq "NoteProperty"} 

if("42F79228D77BA4A4EB5150F3DC090CE3" -in $properties.Name){ 
    Write-Output "It's in there!" 
} 

bearbeiten

Das ist ein bisschen mehr elegant. Es geht auf den Pfad HKLM und prüft auf einen PSChildName (Registrierungsschlüssel), der dem Code entspricht.

Wenn gefunden, wird der Name und die Eigenschaft zurückgegeben. Wenn nicht gefunden, wird die Variable $codeExists$null sein.

$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!" 
} 
Verwandte Themen