2011-06-23 9 views
6

Actualmente estoy teniendo un problema al escribir una aplicación para establecer permisos en algunas claves heredadas. Las claves heredadas están bastante bloqueadas y para modificarlas en regedit debes asumir la propiedad y luego agregarte a ti mismo con control total. Al tratar de replicar esto en el código, no puedo obtener la clave para escribir con el error "Acceso denegado". Código de ejemplo:Se niega el acceso de RegistrySecurity. C#

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); 

Cualquier idea sería muy apreciada. También probé OpenSubKey con acceso de escritura solicitado y simplemente no puedo obtener la clave.

Gracias chicos.

Respuesta

7

Finalmente encontré una solución. Debes abrir la clave con "ChangePermissions" y luego cambiar el permiso por ti mismo ... ENTONCES vuelve a abrir la clave con control total para cambiar el propietario. He aquí cómo.

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. 

Esto funciona para mí. Avísame si te funciona :)

Obviamente, cambia el Administrador a otro usuario si no has iniciado sesión como administrador o si necesitas derechos para otro usuario.

0

Cuando ejecuta su aplicación con ese código, ¿hace clic derecho en el exe y selecciona "Ejecutar como administrador"?

+0

Hola Steve, corro Visual Estudios como administrador de modo de depuración se debe ejecutar como administrador? También intenté ejecutar como administrador y todavía no funciona. las claves heredadas están totalmente bloqueadas con acceso solo al sistema y a todos configurados como de solo lectura. Encontré una solución y la publicaré en breve. – Skintkingle

0
using System.Security; 
using System.Security.AccessControl; 
using System.Security.Principal; 
using Microsoft.Win32; 

En primer lugar debe establecer una autorización con pleno derecho de acceso completo a subclave

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: el nombre de cuenta

-2

Microsoft Visual Studio 2015 (Administrador)

_subKey = SOFTWARE\Wow6432Node\Norton

rkey.SetAccessControl(_registrySecurity);-> "Intento de por formar una operación no autorizada. "`

+0

¿Qué estás respondiendo exactamente con esto? Lo siento, no lo sigo. – Skintkingle

-1
 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); 

He instalado Norton Internet Security

Cuestiones relacionadas