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
Antwort
Sie können AppDomain.CurrentDomain.BaseDirectory
Diese Lösung wird nicht ordnungsgemäß funktionieren, wenn Sie den Dienst mit einem anderen Konto ausführen ... – Lectere
Wenn dies geschieht, wird für einen Dienst, der als lokales System ausgeführt wird, c: \ windows \ system32 – schizoid04
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.
Auch in Windows Vista und Windows 7, Sie können nicht in den Ordner Programmdateien schreiben, auch nicht als Administrator! –
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);
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.
diesen
System.Reflection.Assembly.GetEntryAssembly().Location
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
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());
}
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;
}
- 1. So finden Sie Bildverschlüsselungsalgorithmus
- 2. So finden Sie Median
- 3. So finden Sie doppelte Feldkombination
- 4. So finden Sie alle Immobilienlistendaten?
- 5. So finden Sie Max Date
- 6. So finden Sie langsamste Abfragen
- 7. So finden Sie Javascript Syntaxfehler
- 8. So finden Sie den Kollisionsort
- 9. So finden Sie überlappende Artikel?
- 10. So finden Sie ausgecheckt Dateien
- 11. So finden Sie alle Datenbankreferenzen
- 12. So finden Sie Joomla-Stammverzeichnis
- 13. Einheit3d. So finden Sie falsches konvexes Netz zu finden
- 14. Crossfilter - So finden Sie min/max
- 15. So finden Sie Ordner in Google Drive
- 16. So finden Sie die Länge eines LPCSTR
- 17. So finden Sie Expr #### im Ausführungsplan
- 18. So finden Sie die Versionsnummer von libxxx.a
- 19. So finden Sie, welcher Thread feststeckt
- 20. So finden Sie den Wochentag - Java
- 21. So finden Sie die innereHTML eines Elements
- 22. So finden Sie einen Schauspieler in Caf
- 23. So verwenden Sie Projektil-finden-Test-Datei
- 24. So finden Sie den Tag eines Datums
- 25. So finden Sie "Löcher" in einer Tabelle
- 26. So finden Sie UDID für iOS9
- 27. ZFS: So finden Sie eine gelöschte Festplatte?
- 28. So finden Sie die cdh-Version hadoop
- 29. So finden Sie Datensätze nach Monat Datamapper
- 30. So finden Sie zuverlässig ähnliche Zeichenfolgen wie
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'? –
@Pekka Ich bin kein Unix-Entwickler, aber Systemdienste (Daemons), die Dateien in den persönlichen Verzeichnissen des Benutzers speichern, klingen geradezu verrückt. – BrainSlugs83