2009-01-09 21 views
16

Estoy escribiendo una aplicación para gestionar el acceso de los usuarios a los archivos. La versión corta de una historia muy larga es que tengo que usar el directorio y los privilegios de archivos para hacerlo. Ningún sistema de gestión de documentos para nuestro CEO barato ...C# File/Directory Permissions

En fin ... tengo todo funcionando, excepto el caso en que el usuario puede ver qué archivos están en el directorio, pero en realidad no ver el contenido del archivo. (Puede haber datos sensibles de recursos humanos en los archivos.)

Intenté FileSystemRights.ListDirectory, pero eso parece (a pesar de la documentación de MS) establecer ReadData en true también. Apago ReadData (la capacidad de leer los archivos) y de repente no tengo acceso al directorio nuevamente. Los dos aparecen vinculados.

¿Alguna idea para el cual el permiso (s) para ajustar para lograr esto?

Mi código actual es:

SetSecurity(pth, usr, FileSystemRights.ListDirectory, AccessControlType.Allow); 

... 

public void SetSecurity(string dirName, string account, 
    FileSystemRights rights, AccessControlType controlType) 
{ 
    // Get a FileSecurity object that represents the 
    // current security settings. 
    DirectorySecurity dSecurity = Directory.GetAccessControl(dirName); 

    dSecurity.AddAccessRule(new FileSystemAccessRule(account, rights, controlType)); 

    // Set the new access settings. 
    Directory.SetAccessControl(dirName, dSecurity); 
} 

Gracias.

--Jerry

Respuesta

7

El enum FileSystemRights mapas tanto ReadData y listDirectory al valor 1, por lo que los dos son 100% equivalente en lo que se refiere a .NET.

Ha intentado Traverse en contraposición a listDirectory?

Editar: Basado en this artículo de KB, parece que Windows XP considera que son los mismos, solo uno se aplica solo a los archivos, y uno se aplica solo a los directorios.

Edición 2: Mientras establezca que la regla de acceso ReadData/ListDirectory NO sea heredada por los objetos secundarios, debe poder aplicarla al directorio sin aplicarla a los archivos en el directorio. La clase FileSystemAccessRule admite cambiar los indicadores de herencia.

3

Los archivos son probablemente heredando las propiedades de seguridad de un objeto primario.

Puede intentar llamar al DirectorySecurity.SetAccessRuleProtection(true, false) para evitar que los archivos se hereden, antes de llamar a Directory.SetAccessControl();

+0

Sí. Los archivos ESTÁN heredando de la carpeta. Otro problema más: "CEO se niega a comprar una solución real de administración de documentos" que tenemos que haber establecido. – Jerry

+0

Después de probar sin herencia en una carpeta en particular, tiene razón. Puede habilitar la carpeta, luego deshabilitar el archivo y funciona como desee ... pero por otras razones, esta no es una opción para nosotros. – Jerry

1

Sip. Traverse (creo que es mal nombrado) me permite ejecutar un programa dentro de una carpeta, pero NO ver el contenido de una carpeta. No estoy seguro de por qué esto es útil, para ser honesto.

estoy a punto de decirle al director general que no se puede hacer y ver las chispas volar de nuevo. : P

+2

Ser capaz de eludir las comprobaciones de poligonal hace que el acceso a archivos sea O (1) en lugar de O (n). Imagine tratar de abrir 100 archivos anidados 12 directorios de profundidad. Si puede omitir las comprobaciones de poligonal, solo debe hacer 100 comprobaciones de ACL; si no, tienes que hacer 1200 controles. – Gabe

0

Son los valores de la herencia y de propagación que no están siendo ajustadas cuando se crea una instancia del FileSystemAccessRule ..