2012-04-17 12 views
20

Tengo una línea de comprobación de código si existe un directorio y luego obtengo la lista de archivos en él.Directory.Exists no funciona para una ruta de red

System.IO.Directory.Exists(@"\\Server\Folder\"); 

que funciona cuando lo pruebo (ejecutar desde Visual Studio), pero cuando despliego el sitio web, siempre devuelve falso.

Hago la misma verificación para otra carpeta, en otro servidor (digamos Server2) y funciona bien.

Pensé que era un problema de acceso, pero la carpeta compartida y la red tienen acceso a todos ... ¿Hay alguna otra razón por la que no funcionaría?

+6

Toma en cuenta que se ejecuta IIS tener acceso? – Matthew

+0

¿No puede desviar "Server"? – David

Respuesta

15

Cuando ejecuta el código en Visual Studio se ejecuta bajo los derechos de su usuario.

Cuando ejecuta el código en IIS, se ejecuta en la identidad del grupo de aplicaciones que, por defecto, es el usuario incorporado "Servicio de red". Esta es una cuenta de usuario local que no tiene acceso fuera de la máquina local.

Los derechos en el recurso compartido de red son la primera capa, después de eso se verifican los derechos NTFS en el directorio.

Debe cambiar la identidad del grupo de aplicaciones a un usuario de dominio con los mismos derechos que su usuario.

+1

También funcionó en mi IIS local para las pruebas, pero la configuración fue para el usuario de la Aplicación, por lo que mi usuario de Windows local debía conectarse a la red. Configuré mi usuario específico al servidor IIS oficial y funcionó. Gracias. – Amaranth

3

Puedo llegar un poco tarde, pero he encontrado que hay un problema en este método de la clase Directory. En lugar He usado DirectoryInfo con suplantación de esta manera:

new DirectoryInfo(path).Exists 

esta manera se evita el problema del cambio de identidad, el cual fue negado por nuestra área de TI.

¡Espero que esto ayude a alguien!

+0

Esto no resuelve el problema de la suplantación. La principal diferencia es que 'Directory' es una clase estática y' DirectoryInfo' es una instancia de una clase. –

1

Para futuras referencias, esto también funciona:

bool result = false; 
try 
{ 
    Directory.GetAccessControl(path); 
    result = true; 
} 
catch (UnauthorizedAccessException) 
{ 
    result = true; 
} 
catch 
{ 
    result = false; 
} 
Cuestiones relacionadas