【问题标题】:RegistrySecurity Access is denied. C#RegistrySecurity 访问被拒绝。 C#
【发布时间】:2011-06-23 14:26:25
【问题描述】:

我目前在编写应用程序以设置某些旧密钥的权限时遇到问题。旧密钥被完全锁定,要在 regedit 中实际修改它们,您必须获得所有权,然后添加自己的完全控制权。当试图在代码中复制它时,我无法获得写入的密钥,并出现错误“访问被拒绝”。示例代码:

RegistrySecurity rs = new RegistrySecurity();
rs.AddAccessRule(new RegistryAccessRule("Administrators", RegistryRights.FullControl, AccessControlType.Allow));
rs.SetOwner(new NTAccount("Administrators"));
return LocalMachine.CreateSubKey(post, RegistryKeyPermissionCheck.ReadWriteSubTree, rs);

任何想法将不胜感激。我也尝试过请求写入权限的 OpenSubKey,但我无法获得密钥。

谢谢大家。

【问题讨论】:

    标签: c# security registry


    【解决方案1】:

    我终于找到了解决办法。您必须使用“ChangePermissions”打开密钥,然后为自己更改权限......然后重新打开具有完全控制权的密钥以更改所有者。 方法如下。

    RegistryKey rk = LocalMachine.OpenSubKey(subkey, RegistryKeyPremissionsCheck.ReadWriteSubTree, RegistryRights.ChangePermissions | RegistryRights.ReadKey);//Get the registry key desired with ChangePermissions Rights.
    RegistrySecurity rs = new RegistrySecurity();
    rs.AddAccessRule(new RegistryAccessRule("Administrator", RegistryRights.FullControl, InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit, PropagationFlags.InheritOnly, AccessControlType.Allow));//Create access rule giving full control to the Administrator user.
    rk.SetAccessControl(rs); //Apply the new access rule to this Registry Key.
    rk = LocalMachine.OpenSubKey(subkey, RegistryKeyPremissionsCheck.ReadWriteSubTree, RegistryRights.FullControl); // Opens the key again with full control.
    rs.SetOwner(new NTAccount("Administrator"));// Set the securitys owner to be Administrator
    rk.SetAccessControl(rs);// Set the key with the changed permission so Administrator is now owner.
    

    这对我有用。让我知道它是否适合你:)

    如果您没有以管理员身份登录或者您需要其他用户的权限,则显然将管理员更改为其他用户。

    【讨论】:

      【解决方案2】:

      当您使用该代码运行您的应用程序时,您是否右键单击该 exe 并选择“以管理员身份运行”?

      【讨论】:

      • 嗨史蒂夫,我以管理员身份运行 Visual Studios,所以调试应该以管理员身份运行?我也尝试过以管理员身份运行,但它仍然无法正常工作。 Legacy 密钥被完全锁定,只能访问 System 和 Everyone 设置为只读。我找到了解决方案,很快就会发布。
      【解决方案3】:
      using System.Security;
      using System.Security.AccessControl;
      using System.Security.Principal;
      using Microsoft.Win32;
      

      首先必须为子键设置一个具有完全访问权限的权限

      RegistryKey rkey = LocalMachine.OpenSubKey(_subKey, RegistryKeyPermissionCheck.ReadWriteSubTree, gistryRights.ChangePermissions);
      if (rkey == null)
       throw new Exception("Not Open");
      //-------
      RegistrySecurity _registrySecurity =new RegistrySecurity();//Or rkey.GetAccessControl();
      WindowsIdentity _windowsIdentity = System.Security.Principal.WindowsIdentity.GetCurrent();
      RegistryAccessRule _accessRule = new RegistryAccessRule(_windowsIdentity.Name, RegistryRights.FullControl, InheritanceFlags.ObjectInherit | InheritanceFlags.ContainerInherit, PropagationFlags.None, AccessControlType.Allow);
      _registrySecurity.AddAccessRule(_accessRule);
      _registrySecurity.SetAccessRuleProtection(false, true);
       rkey.SetAccessControl(_registrySecurity);
      
      //--------Now, Set owner
      
      _registrySecurity.SetGroup(new NTAccount("Administrators"));  //This is optional
      var SID = new System.Security.Principal.NTAccount("XXX\\Users");
      _registrySecurity.SetOwner(SID);
      rkey.SetAccessControl(_registrySecurity);
      

      XXX:您的帐户名

      【讨论】:

        【解决方案4】:
                RegistryKey rkey = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Norton\SecurityStatusSDK", RegistryKeyPermissionCheck.ReadWriteSubTree, RegistryRights.ChangePermissions);
                if (rkey == null)
                    throw new Exception("Not Open");
                //-------
                RegistrySecurity _registrySecurity = new RegistrySecurity();//Or rkey.GetAccessControl();
                WindowsIdentity _windowsIdentity = System.Security.Principal.WindowsIdentity.GetCurrent();
                RegistryAccessRule _accessRule = new RegistryAccessRule(_windowsIdentity.Name, RegistryRights.FullControl, InheritanceFlags.ObjectInherit | InheritanceFlags.ContainerInherit, PropagationFlags.None, AccessControlType.Allow);
                _registrySecurity.AddAccessRule(_accessRule);
                _registrySecurity.SetAccessRuleProtection(false, true);
                try
                {
                    rkey.SetAccessControl(_registrySecurity);// <---"Attempted to perform an unauthorized operation."
                }
                catch (UnauthorizedAccessException e)
                {
        
                }
        
                //--------Now, Set owner
        
                _registrySecurity.SetGroup(new NTAccount("Administrators"));  //This is optional
                var SID = new System.Security.Principal.NTAccount("XXX\\Users");
                _registrySecurity.SetOwner(SID);
                rkey.SetAccessControl(_registrySecurity);
        

        我安装了 Norton Internet Security

        【讨论】:

          【解决方案5】:

          Microsoft Visual Studio 2015(管理员)

          _subKey = SOFTWARE\Wow6432Node\Norton

          rkey.SetAccessControl(_registrySecurity);-&gt;"试图执行未经授权的操作。"`

          【讨论】:

          • 您对此的回答到底是什么?对不起,我没有关注。
          猜你喜欢
          • 2017-10-31
          • 2021-09-18
          • 2012-09-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-07-14
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多