2010-05-14 10 views
44

Ich habe einen Windows-Dienst und ich muss Verzeichnis erstellen, um einige Informationen zu speichern. Der Verzeichnispfad muss relativ zur Windows-Dienst-EXE-Datei sein. Wie kann dieser exe-Dateipfad abgerufen werden?So finden Sie Windows-Dienst-Exe-Pfad

+0

Ich bin kein Windows-Entwickler, aber sind Sie sicher, dass Sie das wollen? Gehören solche Informationen nicht in das persönliche Verzeichnis des Benutzers oder in den 'LocalService'? –

+6

@Pekka Ich bin kein Unix-Entwickler, aber Systemdienste (Daemons), die Dateien in den persönlichen Verzeichnissen des Benutzers speichern, klingen geradezu verrückt. – BrainSlugs83

Antwort

91
+9

Diese Lösung wird nicht ordnungsgemäß funktionieren, wenn Sie den Dienst mit einem anderen Konto ausführen ... – Lectere

+3

Wenn dies geschieht, wird für einen Dienst, der als lokales System ausgeführt wird, c: \ windows \ system32 – schizoid04

11

Statt ein Verzeichnis in Bezug auf die ausführbare Datei zu verwenden, und daher Administratorrechte benötigen, warum nicht die gemeinsame Anwendungsdatenverzeichnis verwenden, die durch

Environment.GetFolderPath(SpecialFolder.CommonApplicationData) 

Auf diese Weise zugänglich ist Ihre App benötigt keinen Schreibzugriff auf ihr eigenes Installationsverzeichnis, wodurch Sie sicherer sind.

+0

Auch in Windows Vista und Windows 7, Sie können nicht in den Ordner Programmdateien schreiben, auch nicht als Administrator! –

2

Das Standardverzeichnis für einen Windows-Dienst ist der System32-Ordner. Sie können das aktuelle Verzeichnis in das Verzeichnis, das Sie in den Dienst der Installation angegeben haben jedoch die folgenden in Ihrem OnStart in Ihrem Dienst, ändern, indem Sie:

 // 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: eine noch einfachere Methode (aber ich habe nicht getestet noch):

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

svchost.exe ist die ausführbare Datei, die Ihren Dienst, der in system32 ist. Daher müssen wir zu dem Modul gelangen, das vom Prozess ausgeführt wird.

8

diesen

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

Tipp Versuchen Sie: Wenn Sie Startpfad des installierten Windows-Dienstes finden wollen, hier aus der Registry.

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\ + ServiceName 

Es gibt Tasten über Windows-Dienst

9

Um Pfad für den Dienst erhalten Sie Management-Objekt verwenden können. 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

Wenn Sie den Zugriff von Ordner Programme erhalten möchten, oder jede andere mit der Programmierung sollten Sie den folgenden Code verwenden, die Rechte für die bestimmten Ordner ist.

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; 
     }