Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/273.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 无法将注册表项从“系统”更改为“管理员”_C#_.net_Windows_Registry - Fatal编程技术网

C# 无法将注册表项从“系统”更改为“管理员”

C# 无法将注册表项从“系统”更改为“管理员”,c#,.net,windows,registry,C#,.net,Windows,Registry,我感兴趣的钥匙在下面 HKEY\U LOCAL\U MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Setup\PnpLockdownFiles 这些密钥授予系统用户完全访问权限,而仅授予管理员读取权限。我已登录管理员帐户。我正在使用2012 R2 我可以通过regedit by更改所有者 下面是我尝试过的c语言的API。由于访问被拒绝,两者都失败 key = Registry.LocalMachine.OpenSubKey(test,

我感兴趣的钥匙在下面

HKEY\U LOCAL\U MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Setup\PnpLockdownFiles

这些密钥授予系统用户完全访问权限,而仅授予管理员读取权限。我已登录管理员帐户。我正在使用2012 R2

我可以通过regedit by更改所有者

下面是我尝试过的c语言的API。由于访问被拒绝,两者都失败

    key = Registry.LocalMachine.OpenSubKey(test, RegistryKeyPermissionCheck.ReadSubTree, RegistryRights.TakeOwnership);

    RegistrySecurity rs = new RegistrySecurity();
    rs.SetOwner(new NTAccount("Administrator"));// Set the securitys owner to be Administrator

    key.SetAccessControl(rs);
还尝试了win32 API:

    SetSecurityInfo(getRegistryKeyHandle(key), SE_OBJECT_TYPE.SE_REGISTRY_KEY, SECURITY_INFORMATION.OWNER_SECURITY_INFORMATION, ownerSid, groupSid, dacl, sacl);

感谢@HarryJohnston。你的方法有效


我首先启用SeTakeOwnershipPrivilege,然后我就可以用我的代码获取所有者。

如果启用了UAC,则需要以管理员身份显式运行应用程序。有关如何要求应用程序以提升的权限运行的问题和答案,请参阅此问题和答案:必须启用SeTakeOwnershipPrivilege才能为自己分配对象的所有权。请注意,这只允许您为自己的帐户或您所属的组设置所有权。或者,如果启用SeBackupPrivilege和SeRestorePrivilege,则可以将所有权分配给任何人。如果您具有对象的写入所有者访问权限,您也可以无特权地分配自己对该对象的所有权。在这种情况下,由于您正试图将所有权分配给管理员帐户,因此您需要以管理员帐户而不仅仅是任何旧的管理帐户的身份运行,但该特定帐户或启用备份和恢复权限。请注意,将所有权分配给管理员比分配给管理员更常见。
    SetSecurityInfo(getRegistryKeyHandle(key), SE_OBJECT_TYPE.SE_REGISTRY_KEY, SECURITY_INFORMATION.OWNER_SECURITY_INFORMATION, ownerSid, groupSid, dacl, sacl);