如何在TrustedInstaller拥有的注册表键中写入数据

14
为了将新的属性页安装到Active Directory SnapIn中,我需要写入W2K8 R2下面的以下注册表键(据Microsoft文档
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MMC\SnapIns{E355E538-1C2E-11D0-8C37-00C04FD8FE93}\NodeTypes
这个键由一个名为TrustedInstaller的特殊用户拥有。我在网络上发现了很多关于它的事情。
目前的做法是(用户是管理员组的成员):
1. 给用户赋予获取所有权的权限。 2. 用户获取所有权。 3. 用户写入注册表。 4. 用户将所有权交还给管理员组。
我的项目完全用C#编写,但有两件事我不喜欢:
1. 我使用InteropServices调用Win32 AdjustTokenPrivileges API。有人知道如何用纯C#做到这一点吗? 2. 最终,TrustedInstaller不再拥有该键的所有权,而我无法将所有权归还给他,他仍然保持完全控制,但我不希望在安装我的快照之后将我的服务器分类为已损坏。
所以我的问题是:我有什么遗漏吗?是否有一种记录的方法来修改这样的可修改键?

关于这个问题已经存在一个Stack Overflow的问题,答案表明TrustedInstaller所有权意味着该密钥是系统安装的一部分,而不是应用程序安装的一部分。对我来说,如果Microsoft文档说明如何修改密钥,则属于应用程序安装。

提前感谢。

3个回答

7
所以我找到了一个问题。
当您想要拥有一个资源时,您需要添加权限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上找到代码。

你有博客文章或范例代码吗?我已经尝试了几个小时,但还无法正常工作。 - Laoujin
1
@Laoujin,我终于把代码放到Gist上了,希望它能有所帮助。 - JPBlanc

3

如果您以管理员身份运行程序(不要忘记在清单中启用“requireAdministrator”作为UAC执行级别),或者任何具有“SE_RESTORE_NAME”特权的其他用户,您可以启用权限,然后使用带有REG_OPTION_BACKUP_RESTORE标志的RegCreateKeyEx。您可以在RegOpenKeyEx中使用相同的标志(请参见参数),但它是未记录的,我建议您最好使用RegCreateKeyEx。返回的键句柄可用于例如考虑RegSetValueEx来设置值。 通过这种方式,您将能够设置任何注册表键。如果您还启用了SE_BACKUP_NAME特权,则可以读取任何注册表键(例如从HKEY_LOCAL_MACHINE\SECURITYHKEY_LOCAL_MACHINE\SAM\SAM)。

3
如果您在MSI安装程序中使用注册表表,您应该可以毫无问题地编写条目。这是因为安装过程是在TrustedInstaller帐户下执行的(您不需要更改所有权)。
编辑:看起来您正在尝试编写位于Windows保护系统下的注册表键。在这种情况下,TrustedInstaller帐户并不重要。
基本上,普通的MSI无法写入该键,因为它受到Windows的保护。您需要找到另一种方法来安装属性页。

我尝试使用由Visual Studio 10中的“部署安装项目”生成的MSI的注册表项来完成它。我将重试,但在我的第一次测试中它没有起作用。我需要在Orca表格中指定特殊的内容吗? - JPBlanc
所以我再次进行了测试。这是我的MSI“_2D2C089689924663A0BDAAE6CFE4E160 2 Software\Microsoft\MMC\SnapIns{E355E538-1C2E-11D0-8C37-00C04FD8FE93}\NodeTypes{3bcd9db8-f84b-451c-952f-6c52b81f9ec6} * C__2D2C089689924663A0BDAAE6CFE4E160”的注册表表格。 你确定你的断言吗? - JPBlanc
安装过程中会发生什么?你创建了日志以查看注册表项的处理情况吗? - rmrrm
抱歉,我不知道如何创建MSI安装的日志。 - JPBlanc
谢谢Cosmin,这是结果:WriteRegistryValues: 键:\Software\Microsoft\MMC\SnapIns{E355E538-1C2E-11D0-8C37-00C04FD8FE93}\NodeTypes{3bcd9db8-f84b-451c-952f-6c52b81f9ec6},名称:,值:MSI (s) (28:F0) [16:38:30:109]: SFC:由于Windows保护,无法创建以下键:\Software\Microsoft\MMC\SnapIns{E355E538-1C2E-11D0-8C37-00C04FD8FE93}\NodeTypes{3bcd9db8-f84b-451c-952f-6c52b81f9ec6}。我以完全管理员权限执行。 - JPBlanc
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接