web-dev-qa-db-de.com

Installierte Programme über die Registry erkennen

Ich muss einen Prozess entwickeln, der erkennt, ob auf dem Computer des Benutzers bestimmte Programme installiert sind und wenn ja, welche Version. Ich glaube, ich brauche eine Liste mit dem Registrierungsspeicherort und den Schlüsseln, um danach zu suchen und sie dem Programm zuzuführen, was kein Problem darstellt. Gibt es einen besseren Weg, dies zu erreichen?

Mein erster Gedanke war, die Registrierung in den Deinstallationseinträgen einzuchecken, aber es scheint, dass eine der Apps, die ich entdecken möchte, keine hat. Wo ist der Standardspeicherort für alle Registrierungen, in denen Anwendungen einen Eintrag vornehmen?

58
Mark Stahler

Benutzerspezifische Einstellungen sollten in HKCU\Software geschrieben werden, maschinenspezifische Einstellungen in HKLM\Software. Unter diesen Schlüsseln kann die Struktur [software vendor name]\[application name] (z. B. HKLM\Software\Microsoft\Internet Explorer) die häufigste sein, aber das ist nur eine Konvention und kein Naturgesetz.

Viele (die meisten?) Anwendungen fügen ihre Deinstallationseinträge auch zu HKLM\Software\Microsoft\Windows\CurrentVersion\Uninstall\[app name] hinzu, aber auch dies wird nicht von allen Anwendungen ausgeführt.

Dies sind die wichtigsten Schlüssel. Allerdings muss der Inhalt der Registry die installierte Software nicht exakt darstellen. Möglicherweise wurde die Anwendung einmal installiert, dann aber manuell gelöscht oder das Deinstallationsprogramm entfernte möglicherweise nicht alle Spuren davon. Wenn Sie sicher gehen möchten, überprüfen Sie das Dateisystem, um festzustellen, ob die Anwendung noch dort vorhanden ist, wo ihre Registrierungseinträge es angeben.

Bearbeiten:

Wenn Sie Mitglied der Gruppe Administratoren sind, können Sie die HKEY_USERS-Struktur überprüfen - die HKCU der einzelnen Benutzer befindet sich tatsächlich dort (Sie müssen die Benutzer-SID kennen oder alle durchgehen).

Hinweis: Wie @Brian Ensink sagt, ist "installiert" ein vages Konzept - versuchen wir herauszufinden, was der Benutzer ausführen könnte? Einige Software schreibt überhaupt nicht in die Registry: Suchen Sie nach "Portable Apps", um Apps anzuzeigen, die speziell für die direkte Ausführung von Medien (CD/USB) und nicht geändert wurden, um Spuren auf dem Computer zu hinterlassen . Möglicherweise müssen wir auch die Festplatten und Netzwerkfestplatten sowie alles, was der Benutzer herunterlädt, und weltweit zugängliche Windows-Freigaben im Internet scannen (ja, solche Dinge sind legitim - ich denke an \\live.sysinternals.com\tools). In dieser Richtung gibt es keine wirkliche Begrenzung dessen, was der Benutzer ausführen kann, sofern dies nicht durch Systemrichtlinien verhindert wird.

34
Piskvor

Auf 64-Bit-Systemen lautet der x64-Schlüssel:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall

Die meisten Programme sind dort aufgelistet. Schauen Sie sich die Schlüssel an: DisplayNameDisplayVersion

Beachten Sie, dass das letzte nicht immer gesetzt ist!

Auf 64-Bit-Systemen lautet der x86-Schlüssel (normalerweise mit mehr Einträgen):

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall
36
Bernd Ott

Sie können die MSI-API verwenden, um alles, was von Windows Installer installiert wird, aufzulisten, dabei wird jedoch nicht die gesamte auf einem Computer verfügbare Software aufgeführt. Ohne mehr darüber zu wissen, was Sie brauchen, denke ich, ist das Konzept von "installiert" etwas vage. Es gibt viele Möglichkeiten, Software auf einem System bereitzustellen, von großen komplizierten Installationsprogrammen bis hin zu Zip-Dateien und allem, was dazwischen liegt.

9
Brian Ensink

