13

为了一个新的属性页安装到Active Directory管理单元,我需要写入的W2K8 R2(as documented by Microsoft如何在注册表写入密钥自己通过的TrustedInstaller

HKEY_LOCAL_MACHINE \ SOFTWARE \下面的注册表项微软\ MMC \ SnapIns {E355E538-1C2E-11D0-8C37-00C04FD8FE93} \ NodeTypes

这个密钥由一个名为的TrustedInstaller一个特殊的用户拥有。我在网路上发现了很多东西。

在这里的那一刻是它的工作原理做了以下(用户是管理员组的成员)的方式:

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

我的项目完全用C#编写,有两件事我不喜欢,就像我这样做。

  • 我使用InteropServices来调用Win32 AdjustTokenPrivileges API。有没有人知道在纯C#中做这件事的方法?
  • 在年底的TrustedInstaller不再是关键的主人,而我'不能给他的所有权,他保持了完全的控制,但我不希望我的安装卡扣后为损坏我的服务器分类-在。

所以我的问题是:我是否错过了一些东西,是否有文件记录的方式来修改这种记录为可修改的关键?

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

在此先感谢。

回答

5

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

当您想要获取您添加的资源以启用SeTakeOwnershipPrivilege时,您可以更改拥有者SID。但新的Owner 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的代码。

+0

+1,SeRestorePrivilege是一颗宝石。 – ongle 2014-05-19 03:53:09

+0

您有任何博客文章或示例代码吗?我一直试图让这个工作几个小时。 – Laoujin 2014-06-22 23:44:29

+1

@Lououjin我最终把代码放在Gist上,我希望它能帮上忙。 – JPBlanc 2014-06-23 09:01:23

3

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

编辑:看来你是想要在一个Windows的保护制度下一个注册表项来写。在这种情况下,TrustedInstaller帐户无关紧要。

基本上,一个普通MSI不能在关键,因为它是由Windows保护写。您将需要找到另一种安装属性页的方法。

+0

我尝试使用Visual Studio 10中的“部署安装项目”生成的MSI的注册表项来执行此操作。我要重试,但在第一次测试中,它不起作用。我是否必须用Orca在桌子上指定一些特别的东西? – JPBlanc 2011-03-29 16:48:55

+0

所以我再次测试它。这里是我的MSI'的注册表表_2D2C089689924663A0BDAAE6CFE4E160 2个软件\微软\ MMC \ SnapIns \ {E355E538-1C2E-11D0-8C37-00C04FD8FE93} \ NodeTypes \ {3bcd9db8-f84b-451C-952f-6c52b81f9ec6} * C__2D2C089689924663A0BDAAE6CFE4E160' 你确定你的断言? – JPBlanc 2011-03-29 19:25:25

+0

安装过程中会发生什么?您是否创建了一个日志来查看注册表项的处理方式? – 2011-03-30 06:52:09

3

如果运行程序作为管理员(不要忘记启用'requireAdministrator'在清单中的UAC执行水平),或具有SE_RESTORE_NAME特权可以enable the privilage然后用RegCreateKeyExREG_OPTION_BACKUP_RESTORE标志的任何其他用户。您可以使用相同的标志RegOpenKeyEx(见ulOptions参数),但它是无证,我会建议你最好使用RegCreateKeyEx代替。例如,返回的关键句柄可用于设置RegSetValueEx的值。 以这种方式您将能够设置任何注册表项。如果您另外启用SE_BACKUP_NAME权限,则您将能够读取任何注册表项(例如,从HKEY_LOCAL_MACHINE\SECURITYHKEY_LOCAL_MACHINE\SAM\SAM)。