我正在尝试在运行提升权限(管理员)时向此 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);
}
我应该如何进入该键,以便我可以在那里写入一个值?
您需要拥有密钥。
在 Windows 中,每个进程都有一个 token,它决定进程可以执行的操作。默认情况下,某些权限被禁用(即使进程以提升的身份运行),并且必须显式启用。默认情况下禁用 [SeTakeOwnershipPrivilege] (https://learn.microsoft.com/en-us/windows/win32/secauthz/privilege-constants)。
该问题的答案解释了如何更改获取更改所有权的权限:如何以编程方式将注册表项的所有权授予管理员?。 它使用另一个答案中提到的 TokenManipulator 类:如何使用 PowerShell 获取文件所有权?
获取 SeTakeOwnershipPrivilege 后,您可以调用 SetOwner 方法,然后 AddAccessRule