2009-07-20 6 views
7

Selon le type valeur est stockée, je dois utiliser une des méthodes suivantes:Comment obtenir une valeur de registre à partir d'une machine distante si je ne connais pas son type? (C#)

GetBinaryValue 
GetDWORDValue 
GetExpandedStringValue 
GetMultiStringValue 
GetStringValue 

Je voudrais ne pas avoir à essayer tous les cinq si tout ce que je sais une valeur est la ruche , la clé et le nom de la valeur. Y-a-t-il un moyen de faire ça? J'utilise WMI, mais si la seule façon est en utilisant la méthode advapi32.dll, je suis ouvert à cela.

Répondre

10

Vous pouvez utiliser la méthode StdRegProv.EnumValues d'énumérer les valeurs de la clé, trouver le type de votre valeur et déterminer quelle Get méthode à appeler.

Quelque chose comme ça (désolé, je ne sais pas C#, si bien que ce code est probablement loin d'être parfait):

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. Laid. Mais ça fonctionne. Merci. – JCCyC

+0

il ya un problème, en statique RegType GetValueType statique (ManagementClass mc, RegHive hDefKey, chaîne sSubKeyName, chaîne sValueName), vous manquez une valeur de retour. – Jack

Questions connexes