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