2011-07-23 22 views
8

Estoy escribiendo un pequeño programa .NET en Windows 7. Una cosa que tiene que hacer es crear enlaces simbólicos, lo que parece requerir que tenga privilegios de administrador. También necesita poder trabajar con unidades de red mapeadas (por ejemplo, R: \, que en mi sistema se mapea a \\titanium\Private\)..NET Directory.Exists niega existencia de unidad de red asignada cuando se ejecuta como administrador

Estoy usando Directory.Exists(path) para verificar que exista una ruta.

Al ejecutar el programa como un usuario normal (cuenta de administrador, pero no como "administrador"), esto funciona bien en la unidad de red asignada.

Al ejecutar el programa como administrador (con UAC), no se encuentran los directorios que existen. Como resultado, el programa se niega a reconocer que R:\Steam Games\ es un directorio que realmente existe.

Estoy un poco desconcertado de por qué esto está sucediendo. El uso de la ruta UNC completa (\\titanium\Private\Steam Games\) tampoco funciona.

¿Alguien ha topado con esto antes? ¿Hay alguna buena solución? ¿Tengo que formatear las rutas diferentes (nota: la mayoría de ellos están formateados actualmente con Path.Combine, por lo que debería ser correcto).

Gracias por su ayuda.

(Como ejemplo, Directory.Exists(@"R:\Steam Games\") devuelve falso cuando se ejecuta como administrador, pero esa carpeta existe. La llamada de función devuelve correctamente true cuando se ejecuta con regularidad).

Editar: El problema parece ser que un administrador es técnicamente una cuenta de usuario diferente. Ni siquiera podía usar rutas de acceso UNC, porque solo estaba conectado a mi servidor de archivos con mi usuario habitual, no bajo "Administrador". Como una solución alternativa (relativamente hackosa), simplemente ejecuto mi programa con privilegios regulares y luego uso Process.Start para invocar una instancia de cmd.exe con los argumentos para crear un enlace simbólico (y el verbo "runas" para obtener el aviso de UAC).

+0

Ha sido elegido como cerrado fuera del tema. El problema aquí es UAC (y que el usuario UAC no está en la misma sesión que el usuario no UAC), y no tiene nada que ver con la programación. – Lucero

+9

Creo que esto es muy sobre el tema, como programador que necesita para estar lejos de los problemas que ocurren si un usuario final decide elevar su programa. –

+0

Estoy de acuerdo con Scott. Es un problema de programación común y, en mi opinión, este es un gran sitio para él. –

Respuesta

7

Las unidades asignadas en windows están ligadas a un contexto de usuario. Una unidad asignada a una cuenta: UserA, no será accesible para el UsuarioB. Sin embargo, podría crear la misma ruta de acceso unc mapeada a la misma letra de unidad bajo diferentes usuarios.

Sin embargo, debería funcionar el uso de la ruta completa de Unc.

Más información en support.microsoft.com: 1, 2.

+0

Las rutas de acceso UNC completas tampoco parecen funcionar. Sospecho que, de alguna manera, mi inicio de sesión en el recurso compartido de red está vinculado solo a mi usuario, por lo que si intento acceder al mismo recurso compartido, por ejemplo, "Administrador", esperará que me vuelva a autorizar. ¿Hay alguna forma de evitar esto? – Ethan

+0

Cualquiera que sea el usuario bajo el que se ejecuta la aplicación necesita permiso para la ruta de acceso unc. Si puede acceder a la ruta cuando inició sesión como ese usuario, entonces la aplicación debería poder acceder a la misma ruta mediante programación mediante Directory.Exists ... – mservidio

+0

Está utilizando una cuenta de administrador, pero ¿es esta una cuenta de administrador local? ¿Esta cuenta de administrador tiene acceso a la ruta remota? ¿Podrías verificar eso? – mservidio

1

Esto se ha discutido here. Aparentemente, en versiones anteriores de .Net Framework the documentation se menciona explícitamente que esto no es posible ("El método Exists no realiza autenticación de red. Si consulta un recurso compartido de red existente sin autenticación previa, el método Exists devolverá falso".) La documentación 4.0 ya no contiene esta oración, pero el comportamiento no ha cambiado.

Encontré una solución here (pero decidí no usarla).

0

La razón básica por la que no funciona es que el usuario de IIS no tiene permiso para acceder a la ruta. Cuando se ejecuta como usuario regular, el acceso se le da al usuario i.e para hacer que funcione es necesario dar permiso a la carpeta para IIS Siga la siguiente ruta de acceso UNC para trabajar en los servicios a cargo de IIS:

Propiedades -> Seguridad -> Editar -> Añadir - -> IIS_WPG

Cuestiones relacionadas