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。
要做到這一點的很好的方式,你需要啓用SeTakeOwnershipPrivilege,然後打開WRITE_OWNER訪問的關鍵。我不知道是否有.NET API允許您選擇訪問模式,但如果有必要,您應該能夠調用RegOpenKeyEx。 – 2014-09-21 23:28:01
或者,如果您啓用了備份和還原權限,它會告訴Windows忽略當前權限,因此在打開密鑰時無需執行任何特殊操作。 – 2014-09-21 23:29:16
@HarryJohnston,謝謝你再次回覆。我會試一試。 「 – Linyes 2014-09-21 23:48:26