2011-08-25 780 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

相關問題