2010-05-14 3 views
44

J'ai un service Windows et j'ai besoin de créer un répertoire pour stocker quelques informations. Le chemin du répertoire doit être relatif au fichier exe du service Windows. Comment obtenir ce chemin de fichier exe?Comment trouver le service windows exe

+0

Je ne suis pas un développeur Windows mais êtes-vous sûr de vouloir cela? Ces informations n'appartiennent-elles pas au répertoire personnel de l'utilisateur ou à celui de 'LocalService'? –

+6

@Pekka Je ne suis pas un développeur Unix, mais les services système (démons) qui stockent des fichiers dans les répertoires personnels de l'utilisateur sont complètement insensés. – BrainSlugs83

Répondre

91
+9

Cette solution ne fonctionnera pas correctement si vous exécutez le service avec un compte différent ... – Lectere

+3

Lorsque je fais cela, pour un service s'exécutant en tant que système local, il évalue à c: \ windows \ system32 – schizoid04

11

Au lieu d'utiliser un répertoire par rapport à l'exécutable, et donc besoin des privilèges d'administrateur, pourquoi ne pas utiliser le répertoire de données d'application commune, qui est accessible par

Environment.GetFolderPath(SpecialFolder.CommonApplicationData) 

De cette façon votre application n'a pas besoin d'un accès en écriture à son propre répertoire d'installation, ce qui vous rend plus sûr.

+0

Aussi, dans Windows Vista et Windows 7, vous ne pouvez pas écrire dans le dossier des fichiers programme, même en tant qu'administrateur! –

2

Le répertoire par défaut pour un service Windows est le dossier System32. Dans votre service, cependant, vous pouvez changer le répertoire courant dans le répertoire que vous avez spécifié dans l'installation de 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 testé encore):

System.IO.Directory.SetCurrentDirectory(System.AppDomain.CurrentDomain.BaseDirectory); 
7
string exe = Process.GetCurrentProcess().MainModule.FileName; 
string path = Path.GetDirectoryName(exe); 

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

8

Essayez cette

System.Reflection.Assembly.GetEntryAssembly().Location 
30

Astuce: Si vous voulez trouver chemin démarrage du service Windows installé, regardez ici de registre.

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\ + ServiceName 

Il y a des touches sur service Windows

9

Pour obtenir le chemin pour le service, vous pouvez utiliser l'objet de gestion. ref: https://msdn.microsoft.com/en-us/library/system.management.managementobject(v=vs.110).aspx http://dotnetstep.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()); 
       } 
0

Si vous souhaitez obtenir l'accès du dossier Program Files ou tout autre utilisation de la programmation, vous devez utiliser le code ci-dessous qui est de fournir des droits à dossier spécifique.

private bool GrantAccess(string fullPath) 
     { 
      DirectoryInfo dInfo = new DirectoryInfo(fullPath); 
      DirectorySecurity dSecurity = dInfo.GetAccessControl(); 
      dSecurity.AddAccessRule(new FileSystemAccessRule(new SecurityIdentifier(WellKnownSidType.WorldSid, null), FileSystemRights.FullControl, InheritanceFlags.ObjectInherit | InheritanceFlags.ContainerInherit, PropagationFlags.NoPropagateInherit, AccessControlType.Allow)); 
      dInfo.SetAccessControl(dSecurity); 
      return true; 
     } 
Questions connexes