2009-05-19 31 views
56

He creado un servicio .NET Windows muy simple y lo instalé usando la utilidad InstallUtil.exe.¿En qué directorio se ejecuta un servicio de Windows?

En el servicio que tengo una pieza de código como tal:

if (File.Exists("test_file.txt")) 
{ 
    // Do something clever 
} 

He creado un archivo llamado test_file.txt en el mismo directorio que el servicio, pero la parte del código comentado no está siendo ejecutado...?

+0

¿El usuario que ejecuta el servicio tiene permisos correctos en el archivo? – CSharpAtl

Respuesta

51

Los servicios se inician desde una aplicación llamada Service Control Manager. Esta aplicación vive en el directorio del sistema % windir% \ System32

en un Windows 7 Ultimate - 64 bits de este camino es en realidad: % windir% \ SysWOW64

Para más información ver Service Control Manager at MSDN.

Gracias a Harper Shelby por señalar un problema con la publicación original.

+1

svchost.exe es un host de servicio para la mayoría de los servicios internos de Windows. Los servicios pueden, y en el caso de los servicios que no son de Windows, probablemente se ejecutan en un host exe diferente. – Michael

+2

Directorio correcto, razón equivocada. –

+1

Gracias - soltar el archivo allí lo hace funcionar para que pueda confirmar esa ubicación: c: \ windows \ system32 – Guy

78
System.Diagnostics.Trace.WriteLine(Directory.GetCurrentDirectory()); 

dará salida al directorio actual. Coloque ese código en el método de inicio de su servicio y use una herramienta como DebugView para verificar el resultado. Entonces sabrá la carpeta de inicio de su servicio.

Esta técnica simple será útil con muchos problemas en el desarrollo del servicio, especialmente para depurar el inicio del servicio.

Probablemente esperaba que la carpeta de trabajo de su servicio sea la carpeta donde está el ejecutable del servicio (yo también). Puede cambiar a la carpeta mediante las siguientes líneas de código:

System.IO.Directory.SetCurrentDirectory(System.AppDomain.CurrentDomain.BaseDirectory); 
+1

Eso es muy consejo genial - ¡gracias! – Guy

+1

+! para una buena solución al problema. –

11

Usted puede hacer que funcione de esta manera:

string cwd = Path.GetDirectoryName(Environment.GetCommandLineArgs()[0]); 
Directory.SetCurrentDirectory(cwd ?? "."); 
+1

+1, esto permite que el resto de la aplicación funcione como si fuera un .exe normalmente invocado donde el directorio actual es su ruta. Gracias, esto es exactamente lo que necesitaba! Evitó tener que volver a escribir el código que utilizaba rutas relativas. – Paul

2

también quería saber en qué carpeta un servicio de Windows estaba en funcionamiento pero el código fuente no era mío, así que no pude modificarlo. Al escribir en Símbolo del sistema sc qc <service name>, se muestra la carpeta en BINARY_PATH_NAME.

C:\>sc qc 
DESCRIPTION: 
     Queries the configuration information for a service. 
USAGE: 
     sc <server> qc [service name] <bufferSize> 

cuando la consulta MyService get:

C:> sc qc MyService

[SC] QueryServiceConfig SUCCESS 

SERVICE_NAME: MyService 
     TYPE    : 10 WIN32_OWN_PROCESS 
     START_TYPE   : 3 DEMAND_START 
     ERROR_CONTROL  : 1 NORMAL 
     BINARY_PATH_NAME : "D:\Routines\MyService\MyService.exe" 
     LOAD_ORDER_GROUP : 
     TAG    : 0 
     DISPLAY_NAME  : MyService 
     DEPENDENCIES  : 
     SERVICE_START_NAME : LocalSystem 
+0

Esa es la ruta donde se encuentra el servicio binario, que no garantiza que sea igual al directorio "actual en funcionamiento" del servicio que puede cambiar varias veces durante el tiempo de actividad del proceso (de servicio). Los nombres de archivo relativos (como en el ejemplo de OP) se resuelven con el directorio de trabajo actual, no con el directorio donde se encuentra el binario ejecutable. –

+0

'sc qc apache2.4' espectáculos' ... BINARY_PATH_NAME: "E: \ root \ Public Cache \ Apache Httpd \ httpd-2.4.20-x86-VC11 \ Apache24 \ bin \ httpd.exe" -k runservice', pero el directorio de trabajo es en cambio '% WinDir% \ System32' – Pacerier

Cuestiones relacionadas