Я пытаюсь вызвать эту функцию, чтобы взять владельца за ключ.
[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 для ключа, я получаю сообщение об ошибке. У вас нет разрешения на просмотр текущих настроек разрешения, но вы можете вносить изменения в разрешения.
У меня даже нет разрешения на чтение ключа. Тогда метод, который я использовал для обработки, не удался с несанкционированной ошибкой.
Как я могу получить ключ к ключу в этом случае? Собственно, regedit может это сделать. Поэтому я думаю, что API может это сделать. Но я не знаю, какой API для вызова.
@HarryJohnston получил правильное решение.