web-dev-qa-db-fra.com

Comment trouver le chemin exe du service Windows

J'ai un service Windows et je dois créer un répertoire pour stocker des informations. Le chemin du répertoire doit être relatif au fichier .exe du service Windows. Comment peut-on obtenir ce chemin?

48
NDeveloper
98
Incognito

Conseil: Si vous voulez trouver le chemin de démarrage du service Windows installé, regardez ici à partir du registre.

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\ + ServiceName

Il y a des clés sur le service Windows

34

Pour obtenir le chemin d'accès au service, vous pouvez utiliser l'objet Gestion. ref: https://msdn.Microsoft.com/en-us/library/system.management.managementobject(v=vs.110).aspxhttp: //. blogspot.com/2009/06/get-windowservice-executable-path-in.html

using System.Management;
string ServiceName = "YourServiceName";
using (ManagementObject wmiService = new ManagementObject("Win32_Service.Name='"+ ServiceName +"'"))
                {
                    wmiService.Get();
                    string currentserviceExePath = wmiService["PathName"].ToString();
                    Console.WriteLine(wmiService["PathName"].ToString());
                }
13
Abhay

Au lieu d'utiliser un répertoire relatif à l'exécutable, et donc d'avoir besoin des privilèges d'administrateur, pourquoi ne pas utiliser le répertoire de données d'application commun, accessible via 

Environment.GetFolderPath(SpecialFolder.CommonApplicationData)

Ainsi, votre application n'a pas besoin d'un accès en écriture à son propre répertoire d'installation, ce qui renforce votre sécurité.

12
Stewart
string exe = Process.GetCurrentProcess().MainModule.FileName;
string path = Path.GetDirectoryName(exe); 

svchost.exe est l'exécutable qui exécute votre service qui se trouve dans system32. Par conséquent, nous devons accéder au module qui est exécuté par le processus.

8
Sachin

Essaye ça

System.Reflection.Assembly.GetEntryAssembly().Location
8
ramin eftekhari

Le répertoire par défaut pour un service Windows est le dossier System32. Cependant, dans votre service, vous pouvez changer le répertoire actuel pour le répertoire que vous avez spécifié dans l'installation du service en procédant comme suit dans votre OnStart:

        // Define working directory (For a service, this is set to System)
        // This will allow us to reference the app.config if it is in the same directory as the exe
        Process pc = Process.GetCurrentProcess();
        Directory.SetCurrentDirectory(pc.MainModule.FileName.Substring(0, pc.MainModule.FileName.LastIndexOf(@"\")));

Edit: une méthode encore plus simple (mais je n’ai pas encore testé):

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

Cela a fait le tour pour moi

Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);    
1
Danw25