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