Назад | Перейти на главную страницу

Служба Windows: Могу ли я настроить текущий рабочий каталог?

По умолчанию службы Windows запускаются в каталоге sytem32 (обычно C:\WINDOWS\system32).

Есть ли способ создать другой рабочий каталог? Я думаю о параметре реестра ниже HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\SomeService.

Итак - можно ли это сделать?

Вы можете использовать DLL-инъекцию для вызова SetCurrentDirectory после того, как процесс уже запущен. Для этого вам потребуется создать приложение-инжектор, а также DLL для инъекции. Существуют некоторые учебные пособия; наверное, два лучших из них, которые я нашел:

Чтобы пройти через это, вам потребуется приличный опыт программирования на C ++ (и рабочая среда сборки).

Однако это предполагает, что служба просматривает текущий каталог. Другая возможность состоит в том, что он использует %path%. Вы говорите, что это "начинается с system32, пробует еще несколько местоположений и, в конечном итоге, свой собственный каталог ", так что мне это кажется более вероятным.

Сравните каталоги, которые вы видите в procmon с вашим %path%. Если они одинаковы, рассмотрите возможность изменения SYSTEM %path% или %path% пользователя, запустившего службу, так что каталог, в котором вы хотите выполнить поиск, был первым.

Однако я считаю, что Фред прав - вы вряд ли увидите какое-либо существенное улучшение производительности, если сделаете что-либо из этого, если только это не произойдет. очень часто. Простые операции открытия файла не особенно дороги, особенно если это локальный путь, а файл на самом деле не существует.

Сделайте это в основной функции службы:

  • Позвонить GetModuleFilename. Он получит имя файла модуля (exe), включая путь, в форме C:\path\to\exe\your_service.exe.
  • Используйте строковые манипуляции (возможно, используя std::string функция find_last_of()), чтобы найти последнюю обратную косую черту. Удалите / обрежьте строку оттуда, чтобы получить путь к вашему модулю и, следовательно, каталог вашего exe.
  • Сделать вызов функции SetCurrentDirectory и вуаля!

Добавьте строковое значение «AppDirectory» к ключу параметров и установите значение для желаемого рабочего каталога.

Как и MattB, я не знаю способа изменить рабочий каталог службы без доступа к исходному коду. Для этого конкретного сценария вполне вероятно, что дополнительные проверки каталогов не налагают столько ненужной дисковой активности по сравнению с объемом операций ввода-вывода, необходимого для операции полнотекстового индексирования. Даже если вы могли бы их оптимизировать, полный текстовый индекс будет занимать много места на диске по природе зверя.