Domyślnie usługi Windows uruchamiają się w katalogu sytem32 (zwykle C:\WINDOWS\system32
).
Czy istnieje sposób na skonfigurowanie innego katalogu roboczego? Mam na myśli poniżej jakiś parametr rejestru HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\SomeService
.
Więc - czy można to zrobić?
windows
configuration
service
directory
Tomalak
źródło
źródło
Odpowiedzi:
Możesz użyć zastrzyku DLL, aby zadzwonić
SetCurrentDirectory
po uruchomieniu procesu. Wymagałoby to zbudowania aplikacji wtryskiwacza oraz biblioteki DLL do wstrzyknięcia. Istnieją niektóre samouczki; prawdopodobnie dwie najlepsze, które znalazłem to:Będziesz potrzebować przyzwoitej wiedzy programistycznej C ++ (i działającego środowiska kompilacji), aby się przez to przejść.
Zakłada się jednak, że usługa szuka bieżącego katalogu. Inną możliwością jest to, że używa
%path%
. Mówisz, że „zaczyna się odsystem32
, próbuje jeszcze kilku lokalizacji i ostatecznie własnego katalogu”, więc wydaje mi się to bardziej prawdopodobne.Porównaj katalogi w
procmon
swoim%path%
. Jeśli są takie same, rozważ zmodyfikowanie użytkownikaSYSTEM %path%
lub%path%
usługi obsługującej tę usługę, aby katalog, który chcesz przeszukać, był pierwszy.Uważam jednak, że Fred ma rację - mało prawdopodobne jest, abyś zauważył jakąkolwiek znaczącą poprawę wydajności, chyba że dzieje się to bardzo często. Proste operacje otwierania plików nie są szczególnie drogie, szczególnie jeśli jest to ścieżka lokalna, a plik tak naprawdę nie istnieje.
źródło
%PATH%
konta użytkownika, pod którym działa usługa, jest jednak przyzwoitym pomysłem.Podobnie jak MattB, nie znam żadnego sposobu na zmianę katalogu roboczego usługi bez dostępu do kodu źródłowego. W tym konkretnym scenariuszu prawdopodobne jest, że dodatkowe kontrole katalogów nie narzucają tak dużo niepotrzebnej aktywności dysku w stosunku do ilości operacji we / wy wymaganych dla operacji indeksowania pełnotekstowego. Nawet jeśli możesz je zoptymalizować, indeks pełnotekstowy będzie wymagał dużej ilości dysku ze względu na charakter bestii.
źródło
Dodaj wartość ciągu „AppDirectory” do klucza parametrów i ustaw wartość dla żądanego katalogu roboczego.
źródło
srvany
. Nie jestem pewien co do normalnych usług.Zrób to w ramach głównej funkcji usługi:
GetModuleFilename
. Pobiera nazwę modułu (exe) wraz ze ścieżką w formieC:\path\to\exe\your_service.exe
.std::string
funkcjifind_last_of()
), aby znaleźć ostatni ukośnik odwrotny. Odetnij / odetnij ciąg od tego momentu, aby uzyskać ścieżkę do modułu, a zatem do katalogu swojego pliku exe.SetCurrentDirectory
i voila!źródło