2014-09-21 88 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訪問