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

为了将新的属性页安装到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记录了如何修改它的应用程序安装的密钥。

提前致谢。

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

如果要对添加的资源取得所有权以启用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上找到代码。

如果在MSI安装程序中使用Registry表 ,则应该能够毫无问题地编写该条目。 这是因为安装过程是在TrustedInstaller帐户下执行的(您不需要更改所有权)。

编辑:您似乎正在尝试写入Windows保护系统下的注册表项。 在这种情况下,TrustedInstaller帐户无关紧要。

基本上,常规MSI无法写入该密钥,因为它受Windows保护。 您需要找到另一种安装属性页的方法。

如果您以管理员身份运行程序(不要忘记在清单中启用'requireAdministrator'作为UAC执行级别)或任何其他具有SE_RESTORE_NAME权限的用户,您可以启用权限,然后将RegCreateKeyEx与REG_OPTION_BACKUP_RESTORE标志一起使用。 您可以在RegOpenKeyEx中使用相同的标志(请参阅ulOptions参数),但它没有记录,我建议您最好使用RegCreateKeyEx 。 返回的键句柄可用于设置RegSetValueEx的值,例如。 在这种方式下,您将能够设置任何注册表项 。 如果您另外启用了SE_BACKUP_NAME权限,则可以读取任何注册表项(例如,从HKEY_LOCAL_MACHINE\SECURITYHKEY_LOCAL_MACHINE\SAM\SAM )。