Изменение «Путь к исполняемому файлу» службы Windows

253

Я хотел бы изменить путь к своему приложению, но это нарушает его, потому что служба все еще указывает на старое местоположение.

Зайдя в, Administrative Tools > Servicesвы можете открыть диалоговое окно свойств и просмотреть Path to executable, но изменить его невозможно.

Есть ли способ, которым пользователь может изменить путь службы без переустановки приложения?

GenericJon
источник

Ответы:

245

Существует также такой подход, который наблюдается в SuperUser, который использует scкомандную строку вместо изменения реестра:

sc config <service name> binPath= <binary path>

Примечание: пробел после binPath=важен. Вы также можете запросить текущую конфигурацию, используя:

sc qc <service name>

Это отображает вывод, похожий на:

[SC] QueryServiceConfig УСПЕХ

SERVICE_NAME: ServiceName

    TYPE               : 10  WIN32_OWN_PROCESS
    START_TYPE         : 2   AUTO_START
    ERROR_CONTROL      : 1   NORMAL
    BINARY_PATH_NAME   : C:\Services\ServiceName
    LOAD_ORDER_GROUP   :
    TAG                : 0
    DISPLAY_NAME       : <Display name>
    DEPENDENCIES       :
    SERVICE_START_NAME : user-name@domain-name
Найл Коннотон
источник
24
Я рекомендовал бы этот подход по прямым изменениям реестра. Для многих путей требуются строки в кавычках, которые можно ввести следующим образом, например, с MS SQL Server: sc config mssqlserver binPath= "\"F:\SQL DATA\MSSQL10.MSSQLSERVER\MSSQL\Binn\sqlservr.exe\" -sMSSQLSERVER"
Марк Дурдин,
2
Это также, вероятно, немного лучше в сценарии развертывания, чем метод прямого изменения реестра.
Найл Коннотон
Сладкий. Чище, чем копаться в рег. ** Примечание: вам нужно будет закрыть и открыть services.msc, чтобы увидеть изменения.
Йонск
1
Если вы получаете [SC] QueryServiceConfig FAILED 122:после sc qc Xиспользования sc qc X 1000см. Это
Raphael
13
Если вы используете это из PowerShell, убедитесь, что вы используете sc.exe, а не голыйsc
Fiat
292

Это включает в себя редактирование реестра, но информацию о сервисе можно найти в HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services. Найдите сервис, который вы хотите перенаправить, найдите ImagePathподраздел и измените это значение.

Мэтт МакХью
источник
3
Хотя в конечном итоге это приводит к данным реестра, я должен отметить, что существуют специальные функции Windows API для работы со службой. Следует избегать прямого изменения реестра (потому что вы не можете быть уверены, что еще Windows изменяет, когда изменяет путь к exe, например), если вы не абсолютно уверены в том, что вы делаете.
lospejos
3
@lospejos "Я должен упомянуть, что существуют специальные функции Windows API для работы со службой" ... что будет?
Ник М
Если кто-то не видит путь службы, обновленный в Services.msc, попробуйте убить mmc.exe "taskkill / F / IM mmc.exe" в cmd
Drag0nKn1ght
10

Вы также можете сделать это с помощью PowerShell:

