gpt4 book ai didi

c# - 如何通过 C# 使用 WMI 从在 64 位机器 (WOW) 上以 32 位模式运行的应用程序访问 64 位注册表配置单元信息

转载 作者:太空狗 更新时间:2023-10-30 00:22:19 26 4
gpt4 key购买 nike

我认为这个问题确实总结了我正在尝试做的事情。这是我正在使用的代码。它适用于所有场景,除非我的应用程序在 64 位机器上以 32 位模式运行。无论我如何使用 __ProviderArchitecture 和 __RequiredArchitecture 标志,我似乎总是只能访问配置单元 (WOW6432Node) 的 32 位部分

uint LOCAL_MACHINE = 0x80000002;
string results = "";
ConnectionOptions options = new ConnectionOptions();
options.Impersonation = ImpersonationLevel.Impersonate;
options.EnablePrivileges = true;
options.Username = this.txtUser.Text;
options.Password = this.txtPassword.Text;

ManagementScope myScope = new ManagementScope("\\\\" + this.txtMachine.Text + "\\root\\default", options);
ManagementPath mypath = new ManagementPath("StdRegProv");
ManagementClass mc = new ManagementClass(myScope, mypath, null);

ManagementBaseObject inParams = mc.GetMethodParameters("EnumKey");
inParams["hDefKey"] = LOCAL_MACHINE;
inParams["sSubKeyName"] = @"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall";

ManagementNamedValueCollection objCtx = new ManagementNamedValueCollection();
objCtx.Add("__ProviderArchitecture", 64);
objCtx.Add("__RequiredArchitecture", true);


InvokeMethodOptions invokeOptions = new InvokeMethodOptions();
invokeOptions.Context = objCtx;
ManagementBaseObject outParams = mc.InvokeMethod("EnumKey", inParams, invokeOptions);

inParams = mc.GetMethodParameters("GetStringValue");
inParams["hDefKey"] = LOCAL_MACHINE;

foreach(string name in (string[])outParams["sNames"])
{
inParams["sSubKeyName"] = @"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall" + "\\" + name;
inParams["sValueName"] = "DisplayName";
outParams = mc.InvokeMethod("GetStringValue", inParams, invokeOptions);

if (!string.IsNullOrEmpty(((string)outParams["sValue"])))
{
results += outParams["sValue"] + "\t";
}
}

最佳答案

我认为没有必要启动一个单独的过程。我能够从 32 位进程访问 远程 机器的 64 位注册表。在上面的示例中,我直接将选项添加到范围,而不是在调用选项中设置它们。

myScope.Options.Context.Add("__ProviderArchitecture", 64);
myScope.Options.Context.Add("__RequiredArchitecture", true);

还需要注意的是,在 .net 4 中,OpenRemoteBaseKey 函数现在有一个参数 (RegistryView),请参阅 msdn here

关于c# - 如何通过 C# 使用 WMI 从在 64 位机器 (WOW) 上以 32 位模式运行的应用程序访问 64 位注册表配置单元信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1735563/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com