In some cases, the registry settings for installed Applications will be available only in WoW6432Node even in 64-bit machine. So, we need to force WMI to access the 32-bit Registry Hive in 64 bit computer.
Use the following C# code to access 32 bit registry hive information in 64 machine. We can force WMI to load the 32-bit provider by adding the ConnectionOptions __ProviderArchitecture and __RequiredArchitecture.
private static void Read32RegistryIn64Machine()
{
uint LOCAL_MACHINE = 0x80000002;
ConnectionOptions options = new ConnectionOptions();
options.Impersonation = ImpersonationLevel.Impersonate;
options.EnablePrivileges = true;
options.Username = "MyUserName";
options.Password = "MyPassword";
ManagementScope mgmtScope = new ManagementScope("\" + "ComputerName" + "rootdefault", options);
mgmtScope.Options.Context.Add("__ProviderArchitecture", 32);
mgmtScope.Options.Context.Add("__RequiredArchitecture", true);
ManagementClass mc = new ManagementClass(mgmtScope, new ManagementPath("StdRegProv"), null);
ManagementBaseObject inParams = mc.GetMethodParameters("EnumKey");
inParams["hDefKey"] = LOCAL_MACHINE;
inParams["sSubKeyName"] = @"SOFTWAREMicrosoftWindowsCurrentVersionUninstall";
ManagementBaseObject outParams = mc.InvokeMethod("EnumKey", inParams, null);
inParams = mc.GetMethodParameters("GetStringValue");
inParams["hDefKey"] = LOCAL_MACHINE;
foreach (string name in (string[])outParams["sNames"])
{
inParams["sSubKeyName"] = @"SOFTWAREMicrosoftWindowsCurrentVersionUninstall" + "" + name;
inParams["sValueName"] = "DisplayName";
outParams = mc.InvokeMethod("GetStringValue", inParams, null);
Console.WriteLine(outParams["sValue"]);
}
}
Advertisement