当字符串存在时,C# WMI Registry GetStringValue 返回 null
C# WMI Registry GetStringValue returning null when string is there
我正在使用以下代码,这些代码是我在这里阅读其他问题时整理的:
ConnectionOptions oConn = new ConnectionOptions();
System.Management.ManagementScope scope = new System.Management.ManagementScope(@"\" + "compname" + @"\root\cimv2", oConn);
scope.Connect();
MessageBox.Show("");
ManagementClass registry = new ManagementClass(scope, new ManagementPath("StdRegProv"), null);
ManagementBaseObject inParams = registry.GetMethodParameters("GetStringValue");
inParams["hDefKey"] = 0x80000002;// HKEY_LOCAL_MACHINE;
inParams["sSubKeyName"] = @"SOFTWARE\Microsoft\Windows\CurrentVersion\Authentication\LogonUI";
inParams["sValueName"] = "LastLoggedOnDisplayName";
ManagementBaseObject outParams = registry.InvokeMethod("GetStringValue", inParams, null);
if (outParams.Properties["sValue"].Value != null)
{
MessageBox.Show(outParams.Properties["sValue"].Value.ToString());
}
但是,每次 outParams.Properties["sValue"].Value
返回 null,即使我可以看到字符串值实际上在注册表编辑器中。
如果我使用以下代码遍历子键:
string[] subkeys = (string[])mc.InvokeMethod("EnumValues", mbo, null).Properties["sNames"].Value;
foreach (string strKey in subkeys)
{
MessageBox.Show(strKey);
}
无论类型如何,它只会显示一个子项,将 EnumValues
切换到 GetStringValue
会导致找不到路径错误`
发生了一些奇怪的事情,也许另一双眼睛可以帮助我看清?最后,我只是想在 SOFTWARE\Microsoft\Windows\CurrentVersion\Authentication\LogonUI
中获取 LastLoggedOnDisplayName
字符串值
欢迎任何反馈
默认情况下,您的应用程序是 32 位的,因此将被重定向到 64 位的 32 位注册表位置 OS:
SOFTWARE\WOW6432Node\Microsoft\...
要强制读取 64 位值,要么构建为 64 位,要么将您的范围配置为:
System.Management.ManagementScope scope = new System.Management.ManagementScope(@"\" + "compname" + @"\root\cimv2", oConn);
scope.Options.Context.Add("__ProviderArchitecture", 64);
scope.Options.Context.Add("__RequiredArchitecture", true);
scope.Connect();
(我假设您使用此代码访问远程注册表,如果不是这种情况,则可以更简单地完成此操作:https://docs.microsoft.com/en-us/dotnet/api/microsoft.win32.registry.getvalue)
我正在使用以下代码,这些代码是我在这里阅读其他问题时整理的:
ConnectionOptions oConn = new ConnectionOptions();
System.Management.ManagementScope scope = new System.Management.ManagementScope(@"\" + "compname" + @"\root\cimv2", oConn);
scope.Connect();
MessageBox.Show("");
ManagementClass registry = new ManagementClass(scope, new ManagementPath("StdRegProv"), null);
ManagementBaseObject inParams = registry.GetMethodParameters("GetStringValue");
inParams["hDefKey"] = 0x80000002;// HKEY_LOCAL_MACHINE;
inParams["sSubKeyName"] = @"SOFTWARE\Microsoft\Windows\CurrentVersion\Authentication\LogonUI";
inParams["sValueName"] = "LastLoggedOnDisplayName";
ManagementBaseObject outParams = registry.InvokeMethod("GetStringValue", inParams, null);
if (outParams.Properties["sValue"].Value != null)
{
MessageBox.Show(outParams.Properties["sValue"].Value.ToString());
}
但是,每次 outParams.Properties["sValue"].Value
返回 null,即使我可以看到字符串值实际上在注册表编辑器中。
如果我使用以下代码遍历子键:
string[] subkeys = (string[])mc.InvokeMethod("EnumValues", mbo, null).Properties["sNames"].Value;
foreach (string strKey in subkeys)
{
MessageBox.Show(strKey);
}
无论类型如何,它只会显示一个子项,将 EnumValues
切换到 GetStringValue
会导致找不到路径错误`
发生了一些奇怪的事情,也许另一双眼睛可以帮助我看清?最后,我只是想在 SOFTWARE\Microsoft\Windows\CurrentVersion\Authentication\LogonUI
LastLoggedOnDisplayName
字符串值
欢迎任何反馈
默认情况下,您的应用程序是 32 位的,因此将被重定向到 64 位的 32 位注册表位置 OS:
SOFTWARE\WOW6432Node\Microsoft\...
要强制读取 64 位值,要么构建为 64 位,要么将您的范围配置为:
System.Management.ManagementScope scope = new System.Management.ManagementScope(@"\" + "compname" + @"\root\cimv2", oConn);
scope.Options.Context.Add("__ProviderArchitecture", 64);
scope.Options.Context.Add("__RequiredArchitecture", true);
scope.Connect();
(我假设您使用此代码访问远程注册表,如果不是这种情况,则可以更简单地完成此操作:https://docs.microsoft.com/en-us/dotnet/api/microsoft.win32.registry.getvalue)