Standardmäßig werden Windows-Dienste (normalerweise C:\WINDOWS\system32
) im Verzeichnis sytem32 gestartet .
Gibt es eine Möglichkeit, ein anderes Arbeitsverzeichnis einzurichten? Ich denke an einige Registrierungsparameter darunter HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\SomeService
.
Also - kann das gemacht werden?
windows
configuration
service
directory
Tomalak
quelle
quelle
Antworten:
Sie können die DLL-Injection verwenden, um aufzurufen,
SetCurrentDirectory
nachdem der Prozess bereits gestartet wurde. Dies würde erfordern, dass Sie eine Injektoranwendung sowie die zu injizierende DLL erstellen. Es gibt einige Tutorials. wahrscheinlich sind die zwei besten, die ich gefunden habe:Sie benötigen eine angemessene Menge an C ++ - Programmierhintergrund (und eine funktionierende Build-Umgebung), um dies zu bewältigen.
Dies setzt jedoch voraus, dass der Dienst das aktuelle Verzeichnis betrachtet. Eine andere Möglichkeit ist, dass es verwendet
%path%
. Sie sagen, dass es "an beginntsystem32
, ein paar weitere Orte ausprobiert und schließlich ein eigenes Verzeichnis", also scheint mir dies wahrscheinlicher.Vergleichen Sie die Verzeichnisse, die Sie sehen,
procmon
mit Ihren%path%
. Wenn sie identisch sind, sollten Sie entweder dasSYSTEM %path%
oder das%path%
des Benutzers ändern, der den Dienst ausführt, sodass das Verzeichnis, in dem er durchsucht werden soll, an erster Stelle steht.Ich glaube jedoch, dass Fred Recht hat - es ist unwahrscheinlich, dass Sie dadurch einen signifikanten Leistungsvorteil sehen, es sei denn, dies geschieht sehr häufig. Einfache Dateiöffnungsvorgänge sind nicht besonders teuer, insbesondere wenn es sich um einen lokalen Pfad handelt und die Datei nicht vorhanden ist.
quelle
%PATH%
des Benutzerkontos, unter dem der Dienst ausgeführt wird, ist jedoch eine gute Idee.Wie bei MattB kenne ich keine Möglichkeit, das Arbeitsverzeichnis des Dienstes ohne Zugriff auf den Quellcode zu ändern. In diesem speziellen Szenario ist es wahrscheinlich, dass die zusätzlichen Verzeichnisprüfungen nicht so viel unnötige Festplattenaktivität im Verhältnis zu der für die Volltextindizierung erforderlichen E / A-Menge verursachen. Selbst wenn Sie sie wegoptimieren könnten, ist der Volltextindex von Natur aus festplattenintensiv.
quelle
Fügen Sie dem Parameterschlüssel einen Zeichenfolgenwert "AppDirectory" hinzu und legen Sie den Wert auf das gewünschte Arbeitsverzeichnis fest.
quelle
srvany
. Ich bin mir nicht sicher über normale Dienste.Tun Sie dies innerhalb der Service-Hauptfunktion:
GetModuleFilename
. Der Dateiname des Moduls (exe) einschließlich des Pfads wird im Formular abgerufenC:\path\to\exe\your_service.exe
.std::string
Funktionfind_last_of()
), um den letzten Backslash zu finden. Entfernen Sie von dort aus den String, um den Pfad zu Ihrem Modul und damit das Verzeichnis Ihrer Exe zu erhalten.SetCurrentDirectory
und voila!quelle