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

时间:2011-03-29 04:31:38

标签: c# windows-installer registry windows-server-2008-r2 windows-security

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

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

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

此时此处的工作方式如下(用户是管理员组的成员):

  1. 我授予用户获得所有权的权利。
  2. 用户取得所有权
  3. 用户编写注册表
  4. 用户授予管理员组的所有权。
  5. 我的项目是用C#编写的,有两件事我不喜欢这样做。

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

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

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

    提前致谢。

3 个答案:

答案 0 :(得分:5)

所以我找到了我的一个问题。

如果您想要对添加的资源取得所有权以启用 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。
  5. 我使用InteropServices来调用Win32 AdjustTokenPrivileges API,它似乎是在C#中实现它的唯一方法

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


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

答案 1 :(得分:3)

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

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

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

答案 2 :(得分:3)

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