2011-08-25 553 views
192

我想修改我的应用程序的路径,但这样做会破坏它,因为服务仍然指向旧的位置。修改Windows服务的“可执行文件路径”

通过转到Administrative Tools > Services,您可以打开属性对话框并查看Path to executable,但无法对其进行更改。

用户可以通过任何方式修改服务路径而无需重新安装应用程序吗?

回答

151

还有this approach seen on SuperUser它使用sc命令行,而不是修改注册表的:

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

注:binPath=后的空间是很重要的。还可以使用查询当前配置:

sc qc <service name> 

这将显示类似的输出:

[SC] QueryServiceConfig SUCCESS

SERVICE_NAME:服务名称

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 : [email protected] 
+11

我会推荐这种方法通过直接注册表更改。许多路径需要带引号的字符串,您可以输入如下,例如MS SQL Server: 'sc config mssqlserver binPath =“\”F:\ SQL DATA \ MSSQL10.MSSQLSERVER \ MSSQL \ Binn \ sqlservr.exe \“ -sMSSQLSERVER“' –

+2

在直接注册表修改方法中,它在部署脚本中可能也更好一些。 –

+0

甜。清洁,而不是注册登记。 **注意:您需要关闭并打开services.msc才能看到更改。 – yonsk

264

它涉及到编辑注册表,但服务信息可以在HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services找到。找到您想要重定向的服务,找到ImagePath子项并更改该值。

+2

虽然最终这导致注册表数据,我要指出,存在着特殊的Windows API函数来处理服务。应该避免直接的注册表修改(因为除非你完全确定你所做的事情,否则你无法确定Windows修改exe的路径时会发生什么变化)。 – lospejos

+3

@lospejos“我应该提到,存在特殊的Windows API函数来处理服务”......这将是什么? –

+3

这是一个不好的答案,因为有sc命令 – Worthy7

0

你可以删除服务:

sc delete ServiceName 

然后重新创建服务。

+1

没有必要这样做,至少有3个更好的方法来做到这一点 – Liam

7

你也可以使用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" 
-1

一个稍微深一点与“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编辑.. Select 'SERVICE_NAME: ', CTRL+H, click 'Replace All' Imagine that we can do 'Replace All' within '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] 

it is 'SERVICES on Our Machine' 原始数据已准备好饲养未来的批处理文件“,因此结果是这个样子低于!

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

+0

或使用'sc'这是更容易,更容易而不喜欢搞砸。 – Liam

相关问题