Как записать в ключ реестра, принадлежащий TrustedInstaller - PullRequest
13 голосов
/ 29 марта 2011

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

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

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

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

  1. Я даю пользователю право вступать во владение.
  2. Пользователь становится владельцем
  3. Пользователь пишет реестр
  4. пользователь передает права на группу администраторов.

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

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

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

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

Заранее спасибо.

Ответы [ 3 ]

6 голосов
/ 24 мая 2011

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

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

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

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

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

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


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

3 голосов
/ 02 мая 2011

Если вы запускаете программу от имени администратора (не забудьте включить '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).

3 голосов
/ 29 марта 2011

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

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

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

...