Dans quel répertoire un service Windows est-il exécuté?

J’ai créé un service Windows .NET très simple et l’ai installé à l’aide de l’utilitaire InstallUtil.exe.

Dans le service, j’ai un morceau de code en tant que tel:

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

J’ai créé un fichier appelé test_file.txt dans le même répertoire que le service mais la partie commentée du code n’est jamais exécutée …?

Les services sont démarrés à partir d’une application appelée Service Control Manager. Cette application réside dans le répertoire système % WinDir% \ System32

Sur Windows 7 Ultimate – 64 bits, ce chemin est en fait: % WinDir% \ SysWOW64

Pour plus d’informations, voir Service Control Manager sur MSDN .

Merci Harper Shelby pour avoir signalé le problème avec le message original.

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

va sortir le répertoire en cours. Placez ce code dans la méthode de démarrage de votre service et utilisez un outil tel que DebugView pour vérifier la sortie. Ensuite, vous connaîtrez le dossier de démarrage de votre service.

Cette technique simple sera utile avec de nombreux problèmes de développement de services, en particulier pour déboguer le démarrage du service.

Vous vous attendiez probablement à ce que le dossier de travail de votre service soit le dossier contenant l’exécutable du service (moi aussi). Vous pouvez modifier ce dossier en utilisant les lignes de code suivantes:

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

Vous pouvez le faire fonctionner ainsi:

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

Nous voulions également savoir dans quel dossier fonctionnait un service Windows, mais le code source n’était pas le mien, nous ne pouvions donc pas le modifier. En tapant l’invite de commande sc qc affiche le dossier dans BINARY_PATH_NAME.

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

quand la requête MyService obtient:

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