2010-06-23 35 views
7

Tengo una carpeta compartida de red asignada a una letra de unidad, que es accesible desde Windows Explorer, desde el símbolo del sistema y desde mi aplicación WinForms sin problema. También se puede acceder desde mi servicio de Windows utilizando una ruta UNC.No puedo acceder a archivos en la unidad de red asignada desde un servicio de Windows

Sin embargo, cuando intento acceder a esta ubicación de red utilizando una letra de unidad asignada desde el servicio de Windows, el acceso falla. El servicio de Windows está configurado para usar mis credenciales de cuenta de "inicio de sesión" personal, que es el mismo en todos los casos anteriores. Soy un administrador

Muchos sitios de clientes utilizan letras de unidad para recursos compartidos de red y no siempre puedo controlar esto y forzarlos a especificar rutas de acceso UNC. Necesito poder acceder a recursos compartidos de red usando letras de unidad desde un servicio de Windows.

¿Qué debo hacer para configurar mi servicio de Windows, para que pueda acceder a las carpetas compartidas de red asignadas a las letras de unidad? Mi servicio de Windows está escrito en C#.

Respuesta

9

Lo sentimos; you can't access mapped drives from Windows services. Como sugirió Sheng, puede usar un proceso de IU para obtener la ruta UNC desde una unidad mapeada y luego pasarla al servicio, que debe usar la ruta UNC.

+0

Gracias por el artículo. Microsoft deja en claro que uno no debe acceder a las unidades mapeadas desde un servicio de Windows. – Elan

+0

El artículo citado solo establece que los servicios no deberían usar o cambiar las asignaciones de unidades, eso _no significa que no se puede hacer.En el artículo de MS KB, incluso lo implica cuando dice: "Por lo tanto, las unidades redirigidas no se pueden compartir entre procesos que se ejecutan en cuentas de usuario diferentes". En otras palabras, la sesión de inicio de sesión y el servicio se deben ejecutar con las mismas credenciales. Se puede hacer. – Garen

+0

@Garen: cada lanzamiento importante de Windows aumenta la separación entre los servicios y el código de escritorio, por razones de seguridad. * Hay * formas de obligarlo a funcionar ahora. También hubo formas de forzarlo en versiones anteriores de Windows que ya no funcionan. No es compatible; solo crearías un producto que podría romperse en una futura versión de Windows. (Estoy hablando por experiencia ...) –

4

unidades mapeadas son por objetos de sesión. De modo que cada sesión interactiva tiene su propia asignación y la sesión de servicio tiene otra asignación de unidad. Para obtener la ruta UNC correcta de una unidad mapeada, debe llamar a WNetGetConnection en la sesión correcta.

Se puede utilizar cualquier método de comunicación entre períodos de sesiones para iniciar la solicitud y obtener el resultado en el servicio, como WCF, tubería con nombre, tomas de corriente, etc.

+0

Muchas gracias. ¡Pude convertir la letra de la unidad a la ruta UNC usando pinvoke y WNetGetConnection! – Elan

0

hi Elan i enfrentó el mismo problema en mi proyecto y me encontré con una solución

y se espera que el trabajo siga mis pasos

    if (api.Docusign_download(strDocuSignUserName, strDocuSignPassword, strDocuSignIntegratorKey, EnvelopeID, Environment.ExpandEnvironmentVariables("%temp%")) == true) 
        { 
         if (m_streamWriter1 != null) 
         { 
          m_streamWriter1.WriteLine(" This envelop id is Downloaded and update the table" + EnvelopeID + DateTime.Now.ToShortDateString() + " " + DateTime.Now.ToShortTimeString() + "\n"); 
         } 

         fpath1 = Environment.ExpandEnvironmentVariables("%temp%") + '\\' + EnvelopeID + '1' + ".pdf"; 
         fpath2 = Environment.ExpandEnvironmentVariables("%temp%") + '\\' + EnvelopeID + '2' + ".pdf"; 
         if (System.IO.File.Exists(fpath1)) 
         { 
          fso = new FileSystemObject(); 
          // fso.CopyFile(fileLoc, "\\\\Tech-Pro-01\\D\\", true); i download the file in temp folder and copy file to unc path ur expected work on reverse like access file to unc path he does not work directly but work in in direct access like temp folder to services 
          fso.CopyFile(fpath1, UNC, true); 
          fso.CopyFile(fpath2, UNC, true); 
          fso.DeleteFile(fpath1, true); 
          fso.DeleteFile(fpath2, true); 
          //System.IO.File.Move(fileLoc, fileLocMove); 

soy sólo usar la escritura de aplicaciones heredadas en VB sistema de archivos FSO objeto

1, asegúrese de que el acceso a la ruta del mapa en iuser y acceso a servicios de red habilite la máquina proporcionada asignada 2, agregando el sistema de scripting de referencia

3, y el ejemplo vía UNC \ equipo \ sharedname \ carpeta \ archivo 4, justo fso.copyfile (uncpath, tempfoler, true) 5, u acceder a un archivo en la carpeta temporal que se espera que el acceso y trabajo perfecto

el acceso a la carpeta temp "c: \ windows \ temp porque proceess puede tomar la carpeta temp de windows solamente

esperanza u Elan es funcionar perfectamente

gracias y saludos

jagadeesh Govindaraj Pillai [email protected]

Cuestiones relacionadas