Как получить дескриптор ключа реестра даже без разрешения на чтение

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 для ключа, я получаю сообщение об ошибке. У вас нет разрешения на просмотр текущих настроек разрешения, но вы можете вносить изменения в разрешения.

У меня даже нет разрешения на чтение ключа. Тогда метод, который я использовал для обработки, не удался с несанкционированной ошибкой.

Как я могу получить ключ к ключу в этом случае? Собственно, regedit может это сделать. Поэтому я думаю, что API может это сделать. Но я не знаю, какой API для вызова.

  • 0
    Для этого вам нужно включить SeTakeOwnershipPrivilege, а затем открыть ключ для доступа WRITE_OWNER. Я не знаю, есть ли .NET API, который позволяет вам выбирать режим доступа, но вы должны иметь возможность p / invoke RegOpenKeyEx, если это необходимо.
  • 0
    В качестве альтернативы, если вы включите полномочия резервного копирования и восстановления, это скажет Windows игнорировать текущие разрешения, поэтому вам не нужно делать ничего особенного при открытии ключа.
Показать ещё 3 комментария
Теги:
registry

1 ответ

0
Лучший ответ

@HarryJohnston получил правильное решение.

  1. Включить SeTakeOwnershipPrivilege
  2. Откройте ключ для доступа WRITE_OWNER

Ещё вопросы

Сообщество Overcoder
Наверх
Меню