2012-01-12 12 views
7

En .NET, ¿hay una manera simple de verificar si el usuario actual tiene acceso para crear un archivo en un directorio? Algo equivalente a la función de acceso C++, sería ideal.En .NET, verifique que el usuario actual pueda escribir en un directorio

No quiero utilizar prueba y error (crear un archivo ficticio y luego eliminarlo): aparte de parecer hackish, otro software está monitoreando el directorio en cuestión para archivos caídos.

No quiero usar System.DirectoryServices: mirar las ACL, resolver membresías de grupos y cómo interactúan los permisos de las diferentes membresías de grupos parece propenso a errores y demasiado difícil. Debe haber una función de sí o no en alguna parte, ¿no?

¡Gracias de antemano!

[editar] como una ventaja, si también funciona para una red compartida, sería genial.

+1

http://stackoverflow.com/a/265958/284240 Por lo tanto, maneje Excepciones. –

+0

posible duplicado de [¿Cómo comprobar si puedo crear un archivo en una carpeta específica en C#?] (Http://stackoverflow.com/questions/316903/how-to-check-if-i-can-create-a -file-in-a-specific-folder-in-c) – Joe

+0

marque esta respuesta, convertirla en VB.NET debe ser trivial ;-) http://stackoverflow.com/a/130641/559144 –

Respuesta

5
FileIOPermission writePermission = new FileIOPermission(FileIOPermissionAccess.Write, filename); 
if (SecurityManager.IsGranted(writePermission)){ 
    //write here 
} else { 
    //some error message 
} 
+0

Asumiendo que funciona (espero), una de esas respuestas que me hace votar, votar la pregunta y preferirla :) –

+0

¡Luce increíble! Déjame intentarlo. –

+1

Parece que no funciona para mí. Por alguna razón, siempre vuelve verdadero. Debe ser algo que estoy haciendo mal, pero es muy directo, no veo lo que sería./suspiro ... Lo he marcado como aceptado, porque me apunta a la API correcta. Solo tengo que resolverlo, creo que –

0

El siguiente devolverá un ejemplo DirecotrySecurity http://msdn.microsoft.com/en-us/library/system.security.accesscontrol.directorysecurity.aspx

DirectoryInfo(pathstr).GetAccessControl() 
+1

¿Esto se aplica al usuario actual? Miré esto y pareció dar acceso a la ACL.Puede decir que el grupo de usuarios "Foo Managers" tiene acceso de escritura y "Bar Workers" está denegado, pero no me ayuda a resolver si el usuario actual es miembro de un grupo que es miembro de uno de estos grupos. Tal vez extraño cómo resolver ese bit –

5

Comprobación de permiso por adelantado es un proyecto arriesgado. Sin mencionar que es complicado, se ejecuta en toda la lista de ACL y se computa el conjunto de permisos efectivos.

Además ... no hay garantías. El hecho de que haya verificado proactivamente el permiso con anticipación no significa que los permisos no hayan cambiado en el momento en que intente crear el archivo.

la forma "correcta" es hacer una security demand, ya sea de forma declarativa con FileIOPermissionAttribute o imperativamente, mediante la creación de una instancia apropiada de FileIOPermission e invocando su método Demand(). Si tiene los permisos deseados, la llamada al Demand() tiene éxito; de lo contrario, arroja un SecurityException, que necesitarás atrapar y actuar.

En mi experiencia, la verificación imperativa es más fácil.

También se debe tener en cuenta que en Windows 7, si bien es posible que conceptualmente tenga acceso de escritura al directorio, puede que no funcione a menos que esté ejecutando permisos elevados.

+0

Estoy totalmente de acuerdo. No me gustaría verificar los permisos para proteger una operación que podría fallar. Tenemos un sistema heredado que tiene muchos componentes de software que se ejecutan en muchos servidores y están acosados ​​por problemas de administración/configuración. Necesito escribir una aplicación que busque errores de configuración, pero debe hacerlo de forma pasiva, sin posibilidad de orfanar archivos de prueba/ficticia o similares. –

Cuestiones relacionadas