2009-07-20 7 views
7

Tùy thuộc vào những gì giá trị kiểu này được lưu giữ, tôi phải sử dụng một trong các phương pháp sau:Cách lấy giá trị đăng ký từ máy từ xa nếu tôi không biết loại của nó? (C#)

GetBinaryValue 
GetDWORDValue 
GetExpandedStringValue 
GetMultiStringValue 
GetStringValue 

tôi muốn không phải cố gắng tất cả năm nếu tất cả tôi biết về một giá trị là tổ ong , khóa và tên giá trị. Có cách nào làm được việc này không? Tôi đang sử dụng WMI, nhưng nếu cách duy nhất là bằng cách sử dụng phương pháp advapi32.dll, tôi mở cho điều đó.

Trả lời

10

Bạn có thể sử dụng phương thức StdRegProv.EnumValues để liệt kê các giá trị của khóa, tìm hiểu loại giá trị của bạn và xác định phương thức gọi Get.

Something như thế này (xin lỗi, tôi không biết C# cũng do đó, mã này có lẽ là xa hoàn hảo):

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 
       } 
      } 
     } 
    } 
+0

Ew. Xấu xí. Nhưng nó đã có tác dụng. Cảm ơn. – JCCyC

+0

có một số vấn đề, trong công cộng tĩnh RegType GetValueType (ManagementClass mc, RegHive hDefKey, chuỗi sSubKeyName, chuỗi sValueName), bạn bỏ lỡ một giá trị trả lại. – Jack