2011-10-06 49 views
5

Tengo algunos problemas para escribir en una unidad de red mapeada (P :) en Windows 7 desde mi programa Delphi. Cuando intento, por ejemplo, ForceDirectories('P:\test\folder'), aparece un error (ruta no encontrada).¿Por qué mi programa no reconoce rutas mapeadas UNC?

He intentado escribir en la ruta UNC en el código (ForceDirectories('\\computername\share\test\folder')) y eso funciona. Sin embargo, ExpandUNCFileName('P:\') no parece funcionar; devuelve 'P: \'. En Windows XP, ExpandUNCFileName('P:\') devuelve la ruta UNC.

¿Cómo obtengo la ruta de acceso UNC en Delphi en Windows 7, o bien escribo en una unidad de red mapeada?

En una investigación posterior, es como si me falta algún tipo de inicialización en Windows. Tengo otra aplicación (app2) que usa un TcxShellComboBox (un componente de DevExpress). Después de haber navegado hasta P: en ese cuadro combinado, en la aplicación 2, las llamadas al ExpandUNCFileName funcionan correctamente en la primera aplicación. Lo mismo con FileExists en archivos bajo P :, devuelve False antes de navegar a P: en app2, devuelve true después y hasta que la computadora se reinicie.

+0

¿Es esto por casualidad un servicio? El comportamiento que describes no tiene nada que ver con Delphi y ocurre porque la asignación de unidades no está configurada para el proceso. –

+0

Verifique que tiene la letra de unidad asignada al recurso compartido.Pude reproducir su problema solo si la letra de la unidad no estaba asignada (Delphi 7, 2007 XE). – crefird

+0

No es un servicio, es una aplicación de formularios VCL. – MGH

Respuesta

10

De acuerdo con Microsoft KB Article, si el Control de cuentas de usuario está habilitado, y si asigna una unidad de red desde el Explorador de Windows (no elevado), los programas elevados no tendrán acceso a esa unidad. Cita:

Si un usuario ha iniciado sesión en Windows Vista o Windows 7, y si el Control de cuentas de usuario está habilitada, un programa que utiliza filtros en el acceso del usuario token y un programa que utiliza el token de acceso de administrador completo del usuario puede funcionar al mismo tiempo. Como LSA creó los tokens de acceso durante dos sesiones de inicio de sesión separadas, los tokens de acceso contienen ID de inicio de sesión independientes.

Cuando se asignan recursos compartidos de red, se vinculan a la sesión de inicio de sesión actual para el token de acceso al proceso actual. Esto significa que, si un usuario utiliza el símbolo del sistema (Cmd.exe) junto con el token de acceso filtrado para asignar un recurso compartido de red, el recurso compartido de red no está asignado a los procesos que se ejecutan con el token de acceso de administrador completo.

Como mencionó en los comentarios que ejecuta Delphi "como administrador" (elevado), este es su problema.

Soluciones:

  1. no se ejecutan Delphi elevados si no es necesario. Si necesita una elevación en su software, sepárelo en dos partes (elevado y no elevado) y acceda a la unidad de red asignada desde la primera parte. Luego acceda a la otra parte usando un objeto COM elevado, o simplemente ejecutando un ejecutable por separado.

  2. una unidad de red desde un símbolo de red elevada, por lo que la unidad de red asignada estarán disponibles para el usuario elevada:

    a. Abra el símbolo del sistema elevado (ejecute "cmd.exe" como administrador)

    b. Tipo net use p: \\computername\share\test\folder

+2

si elige la segunda solución, necesitará asignarla por segunda vez a su usuario habitual (sin elevación) si generalmente la necesita ... – Whiler

Cuestiones relacionadas