13

为了将新的属性页安装到 Active Directory 管理单元中,我需要写入 W2K8 R2 的以下注册表项(由 Microsoft 记录

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

该密钥归一个名为TrustedInstaller的特殊用户所有。我在 NET 上发现了很多东西。

目前,它的工作方式如下(用户是管理员组的成员):

  1. 我赋予用户取得所有权的特权。
  2. 用户取得所有权
  3. 用户写注册表
  4. 用户将所有权授予管理员组。

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

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

所以我的问题是:我错过了什么吗,是否有记录的方法来修改记录为可修改的密钥?

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

提前致谢。

4

3 回答 3

6

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

当您想要获得您添加以启用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上找到代码。

于 2011-05-24T17:18:06.377 回答
3

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

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

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

于 2011-03-29T06:31:40.727 回答
3

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

于 2011-05-02T09:36:50.333 回答