Überprüfen welche Version einer Software installiert ist
Manchmal ist es notwendig, in einer Applikation zu überprüfen, ob eine bestimmte Software installiert ist oder nicht.
Die zwei offensichtlichsten Ansätze sind:
- im Ordner C:Program Files (bzw. C:Program Files (x86)) nach der Software zu suchen
- In der Registry nach einem entsprechenden Eintrag zu suchen
Der erste Ansatz ist sehr unsicher, da unter Umständen eine Software nicht in den Standardordner für Programme installiert wurde.
Muss man dann noch die Version einer installierten Software wissen, bleibt einem sowie nur noch Variante 2 mit der Registry.
Wer Windows kennt, weiss dass in der Systemsteuerung eine Liste mit allen Programmen und der installierten Programmversion vorhanden ist. Die Information muss also vorhanden sein.
Nicht so offensichtlich ist, dass die Liste nicht einfach unter einem einzigen Pfad in der Registry zu finden ist, sondern sich aus 3 verschiedenen Listen zusammensetzt.
3 Locations:
- HKEY_CURRENT_USERSOFTWAREMicrosoftWindowsCurrentVersionUninstall
- HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionUninstall
- HKEY_LOCAL_MACHINESOFTWAREWow6432NodeMicrosoftWindowsCurrentVersionUninstall
Jeder Subkey unter einem von diesen Pfaden enthält ein DisplayName Attribut, sowie ein DisplayVersion Attribut. Anhand von diesen kann festgestellt werden ob eine bestimmte Software und Version auf dem System installiert ist.
Folgende Codefragemnte zeigen wie dies in .NET mit C# umgesetzt werden kann:
public string GetVersionOfInstalledProgram(string programName)
{
string keyName = @"SOFTWAREMicrosoftWindowsCurrentVersionUninstall";
string foundVersion = FindProgramVersionInSubKey(Registry.CurrentUser, keyName, programName);
if (foundVersion != null)
{
return foundVersion;
}
keyName = @"SOFTWAREMicrosoftWindowsCurrentVersionUninstall";
foundVersion = FindProgramVersionInSubKey(Registry.LocalMachine, keyName, programName);
if (foundVersion != null)
{
return foundVersion;
}
keyName = @"SOFTWAREWow6432NodeMicrosoftWindowsCurrentVersionUninstall";
foundVersion = FindProgramVersionInSubKey(Registry.LocalMachine, keyName, programName);
if (foundVersion != null)
{
return foundVersion;
}
return null;
}
private string FindProgramVersionInSubKey(RegistryKey rootKey, string subKeyName, string programName)
{
using (RegistryKey key = rootKey.OpenSubKey(subKeyName))
{
if (key == null)
{
return null;
}
foreach (string keyname in key.GetSubKeyNames())
{
using (RegistryKey subkey = key.OpenSubKey(keyname))
{
if (subkey == null)
{
continue;
}
string displayName = subkey.GetValue("DisplayName") as string;
if (displayName != null && programName.Equals(displayName))
{
string displayVersion = subkey.GetValue("DisplayVersion") as string;
if (!String.IsNullOrWhiteSpace(displayVersion))
{
return displayVersion;
}
}
}
}
}
return null;
}