当字符串存在时,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