C# 如何写入TrustedInstaller拥有的注册表项

C# 如何写入TrustedInstaller拥有的注册表项,c#,windows-installer,registry,windows-server-2008-r2,windows-security,C#,Windows Installer,Registry,Windows Server 2008 R2,Windows Security,为了在Active Directory管理单元中安装新的属性页,我需要写入以下注册表项W2K8 R2() HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MMC\SnapIns{E355E538-1C2E-11D0-8C37-00C04FD8FE93}\NodeType 此密钥由名为TrustedInstaller的特殊用户拥有。我在网上找到了很多东西 目前,它的工作方式如下(用户是管理员组的成员): 我授予用户获得所有权的特权 用户拥有所有权 用户写入注册表 用户将

为了在Active Directory管理单元中安装新的属性页,我需要写入以下注册表项W2K8 R2()

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

此密钥由名为TrustedInstaller的特殊用户拥有。我在网上找到了很多东西

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

  • 我授予用户获得所有权的特权
  • 用户拥有所有权
  • 用户写入注册表
  • 用户将所有权授予administrators组
  • 我的项目完全是用C#写的,我有两件事不喜欢我现在的方式

    • 我使用InteropServices调用Win32 API。有人知道用纯C语言做这件事的方法吗
    • 最后,TrustedInstaller不再是密钥的所有者,我无法赋予他所有权,他拥有完全控制权,但我不希望在安装管理单元后,我的服务器被归类为损坏
    所以我的问题是:我是否遗漏了一些东西,是否有一个文档化的方法来修改这样一个文档化为可修改的密钥

    关于这一点有一个现有的说法,答案是TrustedInstaller所有权意味着密钥是系统安装的一部分,而不是应用程序安装的一部分。对于我来说,如果Microsoft文档说明如何修改密钥,则说明它的应用程序安装

    提前感谢。

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

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


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

    如果您以管理员身份运行程序(不要忘记在清单中启用
    'requireAdministrator'
    作为UAC执行级别)或者任何其他拥有
    SE\u RESTORE\u NAME
    权限的用户,您可以使用
    REG\u选项\u BACKUP\u RESTORE
    标志。您可以在中使用相同的标志(请参见
    ulOptions
    parameter),但它没有文档记录,我建议您最好使用它。例如,返回的键句柄可用于设置有关
    RegSetValueEx
    的值以您可以设置任何注册表项的方式。如果您另外启用
    SE\u BACKUP\u NAME
    特权,您将能够读取任何注册表项(例如,从
    HKEY\u LOCAL\u MACHINE\SECURITY
    HKEY\u LOCAL\u MACHINE\SAM\SAM

    ),因此我发现了一个问题

    当您想要对添加的资源拥有所有权以启用SeTakeOwnershipPrivilege时,这允许您更改所有者SID。但是新的所有者Sid必须在调用方的令牌中,并且该Sid必须具有属性SE_GROUP_Owner。因此,在我的情况下,我无法将SID所有者更改回S-1-5-80-956008885-3418522649-1831038044-1853292631-2271478464(TrustedInstaller)。我只是能够获得所有权,或者将所有权授予“管理员”组。我发现有一种工作方式,可以将任意用户指定为所有者,即使 其SID不在令牌中SeRestorePrivilege授予管理员和备份操作员的特权,但默认情况下未启用。允许我将所有权返还给受信任的安装商

    因此,它可以执行以下操作(用户是管理员组的成员):

  • 我授予用户获取所有权的权限,并启用还原权限
  • 用户拥有所有权
  • 用户写入注册表
  • 用户将所有权授予以前的所有者TrustedInstaller
  • 我使用InteropServices调用Win32 API,这似乎是在C中实现这一点的唯一方法#

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


    编辑:
    抱歉,我忘记了,您可以在上找到代码。

    我尝试使用Visual studio 10中“Deployment安装项目”生成的MSI的注册表项来执行此操作。我将重试,但在我的第一次测试中,它不起作用。我必须在Orca的桌子上指定一些特别的东西吗?所以我再次测试了它。这是我的MSI
    \u 2D2C0089689924663A0BDAAE6CFE4E160 2 Software\Microsoft\MMC\SnapIns\{e35E538-1C2E-11D0-8C37-00C04FD8FE93}\NodeTypes\{3bcd9db8-f84b-451c-952f-6c52b81f9ec6}*C\u 2D2C00896899246A0BDAAE6CFE4E160
    的注册表表。您确定您的断言吗?安装过程中会发生什么?您是否创建了日志以查看如何处理注册表项?抱歉,我不知道如何创建MSI安装日志。感谢Cosmin,结果如下:WriteRegistryValues:Clé:\Software\Microsoft\MMC\SnapIns\{E355E538-1C2E-11D0-8C37-00C04FD8FE93}\NodeType\{3bcd9db8-4B F8-451c-952f-6c52b81f9ec6},nom:,valeur:MSI(28:F0)[16:38:30:109]:SFC:由于windows保护,无法创建以下密钥:\Software\Microsoft\MMC\SnapIns\{E355E538-1C2E-11D0-8C37-00C04FD8FE93}\NodeType\{3bcd9db8-f84b-451c-952f-6c52b81f9ec6}我是以完全的管理员权限执行的。你有没有可能有一篇博客文章或示例代码?我已经试了好几个小时了。@Laoujin我终于把代码放在Gist上了,我希望它能有所帮助。