当前位置: 首页 > 知识库问答 >
问题:

C#WMI注册表GetStringValue在string存在时返回null

公良征
2023-03-14

我正在使用下面的代码,这些代码是我为阅读这里的其他问题而拼凑起来的:

        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会导致路径找不到错误`

有些不确定的事情正在发生,也许另一双眼睛能帮我看清楚?最后,我只是尝试在软件\Microsoft\Windows\CurrentVersion\Authentication\LogonUI中获取LastLoggedOnDisplayName字符串值

欢迎任何反馈

共有1个答案

丰胤运
2023-03-14

默认情况下,您的应用程序是32位,因此将重定向到64位操作系统上的32位注册表位置:

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)

 类似资料:
  • 本文向大家介绍如何在C#中使用注册表,包括了如何在C#中使用注册表的使用技巧和注意事项,需要的朋友参考一下 一、什么是注册表         注册表是Microsoft Windows操作系统和其应用程序中的一个重要的层次型数据库,用于存储系统和应用程序的设置信息。由键(key,或称“项”)、子键(subkey,子项)和值项(value)构成。一个键就是树状数据结构中的一个节点,而子键就是这个节点

  • 我有两门课。在一节课上,我创建并发起了一个活动,如下所示: 客户添加类 MyWindow类 现在,当我从类调用方法时,(当我订阅方法到事件时),不会被调用。调试器显示为空。我搜索了几个小时,没有找到解决办法。我跟随了这个链接,但仍然为空。如有任何指导/帮助,将不胜感激。

  • 对于< code>ValueData(或类似的属性),是否有函数的返回值。已尝试以下方法: 但这只是将字符串< code > get computer name string()添加到注册表项中。

  • 我正在使用指标注册表将指标记录到jmx中。我使用以下代码 它第一次运行良好。如果我再次尝试这样做,我得到的错误是一个名为****的度量已经存在。但我想记录发送给控制器的每个请求的相同度量值,以便在Grafana中可视化。 是否有任何方法可以记录每个请求的相同度量名称的值? 还有如何每1分钟检查记录的所有数据点。我们应该对每分钟的值求和吗?我在metrics.xml中有以下内容

  • 我试图通过使用基于索引的行位置简单地获得df的子集。但是,出于某些原因,以下代码有时返回空数据帧: dist数据帧(帧是索引): 输出: 我一辈子都不明白为什么会发生这种事。

  • 本文向大家介绍C++写注册表项实例,包括了C++写注册表项实例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C++写注册表实现开机启动的方法。分享给大家供大家参考。 具体实现方法如下: 希望本文所述对大家的C++程序设计有所帮助。