Eine Anwendung muss keinen Registrierungseintrag haben. Tatsächlich müssen viele Anwendungen überhaupt nicht installiert werden. U3 USB-Sticks sind ein gutes Beispiel. Die Programme darauf laufen einfach aus dem Dateisystem.

Wie bereits erwähnt, können die meisten guten Anwendungen jedoch über den Registrierungsschlüssel für die Deinstallation gefunden werden. Dies ist eigentlich ein Schlüsselpaar, pro Benutzer und pro Computer (HKCU/HKLM - Piskvor erwähnte nur den HKLM-Schlüssel). Es gibt Ihnen jedoch nicht (immer) das Installationsverzeichnis.

Wenn es sich in HKCU befindet, müssen Sie feststellen, dass HKEY_CURRENT_USER wirklich "Aktueller Benutzer" bedeutet. Andere Benutzer haben ihre eigenen HKCU-Einträge und ihre eigene installierte Software. Das kannst du nicht finden. Das Lesen von every HKEY_USERS Hive ist eine Katastrophe in Unternehmensnetzwerken mit servergespeicherten Profilen. Sie möchten wirklich nicht 1000 Konten von Ihrem Remote-Büro in den USA abrufen.

Selbst wenn eine Anwendung installiert ist und Sie wissen, wo sie ist, hat sie möglicherweise nicht den gleichen Begriff wie "Version". Die beste Quelle ist die Ressource "Version" in den ausführbaren Dateien. Das ist in der Tat ein Plural, also müssen Sie alle finden, Versionsressourcen aus allen extrahieren und im Konfliktfall etwas Vernünftiges entscheiden.

Also viel Glück. Es gibt Dutzende von Möglichkeiten zum Scheitern.

6
MSalters

Sie können ein PowerShell-Skript zum Anzeigen von Registern und zum Abrufen der Details des installierten Programms verwenden. Das untenstehende Skript generiert eine Datei mit der vollständigen Liste der installierten Programme. Speichern Sie es mit der Erweiterung ".ps" und doppelklicken Sie auf die Datei.

#
# Generates a full list of installed programs.
#

# Temporary auxiliar file.
$tmpFile = "tmp.txt"

# File that will hold the programs list.
$fileName = "programas-instalados.txt"

# Columns separator.
$separator = ","

# Delete previous files.
Remove-Item $tmpFile
Remove-Item $fileName

# Creates the temporary file.
Create-Item $tmpFile

# Searchs register for programs - part 1
$loc = Get-ChildItem HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall
$names = $loc |foreach-object {Get-ItemProperty $_.PsPath}
foreach ($name in $names)
{
    IF(-Not [string]::IsNullOrEmpty($name.DisplayName)) {      
        $line = $name.DisplayName+$separator+$name.DisplayVersion+$separator+$name.InstallDate
        Write-Host $line
        Add-Content $tmpFile "$line`n"        
    }
}

# Searchs register for programs - part 2
$loc = Get-ChildItem HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall
$names = $loc |foreach-object {Get-ItemProperty $_.PsPath}
foreach ($name in $names)
{
    IF(-Not [string]::IsNullOrEmpty($name.DisplayName)) {      
        $line = $name.DisplayName+$separator+$name.DisplayVersion+$separator+$name.InstallDate
        Write-Host $line
        Add-Content $tmpFile "$line`n"
    }
}

# Sorts the result, removes duplicate lines and
# generates the final file.
gc $tmpFile | sort | get-unique > $filename
2
Arivan Bastos

Zusätzlich zu allen oben genannten Registrierungsschlüsseln müssen Sie möglicherweise auch unter HKEY_CURRENT_USER\Software\Microsoft\Installer\Products nach Programmen suchen, die nur für den aktuellen Benutzer installiert sind.

1

Win32_Product zeigt nie alles, nur Software, die über ein MSI-Installationsprogramm installiert wurde (soweit ich das beurteilen kann.)

Es gibt viele Softwarepakete, die über andere Installationsprogramme installiert werden, die dort nicht angezeigt werden. ein anderer Weg ist erforderlich.

0
Naikrovek

Es scheint, als würde die Suche nach etwas Bestimmtem für das installierte Programm besser funktionieren, aber HKCU\Software und HKLM\Software sind die richtigen Stellen.

0
Nick

HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Compatibility Assistant\Persisted

0
user10211111