2011-04-20 26 views
5

Mi programa requiere acceso a una determinada ruta UNC, pero la ruta es de dominio cruzado, por lo que dependiendo de la máquina en la que se ejecute el programa, puede o no tener credenciales predeterminadas. Normalmente, un usuario debería simplemente abrir el explorador y escribir la dirección UNC o IP para obtener un mensaje de inicio de sesión (en este punto pueden escribir las credenciales apropiadas para el dominio en el que está el recurso compartido).Prueba de "Accesibilidad" de una ruta UNC

¿Existe alguna manera "limpia" de probar el acceso de UNC, y si las credenciales predeterminadas de Windows son malas, solicítelas para obtener otras diferentes?

Ahora estoy usando un código desagradable para tratar de leer un archivo de texto en el recurso compartido, atrapar una IOException, y luego abrir un objeto de proceso "explorer.exe" (oculto) para obtener la solicitud de inicio de sesión. Todo esto está contenido dentro de un bucle que vuelve a verificar después de 10 s. Funciona de cierta manera, pero la solución y la lógica parecen realmente indeseables.

¿Son mis únicas opciones realmente WNetUseConnection o una solución de estilo interoperativo?

Respuesta

3

comprobar estos artículos:

  • Testing File Access Rights in .NET 2.0. Una práctica clase para probar los permisos del sistema de archivos.
  • Vexing exceptions. Eric Lippert explica por qué las pruebas preventivas son inútiles (en pocas palabras: hay una condición implícita de carrera. Entre la prueba y el acceso real, algunos otros procesos pueden cambiar los permisos, mover o eliminar el archivo, o la red podría caer ... Esto significa que tiene que lidiar con excepciones lanzadas cuando intenta acceder al recurso, por lo que podría estructurar su código para resolver el problema cuando ocurra realmente.

He utilizado el código como esto:

new FileIOPermission(FileIOPermissionAccess.Read, path).Demand(); 

que se supone que lanzar una SecurityException si usted no tiene el acceso deseado, pero por caminos en unidades de red o rutas de acceso UNC, elEl métodoparece no ser operativo.

+0

No siempre es el caso que las pruebas preventivas * no tienen sentido *. A veces, las pruebas con anticipación pueden ser una ganancia de rendimiento, por ejemplo. Es decir, podría ser más barato preguntar "oye, ¿es muy probable que arrojes una excepción?" de lo que es intentarlo y esperar la excepción. Esto es particularmente cierto en procesos largos de varios pasos en los que todo podría fallar en el último paso. Descubrir con anticipación si el último paso casi seguramente va a fallar puede ahorrarle el trabajo de llegar allí. Pero dicho eso, sí, vas a tener que manejar el caso de falla independientemente. –

+0

Sí ... 'sin sentido' probablemente no sea la mejor frase. Si usted ya sabe que el archivo no existe/no se puede acceder desde el principio, es posible que desee simplemente pagar fianza en lugar de hacer un montón de trabajo que seguramente no servirá de nada. –

+0

Supongo que mi única preocupación es que hay una gran cantidad de gastos generales en mi programa (consultas SQL, interacción del usuario, etc.) antes de que los archivos se escriban en un recurso compartido, y cuando mi programa escribe en un recurso compartido es un proceso bastante intenso (es decir, archivos zip grandes). Esto podría llevar a 5-10m de tiempo "desperdiciado" por parte del usuario si no tienen acceso correcto a la UNC.Estoy, por supuesto, envolviendo cosas en try/catch para IOExceptions, solo rezo para que el usuario sepa a qué se refieren (heh). Gracias por la respuesta útil. – Jai

0

Nunca he hecho esto, pero lo que puede estar pidiendo hacer es consultar la Lista de control de acceso (ACL) en NTFS.

Realicé una búsqueda web de C# y "Lista de control de acceso" y obtuve un par de visitas que pueden ser de su interés. Esto puede ser más limpio, pero puede que no sea más fácil que lo que ya está haciendo.

Cuestiones relacionadas