2012-02-02 24 views
55

La herramienta que desarrollo debe otorgar derechos de acceso "Control total" a un archivo creado por él. Debe leerse, modificarse y eliminarse de todas las cuentas de Windows e incluso posibles cuentas futuras. ¿Podría esto ser logrado?¿Cómo otorgar permiso completo a un archivo creado por mi aplicación para TODOS los usuarios?

Sé que puedo probar esto por un SPECIFIC_USER:

FileSystemAccessRule rule = new FileSystemAccessRule(SPECIFIC_USER, FileSystemRights.FullControl, AccessControlType.Allow); 
FileSecurity fSecurity = File.GetAccessControl(filePath); 
fSecurity.SetAccessRule(rule); 
File.SetAccessControl(filePath, fSecurity); 

Pero ¿Cómo puedo permitir que todos los usuarios? ¿Y hasta posibles cuentas futuras? Si la última parte no es posible, ¿cómo cumplir con el primer requisito?

Gracias.

EDIT:

Este es el código que funcionó para mí. Tomado del enlace del respondedor.

private bool GrantAccess(string fullPath) 
{ 
    DirectoryInfo dInfo = new DirectoryInfo(fullPath); 
    DirectorySecurity dSecurity = dInfo.GetAccessControl(); 
    dSecurity.AddAccessRule(new FileSystemAccessRule("everyone", FileSystemRights.FullControl, 
                InheritanceFlags.ObjectInherit | InheritanceFlags.ContainerInherit, 
                PropagationFlags.NoPropagateInherit, AccessControlType.Allow)); 
    dInfo.SetAccessControl(dSecurity); 
    return true; 
} 

Nota del PropagationFlags.NoPropagateInherit que se requiere (mencionado hacia el pasado en el enlace). Otorga privilegio incluso a cuentas futuras.

+16

Nota para las personas, no utilice "todo el mundo", en lugar de usar 'nueva SecurityIdentifier (WellKnownSidType.WorldSid, null)' que devuelve un objeto SecurityIdentifier. Todo el mundo solo trabaja en instalaciones de Windows en inglés, y el otro método garantiza que sea compatible con versiones en varios idiomas. –

+0

@trukin ¿Puedes convertirlo en una respuesta? gracias – nawfal

+0

@nawfal: Tengo el mismo problema, y ​​tengo que dar acceso a mi carpeta de instalación una vez que la aplicación esté instalada, pero ¿dónde puedo escribir este código? –

Respuesta

96

Nota para las personas que usan esto.

Al usar cadenas literales para el FileSystemAccessRule, debe ser WellKnownSidType.WorldSid en lugar de "everyone".

La razón es porque hay varios idiomas de ventana y Todos solo se aplican a los de EN, por lo que para español, podría ser "Todos" (u otra cosa).

using System.Security.AccessControl; 
using System.Security.Principal; 
using System.IO; 

private void GrantAccess(string fullPath) 
{ 
    DirectoryInfo dInfo = new DirectoryInfo(fullPath); 
    DirectorySecurity dSecurity = dInfo.GetAccessControl(); 
    dSecurity.AddAccessRule(new FileSystemAccessRule(new SecurityIdentifier(WellKnownSidType.WorldSid, null), FileSystemRights.FullControl, InheritanceFlags.ObjectInherit | InheritanceFlags.ContainerInherit, PropagationFlags.NoPropagateInherit, AccessControlType.Allow)); 
    dInfo.SetAccessControl(dSecurity); 
} 
+0

Creo que esta era la mejor manera de permitir un control total ... – IremadzeArchil19910311

+0

Muchas gracias ... he tenido problemas para descomprimir archivos y establecer permisos para archivos .mdf (porque obtuve errores de solo lectura). ¡Gracias! – CularBytes

+0

¿Puedo preguntar el propósito del valor devuelto? – hypehuman

12

Tendrá que dar un control total al grupo "Todos" en la máquina. Se encontró this publicación en MSDN que habla al respecto.

Espero que esto funcione para usted.

+0

Gracias, me ocuparé de eso. ¿Esto otorga acceso a cuentas incluso futuras? – nawfal

+0

Gracias funcionó y otorga acceso a cuentas de usuario futuras también. Acepta mi edición para que otros sepan qué se debe hacer exactamente. – nawfal

+0

Me alegro de que funcionó para usted. –

Cuestiones relacionadas