2009-07-20 2 views
7

किस मान प्रकार को संग्रहीत किया जाता है, इस पर निर्भर करता है कि मुझे निम्न विधियों में से एक का उपयोग करना होगा:रिमोट मशीन से रजिस्ट्री मान कैसे प्राप्त करें यदि मुझे इसका प्रकार पता नहीं है? (सी#)

GetBinaryValue 
GetDWORDValue 
GetExpandedStringValue 
GetMultiStringValue 
GetStringValue 

मुझे सभी पांचों को आजमाने की ज़रूरत नहीं है यदि मुझे किसी मूल्य के बारे में पता है तो हाइव, कुंजी, और मूल्य का नाम। क्या ऐसा करने के लिए कोई रास्ता है? मैं डब्लूएमआई का उपयोग कर रहा हूं, लेकिन अगर एकमात्र तरीका advapi32.dll विधि का उपयोग कर रहा है, तो मैं इसके लिए खुला हूं।

उत्तर

10

आप कुंजी के मानों को समझने के लिए StdRegProv.EnumValues विधि का उपयोग कर सकते हैं, अपने मूल्य के प्रकार का पता लगा सकते हैं और यह निर्धारित कर सकते हैं कि Get कॉल करने का तरीका कौन सा है।

कुछ इस तरह (क्षमा करें, मैं सी # पता नहीं है अच्छी तरह से तो यह कोड शायद सही से दूर है):

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

ईडब्ल्यू। बदसूरत। लेकिन यह काम करता है। धन्यवाद। – JCCyC

+0

सार्वजनिक स्थिर RegType GetValueType (प्रबंधन क्लास एमसी, RegHive एचडीएफके, स्ट्रिंग sSubKeyName, स्ट्रिंग sValueName) में कुछ समस्या है, आप एक वापसी मूल्य याद आती है। – Jack

1

OpenRemoteBaseKey, और फिर GetValue() के बारे में कैसे? http://msdn.microsoft.com/en-us/library/8zha3xws(VS.100).aspx

+3

मुझे लगता है कि करने के लिए उपलब्धियों को किस प्रकार से पारित करते हैं? मैं इसे ऐसी मशीन से कॉल कर सकता हूं जो एक ही डोमेन पर नहीं है, या अपर्याप्त अधिकार वाले उपयोगकर्ता के रूप में runniong है। – JCCyC

संबंधित मुद्दे