Служба Windows: Чи можна налаштувати поточний робочий каталог?


11

За замовчуванням служби Windows запускаються в каталозі sytem32 (зазвичай C:\WINDOWS\system32).

Чи є спосіб налаштувати інший робочий каталог? Я думаю про якийсь параметр реєстру внизу HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\SomeService.

Отже - чи можна це зробити?


3
@Tomalak: Це сервіс, який ви написали? Ви можете це зробити за допомогою коду, але я не думаю, що існує спосіб через налаштування служби.
МетБ

Ні, це не послуга, яку я написав. Я сподівався на деякі маловідомі налаштування реєстру тут.
Томалак

Яка мета цього робити?
користувач35115

@ user35115: Ну, чесно кажучи ... Під час відстеження непов’язаної проблеми з прокльоном я помітив, що певний сервіс важкого вводу / виводу (повнотекстовий індексатор) постійно перевіряє наявність власних файлів у неправильних місцях (досить тупо). Він починається з system32, пробує ще кілька локацій, а згодом і власний каталог. Я подумав, що коли він буде запущений у власному каталозі, він буде робити менше зайвих перевірок файлів. Не те, щоб це не працювало зараз, але все ж змусило мене задуматися, чи є місце для вдосконалення.
Томалак

1
@ user35115, Щоб уникнути необхідності масових змін налаштувань конфігурації певного додатка (скажімо, Apache тощо), які відносяться до робочого каталогу.
Pacerier

Відповіді:


5

Ви можете використовувати ін'єкцію DLL для виклику SetCurrentDirectoryпісля того, як процес вже запущений. Для цього знадобиться створити інжекторну програму, а також DLL для введення. Існують деякі навчальні посібники; Мабуть, два найкращих, яких я знайшов, це:

Вам знадобиться гідна кількість програм програмування C ++ (і робоче середовище побудови), щоб пройти це.

Однак це передбачає, що служба переглядає поточний каталог. Інша можливість - це використання %path%. Ви кажете, що це "починається з system32, намагається ще кілька місць розташування, а згодом і власний каталог", тому мені це здається більш імовірним.

Порівняйте каталоги, які ви бачите у procmonсвоїх %path%. Якщо вони однакові, розглянути питання про зміну або SYSTEM %path%або %path%користувача запустити службу, так що каталог ви хочете, щоб шукати в першу чергу.

Я вважаю, що Фред має рацію - навряд чи ви побачите якусь істотну користь від виконання будь-якого з цих дій, якщо це не дуже часто. Прості операції з відкриттям файлів не є особливо дорогими, особливо якщо це локальний шлях і файл насправді не існує.


Перша річ, яка мені прийшла в голову, була змінна середовища PATH. Вставлення контуру служби на початку змінної PATH негативно вплине на продуктивність майже будь-якого іншого додатка, тому я б не радив цього.
Marnix van Valen

У мене немає важких цифр, щоб підкріпити це в будь-якому випадку, але моя інтуїція підказує мені, що від зміни шляху не відбудеться практичного збільшення продуктивності або втрати. Це досить поширений сценарій; Ніхто не звинувачує, скажімо, Інструменти підтримки Windows або SQL Server, що негативно впливають на продуктивність системи, коли вона змінює шлях під час встановлення. Це не перший раз, коли я бачив, як хтось дивиться на промову і переходить "omg, дивись на всі ці файли, доступ!", Не розуміючи, що це характерно для більшості програм.
поділ

+1 для творчості. :-) Я повністю розумію, що ці файлові операції не впливають помітно на продуктивність, тому я не збираюся насправді заважати писати рішення для ін’єкцій DLL. %PATH%Хоча зміна облікового запису користувача, під яким працює служба, є гідною ідеєю.
Томалак

1
Створення спеціального користувача для запуску цієї послуги та зміна% PATH% для цього користувача звучить як дуже хороший шлях. +1
Сонячний

@fission: Так, це означає, що я приймаю вашу відповідь. ;) Це не те, на що я сподівався, але воно настільки близько, як воно наближається.
Томалак

1

Як і MattB, я не знаю жодного способу змінити робочий каталог служби без доступу до вихідного коду. Для цього конкретного сценарію, ймовірно, що додаткові перевірки каталогів не накладають на себе багато зайвої активності диска відносно кількості вводу-виводу, необхідного для операції індексації повного тексту. Навіть якщо ви зможете їх оптимізувати далеко, повнотекстовий покажчик буде інтенсивно дисковим за характером звіра.


1

Додайте рядок "AppDirectory" до параметра "Параметри" та встановіть значення у бажаній робочій директорії.


Гм. Тільки тестований, здається, не працює (у Windows 7 використовується тип даних REG_EXPAND_SZ). Чи можете ви ще раз підтвердити, чи справді це працює для вас?
Томалак

Це працює при використанні srvany. Не впевнений у звичайних послугах.
Костянтин Спірін

1

Виконайте це в рамках основної функції Сервісу:

  • Подзвоніть на GetModuleFilename. Він отримає у формі ім'я файлу модуля (exe), включаючи шлях C:\path\to\exe\your_service.exe.
  • Використовуйте рядкові маніпуляції (можливо, використовуючи std::stringфункцію find_last_of()), щоб знайти останній похилий ривок. Складіть / обріжте рядок звідти, щоб отримати шлях до вашого модуля і, отже, до каталогу вашого EXE.
  • Зателефонуйте до функції SetCurrentDirectoryта вуаля!

1
не забудьте передати нуль параметру HMODULE у виклику функції GetModuleFilename :)
uprightech
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.