ChatGPT解决这个技术问题 Extra ChatGPT

Modifying the "Path to executable" of a windows service

I'd like to modify the path to my application, but doing so breaks it because the service still points to the old location.

By going to Administrative Tools > Services you can open a properties dialog and view the Path to executable, but there is no way to change it.

Is there any way a user can modify the service path without having to reinstall the application ?


M
Matt McHugh

It involves editing the registry, but service information can be found in HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services. Find the service you want to redirect, locate the ImagePath subkey and change that value.


Although finally this leads to registry data, I should mention that there exist special Windows API functions to deal with the service. Direct registry modification should be avoided (because you can't be sure what else Windows is changing when it modifies the path to exe, f.e.) unless you are absolutely sure what you do.
@lospejos "I should mention that there exist special Windows API functions to deal with the service" ... which would be?
If someone don't see the service path updated in Services.msc, try killing mmc.exe "taskkill /F /IM mmc.exe" in cmd
Windows services never requires you to edit anything in the registry. Using sc or sc.exe is way better and less risky
C
Community

There is also this approach seen on SuperUser which uses the sc command line instead of modifying the registry:

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

Note: the space after binPath= is important. You can also query the current configuration using:

sc qc <service name>

This displays output similar to:

[SC] QueryServiceConfig SUCCESS 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 : DEPENDENCIES : SERVICE_START_NAME : user-name@domain-name


I would recommend this approach over direct registry changes. Many paths require quoted strings, which you can enter as follows, for example with MS SQL Server: sc config mssqlserver binPath= "\"F:\SQL DATA\MSSQL10.MSSQLSERVER\MSSQL\Binn\sqlservr.exe\" -sMSSQLSERVER"
It's also probably a bit nicer in a deployment script than the direct registry modification approach.
Sweet. Cleaner than mucking around in reg. ** Note: You will need to close and open services.msc to see the change.
If you get a [SC] QueryServiceConfig FAILED 122: after sc qc X use sc qc X 1000 see this
If using this from PowerShell, ensure you use sc.exe, not a naked sc
G
Greg Sansom

You could also do it with 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")

Or:

Set-ItemProperty -Path "HKLM:\System\CurrentControlSet\Services\My Service" `
    -Name ImagePath -Value "C:\Program Files (x86)\My Service\NewName.EXE"

A
Antony Joseph

Open Run(win+R) , type "Regedit.exe" , to open "Registry Editor", go to

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services

find "Apache2.4" open the folder find the "ImagePath" in the right side, open "ImagePath" under "value Data" put the following path:

"C:\xampp\apache\bin\httpd.exe" -k runservice foe XAMPP for others point to the location where Apache is installed and inside locate the bin folder "C:(Apache installed location)\bin\httpd.exe" -k runservice


J
John Duskin

Slight modification to this @CodeMaker 's answer, for anyone like me who is trying to modify a MongoDB service to use authentication.

When I looked at the "Path to executable" in "Services" the executed line already contained speech marks. So I had to make minor modification to his example.

To be specific.

Type Services in Windows Find MongoDB (or the service you want to change) and open the service, making sure to stop it. Make a note of the Service Name (not the display name) Look up and copy the "Path to executable" and copy it.

For me the path was (note the speech marks)

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

In a command line type

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

In my case this was

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"

The service I needed to change wasn't MongoDB; it was Redis. But your answer helped me, since I also needed to set some extra properties (service-run instead of config).
C
Codemaker

You can't directly edit your path to execute of a service. For that you can use sc command,

SC CONFIG ServiceName binPath= "Path of your file"

Eg:

sc config MongoDB binPath="I:\Programming\MongoDB\MongoDB\bin\mongod.exe --config I:\Programming\MongoDB\MongoDB\bin\mongod.cfg --service"

B
Bender

i just felt like adding for Git Bash users you should put the path in single quotes ' ' as in

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

in e.g. sc config MongoDB binPath='"C:\Program Files\MongoDB\Server\5.03\bin\mongod.exe" --config "C:\Program Files\MongoDB\Server\5.03\bin\mongod.cfg" --service --auth'

this worked for me to update the path of the service with Git Bash on Windows 10


Nice one. Worked great. But you have some extra '\' and '"' in your command. So maybe that's why the downvotes. The working syntax would be: sc config MongoDB binPath='"C:\Program Files\MongoDB\Server\5.03\bin\mongod.exe" --config "C:\Program Files\MongoDB\Server\5.03\bin\mongod.cfg\" --service --auth'
i edited the command accordingly (although im pretty sure this worked for me the edited command works too) thank you !
G
Gary Pendlebury

An alternative to using Invoke-WmiMethod is to use the newer CIM cmdlets. This also avoids the need for the @($null,$null...) object, as seen in a previous answer.

Get-CimInstance win32_service -Filter "Name='My Service'" | Invoke-CimMethod -MethodName Change -Arguments @{PathName="C:\Program Files\My Service\NewName.exe"}


s
sean

If you have Process Hacker installed, you can use it.

https://i.stack.imgur.com/Ia3uj.jpg


R
Rhak Kahr

A little bit deeper with 'SC' command, we are able to extract all 'Services Name' and got all '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]

https://i.stack.imgur.com/pesOD.png

Then, continue with '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]

https://i.stack.imgur.com/1SBKk.png

+ -------------+-------------------------+---------------------------+---------------+--------------------------------------------------+------------------+-----+----------------+--------------+--------------------+
| 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        |

But, HTML will be pretty easier :D

Any bright ideas for improvement are welcome V^_^


Or use sc which is much, much easier and less like to screw up.
l
last-Programmer

The best way for this scenario is to uninstall the application and reinstall the application. That is the right legal way.


s
shA.t

You can delete the service:

sc delete ServiceName

Then recreate the service.


There is no need to do this, there are at least 3 better ways to do this