100 votes

Dans quel répertoire s'exécute un service Windows ?

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

Dans le service, j'ai un morceau de code comme 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... ?

0 votes

L'utilisateur qui exécute le service a-t-il les bonnes permissions sur le fichier ?

111voto

0xA3 Points 73439
System.Diagnostics.Trace.WriteLine(Directory.GetCurrentDirectory());

affichera le répertoire courant. Placez ce code dans la méthode de démarrage de votre service et utilisez un outil comme DebugView pour vérifier la sortie. Vous connaîtrez alors le dossier de démarrage de votre service.

Cette technique simple sera utile pour résoudre de nombreux problèmes dans le développement des services, notamment pour déboguer le démarrage des services.

Vous vous attendiez probablement à ce que le dossier de travail de votre service soit le dossier dans lequel se trouve l'exécutable du service (moi aussi). Vous pouvez changer ce dossier en utilisant les lignes de code suivantes :

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

93voto

Jeff Points 4497

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

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

Pour plus d'informations, voir Responsable du contrôle des services à MSDN .

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

1 votes

Svchost.exe est un hôte de service pour la plupart des services internes de Windows. Les services peuvent, et dans le cas des services non-Windows, s'exécutent très probablement dans un hôte exe différent.

1 votes

Merci - en déposant le fichier à cet endroit, cela fonctionne et je peux confirmer cet emplacement : c : \windows\system32

1 votes

@Guy - J'ai essayé de faire des recherches à ce sujet. Je n'ai pas trouvé de "bonne" raison, mais je pense que c'est parce que c'est le répertoire à partir duquel le SCM (Service Control Manager) fonctionne, et qu'il est donc transmis au processus enfant (le service) à partir de l'environnement du processus parent.

18voto

yantaq Points 142

Vous pouvez le faire fonctionner comme ça :

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

1 votes

+1, cela permet au reste de l'application de fonctionner comme s'il s'agissait d'un .exe normalement invoqué où le répertoire courant est son chemin. Merci, c'est exactement ce dont j'avais besoin ! J'ai évité d'avoir à réécrire le code qui utilisait des chemins relatifs.

2voto

Riga Points 453

Je voulais aussi savoir dans quel dossier un service Windows était exécuté, mais le code source ne m'appartenait pas et je ne pouvais pas le modifier. Taper dans l'invite de commande sc qc <service name> affiche le dossier dans BINARY_PATH_NAME.

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

lorsque la requête MyService est obtenue :

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

0voto

Srinivas Points 53

Desde SC démarre le service dans le dossier /Start in:/ : Une alternative simple est d'utiliser nssm.cc - cela vous donne la possibilité de spécifier un répertoire de départ.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X