Necesito probar si un usuario puede escribir en una carpeta antes de intentar hacerlo.
Implementé el siguiente método (en C # 2.0) que intenta recuperar los permisos de seguridad para la carpeta usando el método Directory.GetAccessControl () .
private bool hasWriteAccessToFolder(string folderPath)
{
try
{
// Attempt to get a list of security permissions from the folder.
// This will raise an exception if the path is read only or do not have access to view the permissions.
System.Security.AccessControl.DirectorySecurity ds = Directory.GetAccessControl(folderPath);
return true;
}
catch (UnauthorizedAccessException)
{
return false;
}
}
Cuando busqué en Google cómo probar el acceso de escritura, no apareció nada como esto y parecía muy complicado probar los permisos en Windows. Me preocupa que estoy simplificando demasiado las cosas y que este método no es robusto, aunque parece funcionar.
¿Mi método para probar si el usuario actual tiene acceso de escritura funcionará correctamente?
c#
permissions
directory
Chris B
fuente
fuente
Respuestas:
Esa es una forma perfectamente válida de verificar el acceso a la carpeta en C #. El único lugar donde podría caerse es si necesita llamar a esto en un ciclo cerrado donde la sobrecarga de una excepción puede ser un problema.
Ha habido otras preguntas similares formuladas anteriormente.
fuente
Aprecio que esto sea un poco tarde para esta publicación, pero es posible que este código sea útil.
Deje caer eso en una aplicación de consola y vea si hace lo que necesita.
fuente
GetAccessControl
pero mi software es realmente capaz de escribir en el directorio que estoy viendo ...fuente
string tempFileName = Path.GetRandomFileName();
evidentementeIntenté la mayoría de estos, pero dan falsos positivos, todo por la misma razón. No es suficiente probar el directorio para obtener un permiso disponible, debe verificar que el usuario conectado sea miembro de un grupo que tiene ese permiso. Para hacer esto, obtiene la identidad de los usuarios y comprueba si es miembro de un grupo que contiene FileSystemAccessRule IdentityReference. He probado esto, funciona perfectamente ...
fuente
(AccessRight & rule.FileSystemRights) > 0
denegación , debe ser porque cualquier tipo de acceso secundario denegado es parte deAccessRight
que no tiene acceso completo acceso aAccessRight
En mi humilde opinión, la única forma 100% confiable de probar si puede escribir en un directorio es escribir en él y, finalmente, detectar excepciones.
fuente
Por ejemplo, para todos los usuarios (Builtin \ Users), este método funciona bien: disfrute.
fuente
Prueba esto:
fuente
fsAccessRule.AccessControlType
podría estarloAccessControlType.Deny
.Su código obtiene el
DirectorySecurity
de un directorio dado y maneja una excepción (debido a que no tiene acceso a la información de seguridad) correctamente. Sin embargo, en su muestra, en realidad no interroga al objeto devuelto para ver qué acceso está permitido, y creo que debe agregarlo.fuente
Aquí hay una versión modificada de la respuesta de CsabaS , que explica las reglas explícitas de acceso denegado . La función pasa por todos los FileSystemAccessRules para un directorio, y verifica si el usuario actual está en un rol que tiene acceso a un directorio. Si no se encuentran tales roles o el usuario está en un rol con acceso denegado, la función devuelve falso. Para verificar los derechos de lectura, pase FileSystemRights.Read a la función; para derechos de escritura, pase FileSystemRights.Write. Si desea verificar los derechos de un usuario arbitrario y no los actuales, sustituya la identidad de Windows del usuario actual por la identidad de Windows deseada. También recomendaría no confiar en funciones como esta para determinar si el usuario puede usar el directorio de manera segura. Esta respuesta explica perfectamente por qué.
fuente
Las soluciones anteriores son buenas, pero para mí, este código me parece simple y viable. Simplemente cree un archivo temporal. Si se crea el archivo, su usuario medio tiene acceso de escritura.
fuente
Create
permiso, pero noDelete
, en cuyo caso esto sería falso de vuelta a pesar de que el usuario hace tener permiso de escritura.Path.Combine
lugar comoPath.Combine(tempfilepath, "temp.txt")
.Puede intentar seguir el siguiente bloque de código para verificar si el directorio tiene acceso de escritura. Comprueba la FileSystemAccessRule.
fuente
Tiene una posible condición de carrera en su código: ¿qué sucede si el usuario tiene permisos para escribir en la carpeta cuando verifica, pero antes de que el usuario realmente escriba en la carpeta, se retira este permiso? La escritura arrojará una excepción que deberá atrapar y manejar. Entonces la verificación inicial no tiene sentido. También podría escribir y manejar cualquier excepción. Este es el patrón estándar para su situación.
fuente
http://www.codeproject.com/KB/files/UserFileAccessRights.aspx
Clase muy útil, verifique la versión mejorada en los mensajes a continuación.
fuente
Simplemente intentar acceder al archivo en cuestión no es necesariamente suficiente. La prueba se ejecutará con los permisos del usuario que ejecuta el programa, que no son necesariamente los permisos de usuario con los que desea probar.
fuente
Estoy de acuerdo con Ash, eso debería estar bien. Alternativamente, podría usar CAS declarativa y evitar que el programa se ejecute en primer lugar si no tienen acceso.
Creo que algunas de las características de CAS pueden no estar presentes en C # 4.0 por lo que he escuchado, no estoy seguro de si eso podría ser un problema o no.
fuente
No pude obtener GetAccessControl () para lanzar una excepción en Windows 7 como se recomienda en la respuesta aceptada.
Terminé usando una variación de la respuesta de sdds :
Espero que esto ayude.
fuente
Me enfrenté al mismo problema: cómo verificar si puedo leer / escribir en un directorio en particular. Terminé con la solución fácil para ... realmente probarlo. Aquí está mi solución simple pero efectiva.
Espero eso ayude !
fuente
La mayoría de las respuestas aquí no verifican el acceso de escritura. Simplemente verifique si el usuario / grupo puede 'Leer permiso' (Lea la lista ACE del archivo / directorio).
También iterar a través de ACE y verificar si coincide con el Identificador de seguridad no funciona porque el usuario puede ser miembro de un grupo del que podría obtener / perder privilegios. Peor que eso son los grupos anidados.
Sé que este es un hilo viejo, pero hay una mejor manera para cualquiera que busque ahora.
Siempre que el usuario tenga el privilegio de permiso de lectura, se puede usar la API Authz para verificar el acceso efectivo.
https://docs.microsoft.com/en-us/windows/win32/secauthz/using-authz-api
https://docs.microsoft.com/en-us/windows/win32/secauthz/checking-access-with-authz-api
fuente