当管理员具有只读权限时修改注册表项的权限

问题描述 投票:0回答:1

我正在尝试在运行提升权限(管理员)时向此 Windows 键添加值:

计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\基于组件的服务

默认情况下,管理员对此密钥仅有读取权限。我正在考虑使用 AddAccessRule() 将自己暂时添加到该密钥,但我不能这样做,因为为了使用 AddAccessRule(),我首先需要使用“写”访问权限打开密钥,因此我陷入了困境在这里循环。这些是当前权限:

显然,这是行不通的代码,因为 OpenSubkey() 失败了。

using (RegistryKey key = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Component Based Servicing", true))
{
   var current = key.GetAccessControl();
   var user = ...;
   current.AddAccessRule(new RegistryAccessRule(user, RegistryRights.WriteKey, AccessControlType.Allow));
   key.SetAccessControl(current);
   key.SetValue("TestValue", 1);
}

我应该如何进入该键,以便我可以在那里写入一个值?

.net-core winapi registry
1个回答
0
投票

您需要拥有密钥。

在 Windows 中,每个进程都有一个 token,它决定进程可以执行的操作。默认情况下,某些权限被禁用(即使进程以提升的身份运行),并且必须显式启用。默认情况下禁用 [SeTakeOwnershipPrivilege] (https://learn.microsoft.com/en-us/windows/win32/secauthz/privilege-constants)。

该问题的答案解释了如何更改获取更改所有权的权限:如何以编程方式将注册表项的所有权授予管理员?。 它使用另一个答案中提到的 TokenManipulator 类:如何使用 PowerShell 获取文件所有权?

获取 SeTakeOwnershipPrivilege 后,您可以调用 SetOwner 方法,然后 AddAccessRule

© www.soinside.com 2019 - 2024. All rights reserved.