Как написать в разделе реестра собственный TrustedInstaller

Чтобы установить новую страницу свойств в Active Directory SnapIn, мне нужно записать в следующий раздел реестра W2K8 R2 (как описано в Microsoft)

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MMC\SnapIns {E355E538-1C2E-11D0-8C37-00C04FD8FE93}\NodeTypes

Этот ключ принадлежит специальному пользователю с именем TrustedInstaller. Я нашел много вещей на NET arround, что.

В настоящий момент это способ, которым он работает, делая следующее (пользователь входит в группу администратора):

  • Я предоставляю пользователю привилегию взять на себя ответственность.
  • Пользователь получает право собственности
  • Пользователь записывает реестр
  • пользователь предоставляет право собственности группе администраторов.

Мой проект полностью написан на С#, и есть две вещи, которые мне не нравятся в том, как я это делаю.

  • Я использую InteropServices для вызова API Win32 AdjustTokenPrivileges. Кто-нибудь знает способ сделать это в чистом С#?
  • В конце TrustedInstaller больше не является владельцем ключа, и я не могу дать ему права собственности, он держит полный контроль, но я не хочу, чтобы мой сервер классифицировался как поврежденный после установки моей привязки -в.

Итак, мой вопрос: я что-то пропустил, есть ли документальный способ модифицировать такой ключ, который документируется как изменяемый?

Существует вопрос о переполнении стека, ответ говорит, что доверие TrustedInstaller означает, что ключ является частью установки системы, а не установки приложения. Для меня, если Microsoft документирует, как изменить ключ, это установка приложения.

Спасибо заранее.

Ответы

Ответ 1

Итак, я нашел одну из моих проблем.

Если вы хотите получить право собственности на ресурс, который вы добавляете для включения SeTakeOwnershipPrivilege, это позволит вам изменить SID владельца. Но новый владелец Sid должен быть в токене звонящего, плюс, что у Sid должен быть атрибут SE_GROUP_OWNER. Поэтому в моем случае я не смог изменить владельца SID на S-1-5-80-956008885-3418522649-1831038044-1853292631-2271478464 (TrustedInstaller). Я просто смог взять на себя ответственность или передать права собственности группе "Администраторы". Я обнаружил, что есть король работы, в котором вы можете назначить любого произвольного пользователя в качестве владельца, даже если его SID не находится в токене. привилегия SeRestorePrivilege, предоставляемая администраторам и операциям резервного копирования, но НЕ включена по умолчанию. Enbling это позволяет мне вернуть права на TrustedInstaller.

Итак, он работает, делая следующее (пользователь входит в группу администратора):

  • Я даю пользователю привилегию взять собственность и включить привилегию восстановления
  • Пользователь получает право собственности
  • Пользователь записывает реестр
  • пользователь передает права собственности предыдущему владельцу TrustedInstaller.

Я использую InteropServices для вызова API Win32 AdjustTokenPrivileges, и, похоже, это единственный способ сделать это в С#

В скором времени я опубликую на своем блоге небольшой инструмент, который позволит вернуть собственность TrustedInstaller.


Отредактировано: Извините за задержку, я просто забыл об этом, вы можете найти код на Gist.

Ответ 2

Если вы используете Таблица реестра в установщике MSI, вы можете написать запись без проблем. Это связано с тем, что процесс установки выполняется под учетной записью TrustedInstaller (вам не нужно менять право собственности).

Изменить: Кажется, что вы пытаетесь записать в раздел реестра, который находится под системой защиты Windows. В этом случае учетная запись TrustedInstaller не имеет значения.

В принципе, обычный MSI не может писать в этом ключе, потому что он защищен Windows. Вам нужно будет найти другой подход для установки страницы свойств.

Ответ 3

Если вы запустите программу в качестве администратора (не забудьте включить 'requireAdministrator' в качестве уровня выполнения UAC в манифесте) или любого другого пользователя, имеющего SE_RESTORE_NAME привилегию, вы можете включить привилегию, а затем использовать RegCreateKeyEx с флагом REG_OPTION_BACKUP_RESTORE. Вы можете использовать тот же флаг в RegOpenKeyEx (см. Параметр ulOptions), но он недокументирован, и я бы рекомендовал вам лучше использовать RegCreateKeyEx. Возвращенный ключевой дескриптор может использоваться, например, для установки значения в отношении RegSetValueEx. В том, как вы сможете установить любой раздел реестра. Если вы дополнительно включите привилегию SE_BACKUP_NAME, вы сможете прочитать любой раздел реестра (например, от HKEY_LOCAL_MACHINE\SECURITY или HKEY_LOCAL_MACHINE\SAM\SAM).