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