2014-09-21 41 views
1

我试图调用此函数为拥有者输入密钥。如何获取注册表项的句柄,甚至没有读取权限

[DllImport("Advapi32.dll", CharSet = CharSet.Auto)] 
public extern static int SetSecurityInfo(IntPtr hKeySrc, SE_OBJECT_TYPE lpSubKey, SECURITY_INFORMATION securityInfo, IntPtr psidOwner, IntPtr psidGroup, IntPtr pDacl, IntPtr pSacl); 

但是,要调用这个函数,我首先需要一个关键句柄(IntPtr hKeysrc)。在我使用这些函数来获取句柄之前。

RegistryKey key = root.OpenSubKey(keyName); 

private static IntPtr GetRegistryKeyHandle(RegistryKey registryKey) 
    { 
     IntPtr ret = IntPtr.Zero; 
     try 
     { 
      Type registryKeyType = typeof(RegistryKey); 

      System.Reflection.FieldInfo fieldInfo = 
      registryKeyType.GetField("hkey", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance); 

      SafeHandle handle = (SafeHandle) fieldInfo.GetValue(registryKey); 
      ret = handle.DangerousGetHandle(); 
     } 
     catch (Exception ex) 
     { 
      LogError("GetRegistryKeyHandle ERROR:" + ex.ToString()); 
     } 
     return ret; 
    } 

但是现在我所定位的关键字只有系统帐户权限!

当我尝试打开注册表中的密钥权限时,出现错误 您没有权限查看当前的权限设置,但可以进行权限更改。

我甚至没有读取关键的权限。然后,我用来处理的方法将失败,出现未经授权的错误。

如何在这种情况下获得钥匙的手柄?其实,regedit可以做到。所以我认为可能有API可以做到。但我不知道要调用哪个API。

+0

要做到这一点的很好的方式,你需要启用SeTakeOwnershipPrivilege,然后打开WRITE_OWNER访问的关键。我不知道是否有.NET API允许您选择访问模式,但如果有必要,您应该能够调用RegOpenKeyEx。 – 2014-09-21 23:28:01

+0

或者,如果您启用了备份和还原权限,它会告诉Windows忽略当前权限,因此在打开密钥时无需执行任何特殊操作。 – 2014-09-21 23:29:16

+0

@HarryJohnston,谢谢你再次回复。我会试一试。 “ – Linyes 2014-09-21 23:48:26

回答

0

@HarryJohnston找到了正确的解决方案。

  1. 启用SeTakeOwnershipPrivilege
  2. 打开键WRITE_OWNER访问