2010-05-13 2 views
3

지금까지 내가있는 아래는 .net에서 레지스트리 휘발성 하위 키를 만드는 쉬운 방법이 있습니까?

http://www.danielmoth.com/Blog/volatile-registrykey.aspx 작동하지만 아주 못생긴

public static class RegistryHelper 
{ 
    public static RegistryKey CreateVolatileSubKey(RegistryKey rk, string subkey, RegistryKeyPermissionCheck permissionCheck) 
    { 
     var rk2 = rk.GetType(); 
     const BindingFlags bfStatic = BindingFlags.NonPublic | BindingFlags.Static; 
     const BindingFlags bfInstance = BindingFlags.NonPublic | BindingFlags.Instance; 
     rk2.GetMethod("ValidateKeyName", bfStatic).Invoke(null, new object[] { subkey }); 
     rk2.GetMethod("ValidateKeyMode", bfStatic).Invoke(null, new object[] { permissionCheck }); 
     rk2.GetMethod("EnsureWriteable", bfInstance).Invoke(rk, null); 

     subkey = (string)rk2.GetMethod("FixupName", bfStatic).Invoke(null, new object[] { subkey }); 
     if (!(bool)rk2.GetField("remoteKey", bfInstance).GetValue(rk)) 
     { 
      var key = (RegistryKey)rk2.GetMethod("InternalOpenSubKey", bfInstance, null, new[] { typeof(string), typeof(bool) }, null).Invoke(rk, new object[] { subkey, permissionCheck != RegistryKeyPermissionCheck.ReadSubTree }); 
      if (key != null) 
      { 
       rk2.GetMethod("CheckSubKeyWritePermission", bfInstance).Invoke(rk, new object[] { subkey }); 
       rk2.GetMethod("CheckSubTreePermission", bfInstance).Invoke(rk, new object[] { subkey, permissionCheck }); 
       rk2.GetField("checkMode", bfInstance).SetValue(key, permissionCheck); 
       return key; 
      } 
     } 
     rk2.GetMethod("CheckSubKeyCreatePermission", bfInstance).Invoke(rk, new object[] { subkey }); 

     int lpdwDisposition; 
     IntPtr hkResult; 

     var srh = Type.GetType("Microsoft.Win32.SafeHandles.SafeRegistryHandle"); 
     var temp = rk2.GetField("hkey", bfInstance).GetValue(rk); 
     var rkhkey = (SafeHandleZeroOrMinusOneIsInvalid)temp; 

     var getregistrykeyaccess = (int)rk2.GetMethod("GetRegistryKeyAccess", bfStatic, null, new[] { typeof(bool) }, null).Invoke(null, new object[] { permissionCheck != RegistryKeyPermissionCheck.ReadSubTree }); 
     var errorCode = RegCreateKeyEx(rkhkey, subkey, 0, null, 1, getregistrykeyaccess, IntPtr.Zero, out hkResult, out lpdwDisposition); 
     var keyNameField = rk2.GetField("keyName", bfInstance); 
     var rkkeyName = (string)keyNameField.GetValue(rk); 

     if (errorCode == 0 && hkResult.ToInt32() > 0) 
     { 
      var rkremoteKey = (bool)rk2.GetField("remoteKey", bfInstance).GetValue(rk); 
      var hkResult2 = srh.GetConstructor(BindingFlags.Instance | BindingFlags.NonPublic, null, new[] { typeof(IntPtr), typeof(bool) }, null).Invoke(new object[] { hkResult, true }); 
      var key2 = (RegistryKey)rk2.GetConstructor(BindingFlags.Instance | BindingFlags.NonPublic, null, new[] { hkResult2.GetType(), typeof(bool), typeof(bool), typeof(bool), typeof(bool) }, null).Invoke(new[] { hkResult2, permissionCheck != RegistryKeyPermissionCheck.ReadSubTree, false, rkremoteKey, false }); 
      rk2.GetMethod("CheckSubTreePermission", bfInstance).Invoke(rk, new object[] { subkey, permissionCheck }); 
      rk2.GetField("checkMode", bfInstance).SetValue(key2, permissionCheck); 
      if (subkey.Length == 0) 
      { 
       keyNameField.SetValue(key2, rkkeyName); 
      } 
      else 
      { 
       keyNameField.SetValue(key2, rkkeyName + @"\" + subkey); 
      } 
      key2.Close(); 
      return rk.OpenSubKey(subkey, true); 
     } 
     if (errorCode != 0) 
      rk2.GetMethod("Win32Error", bfInstance).Invoke(rk, new object[] { errorCode, rkkeyName + @"\" + subkey }); 
     return null; 
    } 

    [DllImport("advapi32.dll", CharSet = CharSet.Auto)] 
    private static extern int RegCreateKeyEx(SafeHandleZeroOrMinusOneIsInvalid hKey, string lpSubKey, int reserved, string lpClass, int dwOptions, int samDesigner, IntPtr lpSecurityAttributes, out IntPtr hkResult, out int lpdwDisposition); 
} 

에서 가져 있습니다. 더 좋은 방법이 있습니까?

답변

3

.NET 4를 사용하는 경우 새 RegistryOptions 열거 형을 사용하여 일반 .NET API를 사용하여 휘발성 키를 만들 수 있습니다.

관련 문제