如何更改我无权访问的注册表项的所有者?

如何更改我无权访问的注册表项的所有者?

当我将一些机器升级到 Windows 10 时,我遇到了一个奇怪的问题,RuntimeBroker 上的不正确权限导致了问题。我发现在线解决方案建议更改权限(首先在注册表中,然后在 DCOM 配置中),我正在尝试编写一个 Powershell 脚本来自动化该过程。

我正在尝试执行以下 Powershell 脚本,该脚本(理论上)应该可以完成我需要做的事情。但是,在最后一个命令(Set-Acl)中,我收到一个 SecurityException,提示“不允许请求的注册表访问”。

$path = "Registry::HKEY_CLASSES_ROOT\AppID\{9CA88EE3-ACB7-47c8-AFC4-AB702511C276}";
$account = New-Object -TypeName System.Security.Principal.NTAccount -ArgumentList 'Administrators';
$acl = Get-Acl -Path $path;
$acl.SetOwner($account);
Set-Acl -Path $path -AclObject $acl;

目前该注册表项的所有者是NT SERVICE\TrustedInstaller,我正尝试将其更改为Administrators我已经以管理员权限运行 Powershell但这显然还不够……我猜我在这里遇到了一个先有鸡还是先有蛋的问题。

如果我使用 手动编辑该项的权限regedit,则可以毫无问题地执行此操作。 regedit 的功能与此处的脚本有何不同? 我如何以编程方式实现此目的?

更新:根据 briantist 的建议,我尝试使用 psexec 以 SYSTEM 身份运行这些命令。我将上面发布的 Powershell 命令保存到桌面上名为 chowner.ps1 的文件中,然后运行以下命令:

PsExec64.exe -accepteula -d -i -s powershell -ExecutionPolicy Bypass -File C:\Users\User\Desktop\chowner.ps1

不幸的是,我仍然收到相同的 SecurityException 消息。我相信原因是 SYSTEM 也没有访问此特定注册表项的权限;请记住,TrustedInstaller 拥有它。

答案1

您可以使用 Helge Kleins 出色的 Set-ACL CLI 工具:https://helgeklein.com/setacl/

SetACL.exe -on "hkcr\AppID\{9CA88EE3-ACB7-47c8-AFC4-AB702511C276}" -ot reg -actn setowner -ownr "n:S-1-5-32-544"

我认为这个方法可以解决问题。必须以提升的权限运行。

答案2

您应该以SYSTEM(又名 )的身份运行您的代码Local System

为此,您可以使用psexecSysInternals,或者您可以将代码作为计划任务运行,该任务设置为以 运行SYSTEM。这应该允许您更改任何权限。

相关内容