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?
Vous pouvez utiliser AppDomain.CurrentDomain.BaseDirectory
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
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());
}
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é.
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.
Essaye ça
System.Reflection.Assembly.GetEntryAssembly().Location
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);
Cela a fait le tour pour moi
Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);