По умолчанию службы Windows запускаются в каталоге sytem32 (обычно C:\WINDOWS\system32
).
Есть ли способ настроить другой рабочий каталог? Я думаю о каком-то параметре реестра ниже HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\SomeService
.
Итак, можно ли это сделать?
windows
configuration
service
directory
Томалак
источник
источник
Ответы:
Вы можете использовать DLL-инъекцию для вызова
SetCurrentDirectory
после того, как процесс уже запущен. Это потребует от вас создания приложения-инжектора, а также DLL для внедрения. Существуют некоторые учебные пособия; вероятно, два лучших из них я нашел:Для этого вам понадобится приличный опыт программирования на C ++ (и рабочая среда сборки).
Однако это предполагает, что служба просматривает текущий каталог. Другая возможность заключается в том, что он использует
%path%
. Вы говорите, что он «начинаетсяsystem32
, пробует еще несколько мест и, в конечном итоге, свой собственный каталог», так что мне это кажется более вероятным.Сравните каталоги, которые вы видите
procmon
с вашими%path%
. Если они одинаковы, рассмотрите возможность изменения пользователяSYSTEM %path%
или%path%
пользователя, запустившего службу, так, чтобы каталог, который вы хотите найти, был первым.Однако я считаю, что Фред прав - вы вряд ли увидите какую-либо значительную выгоду в производительности, если не будете делать это очень часто. Простые операции открытия файлов не особенно дороги, особенно если это локальный путь, а файл на самом деле не существует.
источник
%PATH%
Тем не менее, изменение учетной записи, под которой работает служба, - неплохая идея.Как и MattB, я не знаю ни одного способа изменить рабочий каталог службы без доступа к исходному коду. Для этого конкретного сценария вполне вероятно, что дополнительные проверки каталогов не навязывают столько ненужной дисковой активности относительно количества операций ввода-вывода, требуемых для операции полнотекстовой индексации. Даже если вы сможете оптимизировать их, полнотекстовый индекс будет интенсивно использовать диск по природе зверя.
источник
Добавьте строковое значение «AppDirectory» в ключ параметров и установите желаемое значение рабочего каталога.
источник
srvany
. Не уверен насчет нормальных услуг.Сделайте это в основной функции сервиса:
GetModuleFilename
. Он извлечет имя файла модуля (exe), включая путь, в формеC:\path\to\exe\your_service.exe
.std::string
функциюfind_last_of()
), чтобы найти последний обратный слеш. Отрежьте / обрежьте строку оттуда, чтобы получить путь к вашему модулю и, следовательно, каталог вашего exe-файла.SetCurrentDirectory
и вуаля!источник