Get-WmiObject win32_service -filter "Name='My Service'" `
    | Invoke-WmiMethod -Name Change `
    -ArgumentList @($null,$null,$null,$null,$null, `
    "C:\Program Files (x86)\My Service\NewName.EXE")

Или:

Set-ItemProperty -Path "HKLM:\System\CurrentControlSet\Services\My Service" `
    -Name ImagePath -Value "C:\Program Files (x86)\My Service\NewName.EXE"
Грег Сансом
источник
3

Откройте Run (win + R), введите «Regedit.exe», чтобы открыть «Редактор реестра», перейдите к

HKEY_LOCAL_MACHINE \ System \ CurrentControlSet \ Services

найдите « Apache2.4 », откройте папку и найдите « ImagePath » с правой стороны, откройте «ImagePath» под « значением Data » и введите следующий путь:

«C: \ xampp \ apache \ bin \ httpd.exe» -k runservice для XAMPP для других указывает на местоположение, где установлен Apache, и внутри находит папку bin «C: (установленное Apache местоположение) \ bin \ httpd.exe» -k runservice

Энтони Джозеф
источник
0

Вы не можете напрямую редактировать свой путь для выполнения услуги. Для этого вы можете использовать команду sc,

SC CONFIG ServiceName binPath= "Path of your file"

Например:

sc config MongoDB binPath="I:\Programming\MongoDB\MongoDB\bin\mongod.exe --config I:\Programming\MongoDB\MongoDB\bin\mongod.cfg --service"
Codemaker
источник
0

Небольшая модификация ответа этого @CodeMaker для любого, как я, который пытается изменить сервис MongoDB для использования аутентификации.

Когда я посмотрел на «Путь к исполняемому файлу» в «Сервисах», в исполняемой строке уже содержались речевые метки. Поэтому мне пришлось внести незначительные изменения в его пример.

Чтобы быть конкретным.

  1. Тип службы в Windows
  2. Найдите MongoDB (или службу, которую вы хотите изменить) и откройте службу, убедившись, что она остановлена.
  3. Запишите имя службы (не отображаемое имя)
  4. Найдите и скопируйте «Путь к исполняемому файлу» и скопируйте его.

Для меня путь был (обратите внимание на речевые отметки)

"C:\Program Files\MongoDB\Server\4.2\bin\mongod.exe" --config "C:\Program Files\MongoDB\Server\4.2\bin\mongod.cfg" --service

В командной строке введите

sc config MongoDB binPath= "<Modified string with \" to replace ">"

В моем случае это было

sc config MongoDB binPath= "\"C:\Program Files\MongoDB\Server\4.2\bin\mongod.exe\" --config \"C:\Program Files\MongoDB\Server\4.2\bin\mongod.cfg\" --service -- auth"
Джон Дускин
источник
-2

Вы можете удалить сервис:

sc delete ServiceName

Затем воссоздайте сервис.

Ким Уилсон
источник
3
Нет необходимости делать это, есть как минимум 3 лучших способа сделать это
Лиам
-2

Чуть глубже с командой «SC», мы можем извлечь все «Имя службы» и получить все «QueryServiceConfig» :)

>SC QUERY > "%computername%-services.txt" [enter]

>FIND "SERVICE_NAME: " "%computername%-services.txt" /i > "%computername%-services-name.txt" [enter]

>NOTEPAD2 "%computername%-services-name.txt" [enter]

Выполните «маленькое» редактирование NOTEPAD2. Выберите «SERVICE_NAME:», CTRL + H, нажмите «Заменить все» Представьте, что мы можем сделать «Заменить все» в «CMD»

Затем перейдите к «CMD» ..

>FOR /F "DELIMS= SKIP=2" %S IN ('TYPE "%computername%-services-name.txt"') DO @SC QC "%S" >> "%computername%-services-list-config.txt" [enter]

>NOTEPAD2 "%computername%-services-list-config.txt" [enter]

это «Услуги на нашей машине» Необработанные данные готовы к загрузке «будущего пакетного файла», поэтому результат будет выглядеть следующим образом !!!

+ -------------+-------------------------+---------------------------+---------------+--------------------------------------------------+------------------+-----+----------------+--------------+--------------------+
| SERVICE_NAME | TYPE                    | START_TYPE                | ERROR_CONTROL | BINARY_PATH_NAME                                 | LOAD_ORDER_GROUP | TAG | DISPLAY_NAME   | DEPENDENCIES | SERVICE_START_NAME |
+ -------------+-------------------------+---------------------------+---------------+--------------------------------------------------+------------------+-----+----------------+--------------+--------------------+
+ WSearch      | 10  WIN32_OWN_PROCESS   | 2   AUTO_START  (DELAYED) | 1   NORMAL    | C:\Windows\system32\SearchIndexer.exe /Embedding | none             | 0   | Windows Search | RPCSS        | LocalSystem        |
+ wuauserv     | 20  WIN32_SHARE_PROCESS | 2   AUTO_START  (DELAYED) | 1   NORMAL    | C:\Windows\system32\svchost.exe -k netsvcs       | none             | 0   | Windows Update | rpcss        | LocalSystem        |

Но HTML будет намного проще: D

Любые яркие идеи по улучшению приветствуются V ^ _ ^

Рак Кар
источник
Или использовать, scчто намного, намного проще и меньше нравится испортить.
Лиам