修改Windows服务的“可执行路径”

332

我想要修改我的应用程序路径,但这样做会导致服务仍然指向旧位置而出现故障。

通过转到 管理工具 > 服务,您可以打开属性对话框并查看 可执行文件路径,但没有更改它的方法。

是否有任何方法让用户修改服务路径而无需重新安装应用程序?

13个回答

358

还有在SuperUser上看到的这种方法,它使用sc命令行而不是修改注册表:

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

注意:binPath=后面的空格很重要。您也可以使用以下命令查询当前配置:
sc qc <service name>

这将显示类似于以下输出:

[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       : <Display name>
    DEPENDENCIES       :
    SERVICE_START_NAME : user-name@domain-name

30
我建议使用此方法代替直接更改注册表。许多路径需要带引号的字符串,例如在使用MS SQL Server时,您可以按以下方式输入:sc config mssqlserver binPath= "\"F:\SQL DATA\MSSQL10.MSSQLSERVER\MSSQL\Binn\sqlservr.exe\" -sMSSQLSERVER" - Marc Durdin
2
在部署脚本中,这种方法可能比直接修改注册表更好一些。 - Niall Connaughton
不错。比在注册表中胡乱操作要干净。**注意:您需要关闭并打开services.msc才能看到更改。 - yonsk
1
如果在sc qc X后得到了[SC] QueryServiceConfig FAILED 122:,请尝试使用sc qc X 1000。参见这里 - raphael
40
如果从PowerShell使用,请确保使用sc.exe而不是裸的sc - fiat
显示剩余2条评论

336

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


4
尽管最终需要使用注册表数据,但我应该提到存在专门用于处理服务的Windows API函数。除非您非常确定自己在做什么,否则应避免直接修改注册表(因为当它修改exe路径时,您无法确定Windows还在进行什么其他更改)。 - lospejos
4
我应该提到存在特殊的Windows API函数来处理服务,具体是哪些函数呢? - Nick M
2
如果有人在Services.msc中没有看到服务路径更新,请尝试在cmd中杀死mmc.exe "taskkill /F /IM mmc.exe"。 - Drag0nKn1ght
Windows服务从不需要您编辑注册表。使用scsc.exe更好,风险更小。 - Arrcival

15

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

10

打开运行(win+R),输入“Regedit.exe”打开“注册表编辑器”,

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services

找到 "Apache2.4",打开该文件夹并在右侧找到 "ImagePath",点击打开 "ImagePath", 在 "value Data" 下方输入以下路径:

"C:\xampp\apache\bin\httpd.exe" -k runservice (适用于 XAMPP,其他软件请指向 Apache 安装位置下的 bin 文件夹 "C:(Apache installed location)\bin\httpd.exe" -k runservice)


谢谢。这是一个清晰、详细且可行的解决方案。 - syter

5
稍微修改一下@ 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"

我需要更改的服务不是MongoDB,而是Redis。但是你的答案对我很有帮助,因为我还需要设置一些额外的属性(使用service-run而不是config)。 - Ernani

2

您不能直接编辑服务的执行路径。为此,您可以使用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"

2

我只是觉得对于Git Bash用户,你应该把路径放在单引号' '中,就像这样

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

例如: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'

这对我来说在Windows 10上使用Git Bash更新服务路径是有效的。


不错。运行得很好。但是你的命令中有一些额外的 '' 和 '"'。所以可能这就是为什么会被踩。正确的语法应该是: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'。 - igs013
我相应地编辑了命令(虽然我很确定这对我有效,但编辑后的命令也可以工作),谢谢! - Bender

1
如果您已经安装了Process Hacker,您可以使用它。

enter image description here


0
按照以下步骤,您可以轻松使用用户界面修改可执行路径。
步骤1:打开Windows注册表编辑器。您可以在运行程序中输入“regedit”或在开始菜单中搜索“regedit”。

enter image description here

步骤2:展开 -> HKEY_LOCAL_MACHINE; 展开 -> SYSTEM; 展开 -> CurrentControlSet; 展开 -> Services

enter image description here

步骤3:找到您想要修改的服务并点击它。在右侧,您将找到该服务的所有元数据属性,包括ImagePath。右键单击ImagePath元数据属性,您可以在Value数据字段中编辑路径。

enter image description here

enter image description here

谢谢


0

使用新的CIM cmdlet是使用Invoke-WmiMethod的替代方法。这也避免了以前答案中看到的@($null,$null...)对象的需要。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接