如何在TrustedInstaller中编写自己的注册表项

JPB*_*anc 13 c# registry windows-installer windows-security windows-server-2008-r2

为了将新的属性页安装到Active Directory SnapIn中,我需要写入W2K8 R2的以下注册表项(如Microsoft所述)

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

此密钥由名为TrustedInstaller的特殊用户拥有.我在NET arround上发现了很多东西.

目前,这是它的工作方式,执行以下操作(用户是管理员组的成员):

  1. 我授予用户获得所有权的权限.
  2. 用户取得所有权
  3. 用户编写注册表
  4. 用户授予管理员组的所有权.

我的项目是用C#完整编写的,有两件事我不喜欢这样做.

  • 我使用InteropServices来调用Win32 AdjustTokenPrivileges API.有没有人知道在纯C#中这样做的方法?
  • 最后TrustedInstaller不再是密钥的所有者,而且我无法给予他所有权,他保持完全控制权,但我不希望我的服务器在安装我的管理单元后被归类为已损坏.

所以我的问题是:我是否遗漏了某些东西,是否有记录的方法来修改这样一个被记录为可修改的密钥?

有一个Stack溢出问题存在,答案说TrustedInstaller所有权,意味着密钥是系统安装的一部分而不是应用程序安装.对我来说,如果Microsoft记录了如何修改它的应用程序安装的密钥.

提前致谢.

JPB*_*anc 6

所以我发现了我的一个问题.

如果要对添加的资源取得所有权以启用SeTakeOwnershipPrivilege,则允许您更改所有者SID.但是新的所有者Sid必须在调用者的令牌中,此外,Sid必须具有属性SE_GROUP_OWNER.所以在我的情况下,我无法将SID所有者更改为S-1-5-80-956008885-3418522649-1831038044-1853292631-2271478464(TrustedInstaller).我只能取得所有权,或者为"管理员"组提供所有权.我发现有一个解决方法之王可以将任意用户分配为所有者,即使其SID不在令牌中也是如此.授予管理员和备份操作员的SeRestorePrivilege权限,但默认情况下未启用.Enbling允许我将所有权归还给TrustedInstaller.

所以它可以执行以下操作(用户是管理员组的成员):

  1. 我授予用户获取所有权并启用还原权限的权限
  2. 用户取得所有权
  3. 用户编写注册表
  4. 用户授予前一个所有者TrustedInstaller的所有权.

我使用InteropServices来调用Win32 AdjustTokenPrivileges API,它似乎是在C#中实现它的唯一方法

我将很快在我的博客上发布一个小工具,允许将所有权归还给TrustedInstaller.


编辑:对不起,我忘记了,您可以在Gist上找到代码.