代码之家  ›  专栏  ›  技术社区  ›  JCCyC

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

  •  7
  • JCCyC  · 技术社区  · 17 年前

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

    GetBinaryValue
    GetDWORDValue
    GetExpandedStringValue
    GetMultiStringValue
    GetStringValue
    

    如果我只知道一个值是配置单元、键和值名称,那么我不想尝试全部五种方法。有办法吗?我正在使用wmi,但是如果唯一的方法是使用advapi32.dll方法,我可以接受它。

    2 回复  |  直到 16 年前
        1
  •  10
  •   Helen    17 年前

    你可以使用 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", inParams, null);
    
                            if (Convert.ToUInt32(outParams["ReturnValue"]) == 0)
                            {
                                oValue = outParams["sValue"];
                            }
                            else
                            {
                                // GetExpandedStringValue call failed
                            }
                            break;
    
                        case RegType.REG_MULTI_SZ:
                            outParams = mc.InvokeMethod("GetMultiStringValue", inParams, null);
    
                            if (Convert.ToUInt32(outParams["ReturnValue"]) == 0)
                            {
                                oValue = outParams["sValue"];
                            }
                            else
                            {
                                // GetMultiStringValue call failed
                            }
                            break;
    
                        case RegType.REG_DWORD:
                            outParams = mc.InvokeMethod("GetDWORDValue", inParams, null);
    
                            if (Convert.ToUInt32(outParams["ReturnValue"]) == 0)
                            {
                                oValue = outParams["uValue"];
                            }
                            else
                            {
                                // GetDWORDValue call failed
                            }
                            break;
    
                        case RegType.REG_BINARY:
                            outParams = mc.InvokeMethod("GetBinaryValue", inParams, 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, RegHive hDefKey, string sSubKeyName, string sValueName)
                {
                    ManagementBaseObject inParams = mc.GetMethodParameters("EnumValues");
                    inParams["hDefKey"] = hDefKey;
                    inParams["sSubKeyName"] = sSubKeyName;
    
                    ManagementBaseObject outParams = mc.InvokeMethod("EnumValues", inParams, 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
                    }
                }
            }
        }
    
        2
  •  1
  •   Robert    17 年前