根据存储的值类型,我必须使用以下方法之一:
GetBinaryValue
GetDWORDValue
GetExpandedStringValue
GetMultiStringValue
GetStringValue

如果我所知道的值是hive,key和value name,我不想尝试所有五个.有没有办法做到这一点?我正在使用WMI,但如果唯一的方法是使用advapi32.dll方法,我对此持开放态度.

您可以使用 StdRegProv.EnumValues方法枚举键的值,找出值的类型并确定要调用的Get方法.

这样的事情(抱歉,我不太了解C#所以这段代码可能远非完美):

using System;
    using System.Management;
    using System.Management.Instrumentation;

    namespace ConsoleApplication1
    {
        public enum RegHive : uint
        {
            HKEY_CLASSES_ROOT = 0x80000000,HKEY_CURRENT_USER = 0x80000001,HKEY_LOCAL_MACHINE = 0x80000002,HKEY_USERS = 0x80000003,HKEY_CURRENT_CONfig = 0x80000005
        }

        public enum RegType
        {
            REG_SZ = 1,REG_EXPAND_SZ,REG_BINARY,REG_DWORD,REG_MULTI_SZ = 7
        }

        class Program
        {
            static void Main(string[] args)
            {
                const string strComputer = "computername";

                Connectionoptions options = new Connectionoptions();
                options.Impersonation = ImpersonationLevel.Impersonate;
                options.EnablePrivileges = true;
                options.Username = "username";
                options.Password = "password";

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

                object ovalue = GetValue(mc,RegHive.HKEY_LOCAL_MACHINE,"SOFTWARE\\Microsoft\\Windows\\CurrentVersion","ProgramFilesDir");
                Console.WriteLine(ovalue.ToString());
            }

            public static object GetValue(ManagementClass mc,RegHive hDefKey,string sSubKeyName,string sValueName)
            {
                RegType rType = GetValueType(mc,hDefKey,sSubKeyName,sValueName);

                ManagementBaSEObject inParams = mc.getmethodParameters("GetStringValue");
                inParams["hDefKey"] = hDefKey;
                inParams["sSubKeyName"] = sSubKeyName;
                inParams["sValueName"] = sValueName;

                object ovalue = null;

                switch (rType)
                {
                    case RegType.REG_SZ:
                        ManagementBaSEObject outParams = mc.InvokeMethod("GetStringValue",inParams,null);

                        if (Convert.ToUInt32(outParams["ReturnValue"]) == 0)
                        {
                            ovalue = outParams["sValue"];
                        }
                        else
                        {
                            // GetStringValue call Failed
                        }
                        break;

                    case RegType.REG_EXPAND_SZ:
                        outParams = mc.InvokeMethod("GetExpandedStringValue",null);

                        if (Convert.ToUInt32(outParams["ReturnValue"]) == 0)
                        {
                            ovalue = outParams["sValue"];
                        }
                        else
                        {
                            // GetExpandedStringValue call Failed
                        }
                        break;

                    case RegType.REG_MULTI_SZ:
                        outParams = mc.InvokeMethod("GetMultiStringValue",null);

                        if (Convert.ToUInt32(outParams["ReturnValue"]) == 0)
                        {
                            ovalue = outParams["sValue"];
                        }
                        else
                        {
                            // GetMultiStringValue call Failed
                        }
                        break;

                    case RegType.REG_DWORD:
                        outParams = mc.InvokeMethod("GetDWORDValue",null);

                        if (Convert.ToUInt32(outParams["ReturnValue"]) == 0)
                        {
                            ovalue = outParams["uValue"];
                        }
                        else
                        {
                            // GetDWORDValue call Failed
                        }
                        break;

                    case RegType.REG_BINARY:
                        outParams = mc.InvokeMethod("GetBinaryValue",null);

                        if (Convert.ToUInt32(outParams["ReturnValue"]) == 0)
                        {
                            ovalue = outParams["uValue"] as byte[];
                        }
                        else
                        {
                            // GetBinaryValue call Failed
                        }
                        break;
                }

                return ovalue;
            }

            public static RegType GetValueType(ManagementClass mc,string sValueName)
            {
                ManagementBaSEObject inParams = mc.getmethodParameters("EnumValues");
                inParams["hDefKey"] = hDefKey;
                inParams["sSubKeyName"] = sSubKeyName;

                ManagementBaSEObject outParams = mc.InvokeMethod("EnumValues",null);

                if (Convert.ToUInt32(outParams["ReturnValue"]) == 0)
                {
                    string[] sNames = outParams["sNames"] as String[];
                    int[] iTypes = outParams["Types"] as int[];

                    for (int i = 0; i < sNames.Length; i++)
                    {
                        if (sNames[i] == sValueName)
                        {
                            return (RegType)iTypes[i];
                        }
                    }
                    // value not found
                }
                else
                {
                    // EnumValues call Failed
                }
            }
        }
    }

如果我不知道它的类型,如何从远程计算机获取注册表值? (C#)的更多相关文章

  1. Node.JS更改Windows注册表Regedit的方法小结

    注册表是windows操作系统中的一个核心数据库,这里介绍一些通过node.js操作注册表的几种方法,感兴趣的朋友参考下吧

  2. 自动化测试读写64位操作系统的注册表

    本文主要介绍自动化测试读写64位操作系统的注册表,这里提供详细的教程来实现自动化读写64位操作系统的注册表,希望能帮助测试软件的朋友,有兴趣的小伙伴可以参考下

  3. python读取Windows注册表的示例代码

    本文主要介绍了python读取Windows注册表的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  4. 如何在Windows 10中安装.NET 4 Framework

    如何在Windows10中安装.NET4.0Framework?.NET4.6已经安装但我想拥有.NET4Framework(不修改注册表).在控制面板中打开和关闭Windows功能没有任何效果.从thedownloadpage开始,用于“Microsoft.NETFramework4.6”(强调我的):TheMicrosoft.NETFramework4.6isahighlycompatible

  5. 修复时,Wix安装程序会清除注册表设置

    目前我已经定制了Wix_InstallDirDlg以使用户能够在安装时设置注册表项.在InstallDirDlg和MaintenanceTypeDlg之后会显示一个自定义对话框,以便它适合安装和修复方案.自定义对话框具有链接到属性的单个文本框.此属性具有注册表搜索,以便在用户修复或升级时保留先前的值,并因此显示在自定义对话框中以供用户验证.该对话框在安装时工作正常,并创建了注册表项.但是,在修复时,将显示自定义对话框,并输入正确的注册表值,但修复完成后,键值为空.我做错了什么?

  6. Windows将凭据传播到Java桌面应用程序

    是否可以使用凭证.我在这里搜索的是不应用单个登录,但单点登录将是MSWindows登录窗口的登录.这可能吗?我理解Windows中的安全性也很重要,但是有没有办法获得令牌并在其他一些身份验证机制中使用它?

  7. 为什么RMI注册表忽略了java.rmi.server.codebase属性

    我正在为javaRMI运行HelloWorld示例1)我在一个空文件夹中运行注册表2)我启动HTTP服务器以在运行时检索类.download文件夹包含客户端–服务器的远程接口3)我按照javaRMI教程的建议启动服务器传递java.rmi.server.codebase属性RMI注册表未联系HTTP服务器并抛出异常(请参阅问题后的详细信息).但如果我做以下事情1)使用java.rmi.server

  8. windows-installer – 卸载软件时如何删除HKCU注册表项?

    当我的软件通过MSI安装时,它会在HKLM中创建一些注册表项.当人们使用该软件时,他们的个人偏好被保存到HKCU.卸载软件时,HKLM和HKCU注册表项将被删除,但我认为只有正在运行卸载的用户的HKCU密钥才会被删除.它是否正确?

  9. 如果我不知道它的类型,如何从远程计算机获取注册表值? (C#)

    根据存储的值类型,我必须使用以下方法之一:如果我所知道的值是hive,key和valuename,我不想尝试所有五个.有没有办法做到这一点?

  10. typescript – 收集修饰的类(没有注册表类)

    我会使用IoC容器.TypeScript的一个不错的是Inversify.这将允许这样的事情:但这确实意味着你必须自己做绑定:但是,如果你真的想让事件自动注册,我想你可以简单地将容器导入装饰器并在那里进行绑定.

随机推荐

  1. static – 在页面之间共享数据的最佳实践

    我想知道在UWP的页面之间发送像’selectedItem’等变量的最佳做法是什么?创建一个每个页面都知道的静态全局变量类是一个好主意吗?

  2. .net – 为Windows窗体控件提供百分比宽度/高度

    WindowsForm开发的新手,但在Web开发方面经验丰富.有没有办法为Windows窗体控件指定百分比宽度/高度,以便在用户调整窗口大小时扩展/缩小?当窗口调整大小时,可以编写代码来改变控件的宽度/高度,但我希望有更好的方法,比如在HTML/CSS中.在那儿?

  3. 使用Windows Azure查询表存储数据

    我需要使用特定帐户吗?>将应用程序部署到Azure服务后,如何查询数据?GoogleAppEngine有一个数据查看器/查询工具,Azure有类似的东西吗?>您可以看到的sqlExpressintance仅在开发结构中,并且一旦您表示没有等效,所以请小心使用它.>您可以尝试使用Linqpad查询表格.看看JamieThomson的thispost.

  4. windows – SetupDiGetClassDevs是否与文档中的设备实例ID一起使用?

    有没有更好的方法可以使用DBT_DEVICEARRIVAL事件中的数据获取设备的更多信息?您似乎必须指定DIGCF_ALLCLASSES标志以查找与给定设备实例ID匹配的所有类,或者指定ClassGuid并使用DIGCF_DEFAULT标志.这对我有用:带输出:

  5. Windows Live ID是OpenID提供商吗?

    不,WindowsLiveID不是OpenID提供商.他们使用专有协议.自从他们的“测试版”期结束以来,他们从未宣布计划继续它.

  6. 如果我在代码中进行了更改,是否需要重新安装Windows服务?

    我写了一个Windows服务并安装它.现在我对代码进行了一些更改并重新构建了解决方案.我还应该重新安装服务吗?不,只需停止它,替换文件,然后重新启动它.

  7. 带有双引号的字符串回显使用Windows批处理输出文件

    我正在尝试使用Windows批处理文件重写配置文件.我循环遍历文件的行并查找我想要用指定的新行替换的行.我有一个’函数’将行写入文件问题是%Text%是一个嵌入双引号的字符串.然后失败了.可能还有其他角色也会导致失败.如何才能使用配置文件中的所有文本?尝试将所有“在文本中替换为^”.^是转义字符,因此“将被视为常规字符你可以尝试以下方法:其他可能导致错误的字符是:

  8. .net – 将控制台应用程序转换为服务?

    我正在寻找不同的优势/劣势,将我们长期使用的控制台应用程序转换为Windows服务.我们为ActiveMQ使用了一个叫做java服务包装器的东西,我相信人们告诉我你可以用它包装任何东西.这并不是说你应该用它包装任何东西;我们遇到了这个问题.控制台应用程序是一个.NET控制台应用程序,默认情况下会将大量信息记录到控制台,尽管这是可配置的.任何推荐?我们应该在VisualStudio中将其重建为服务吗?我使用“-install”/“-uninstall”开关执行此操作.例如,seehere.

  9. windows – 捕获外部程序的STDOUT和STDERR *同时*它正在执行(Ruby)

    哦,我在Windows上:-(实际上,它比我想象的要简单,这看起来很完美:…是的,它适用于Windows!

  10. windows – 当我试图批量打印变量时,为什么我得到“Echo is on”

    我想要执行一个简单的批处理文件脚本:当我在XP中运行时,它给了我预期的输出,但是当我在Vista或Windows7中运行它时,我在尝试打印值时得到“EchoisOn”.以下是程序的输出:摆脱集合表达式中的空格.等号(=)的两侧可以并且应该没有空格BTW:我通常在@echo关闭的情况下启动所有批处理文件,并以@echo结束它们,所以我可以避免将代码与批处理文件的输出混合.它只是使您的批处理文件输出更好,更清洁.

返回
顶部