Hola,
para consultar las aplicaciones instaladas, he visto en foros que hay que consultar la clave de la aplicación que aparece en SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\
Qué pasaría si se desinstala la aplicación, se eliminaría el valor de la clave correspondiente ?? En algún foro leí que no se eliminaba, y por tanto, cómo podríamos saber si una aplicación (que buscamos por su nombre) está instalada, no éstá instalada, o se ha desinstalado ??
Para los servicios windows, cómo podemos determinar que están instalados ?? Utilizando ServiceController o WMI ???
Saludos.
Código de Lluis Franco
private void TestEnumsoftware()
{
var apps = from a in EnumSoftware() orderby a select a;
foreach (string app in apps)
{
Console.WriteLine(app);
}
}
private List<string> EnumSoftware()
{
List<string> apps = new List<string>();
const uint HKEY_LOCAL_MACHINE = unchecked((uint)0x80000002);
ManagementClass wmiRegistry = new ManagementClass("root/default", "StdRegProv", null);
string keyPath = @"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall";
object[] methodArgs = new object[] {HKEY_LOCAL_MACHINE, keyPath, null};
uint returnValue = (uint)wmiRegistry.InvokeMethod("EnumKey", methodArgs);
if (null != methodArgs[2])
{
string[] subKeys = methodArgs[2] as String[];
if (subKeys == null) return apps;
ManagementBaseObject inParam =
wmiRegistry.GetMethodParameters("GetStringValue");
inParam["hDefKey"] = HKEY_LOCAL_MACHINE;
string keyName = "";
foreach (string subKey in subKeys)
{
keyPath = @"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\" +
subKey;
keyName = "DisplayName";
inParam["sSubKeyName"] = keyPath;
inParam["sValueName"] = keyName;
ManagementBaseObject outParam =
wmiRegistry.InvokeMethod("GetStringValue", inParam, null);
if ((uint)outParam["ReturnValue"] == 0)
apps.Add(outParam["sValue"].ToString());
}
}
return apps;
}