本文參考了許多類似的文章,一些列在末尾的列表里。謹此感謝他們的啟迪。
另外,Boguś寫了一個eMule Service工具,並發布到了eMule(電騾)官方網站資源庫eMule-Project Content Database上,它可以非常方便的將eMule軟體作為Windows NT系統服務在後台運行。所以如果你已經了解系統服務可以忽略掉文中的一些內容,僅查看eMuleService一節。
背景與動機
Windows服務(Service),又作後台服務、NT服務……,是基於NT平台構建的Windows操作系統中一類長期在後台運行的程序。它們一般以SYSTEM等系統賬戶身份啟動,不與用戶直接接觸,並屬服務控制經理(Service Control Manager)管理。它們還能隨Windows啟動而運行,與用戶登錄無關。所有近來的Windows操作系統,比如2000、XP、2003、2008、Vista、7,都是基於NT平台構建的,因而具有Windows服務功能。
創建一運行eMule(電騾)的系統服務,可以讓eMule像幽靈一樣附身於Windows上:與Windows一同啟動,不受登錄、註銷影響,出錯時自動重啟,不顯示常規用戶界面。成為系統服務的eMule也更適合在一台默默駕騾的伺服器上運行。
Windows NT服務相關工具
Windows提供了許多查看管理系統服務的工具。這裡介紹一下SC.EXE和服務管理單元(services.msc)。
SC.EXE是與服務控制經理對話的命令行程序,可在命令行界面下運行。以「命令提示符」為例,打開「開始>附件>命令提示符」(用Vista、Win7等系統請「以管理員身份運行」),再在其中運行SC
即可。單獨運行SC時它會用英文輸出其用法:SC <伺服器> [命令] [服務名] <選項1> <選項1參數> <選項2>… #SC <server> [command] [service name] <option1> <option2>...
在本文所用的命令中,<伺服器>皆為本機,可以忽略。[服務名]則指這個命令針對的服務。[命令]則表明需要SC進行的操作,並配有相應的<選項>。不帶選項運行某些[命令]會顯示該命令的幫助。本文末尾的表格里列有一些常用搭配。若Windows版本較早(<Windows 2000),則可能不含SC,需安裝Windows NT資源包。
服務管理單元,以下稱「服務單元」,是可由微軟控制台(mmc)打開的一個控制單元。它屬於管理工具的一部分,可到「控制面板>管理工具>服務」打開。其圖形化界面里展示了系統服務資料庫中的服務列表及它們的屬性。要了解一個服務的設置,我們可以查看服務單元的列表,並右擊該服務查看或修改某些屬性。
服務並非由用戶自身運行,而是由服務控制經理啟動的。在服務控制經理的管理下,每個服務都會按其所設置的用戶賬戶啟動。因此我們需要控制Windows用戶賬戶的工具。「控制面板>管理工具」中的「計算機管理」就在其「系統工具>本地用戶和組」項目下提供了相關功能。而「管理工具」中的「本地安全策略」則提供了管理賬戶許可權的設置,位於「本地策略>用戶許可權分配/用戶權利指派」之下。
此外,註冊表的HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services
鍵里也包含了當前所有服務的信息,可由註冊表編輯器regedit.exe查看。而「控制面板>管理工具>事件查看器」里則記錄了程序的日誌。其中服務控制經理的輸出在「系統」類別。
將eMule添加為系統服務
要讓一個程序接受服務控制經理的管理,我們得給它找一個中介。其實這種中介相當通用,主要軟體有FireDaemon、Windows NT 資源工具包里的Srvany以及SrvStart。熱心人士Boguś則因無法忍受一切換用戶就得重啟eMule而為其量身打造了eMule Service。
FireDaemon曾經有一個Lite版是免費軟體,現已停止支持了。但其最後一版本FireDaemon Lite 1.6 GA仍活在P2P網路里(例)。netherod的《【原創】將eMule變成系統的服務圖解》和eMule Wiki上的討論貼《指南:在伺服器上將eMule作為服務啟動(英文)》走的就是FireDaemon路線。
Srvany則是Windows NT資源包里提供的程序,功能較簡單。你可以在這個網頁(英文)點擊藍色【Download】按鈕下載整個資源包,所有基於NT的Windows都適用。帶Srvany與Instsrv的單獨打包可以到這裡(英文)的srvany.zip鏈接去下載。該網頁還說明了用它們創建服務的方法。其中,Instsrv程序可實現SC部分功能。
此外,MorphXT,ScarAngel等eMule Mod自帶了添加為系統服務功能。
本文將說明eMule Service和srvstart兩條路線。eMule Service用法簡單,一步到位;srvstart功能強大,但較複雜。以下介紹用法較為簡單的eMule Service。要走srvstart路線,請前進到這裡。
eMule Service路線
eMule Service是Boguslaw Szczepanowski寫的命令行工具。授權協議為GPL v2。它發布在eMule Content Database上。參考uralhan在《eMule Service 1.0.3.7》對其使用方法的簡體中文闡述,引用如下:
eMuleService [-i <系統帳戶名> <密碼> | -u][-s][-p <路徑>]
- -h 查看使用說明
- -i 安裝eMule系統服務
- -u 卸載eMule系統服務
- -s 查看當前服務的eMule可執行文件路徑
- -p 設置服務的eMule可執行文件路徑
一個例子:
eMuleService -i admin 123456 -p c:\emule\emule.exe
解釋:安裝一個eMule服務,運行身份為Windows系統中的用戶「admin」,密碼「123456」,eMule程序路徑為「c:\emule\emule.exe」。完成以後,打開「控制面板」->”管理工具”->”服務”,看看是不是已經新增了一個名叫”eMule service”的服務,點擊「啟動」即可開始運行eMule服務,沒有任何界面顯示,其實eMule已經在後台默默地開始為我們工作了,最後按照你自己的需求設置為「手動」或「自動」即可。
當然出於安全形度不建議用管理員用戶,可以為eMule服務單獨添加一個用戶,只是要注意,如果文件系統是NTFS千萬別忘了為該用戶添加你的eMule所使用到的文件夾的讀寫許可權:P。
此外,eMule Service會在其目錄下產生與其可執行文件同名的.log日誌,如eMuleService.log。
在此之後(之前),請查看「用戶賬戶問題」等後續小節。以下是Srvstart路線。
Srvstart路線
以下使用Srvstart作中介。這是Nick Rozanski寫的LGPL軟體,功能強大,用途專一。其官網在這裡,還有他的指南和可執行文件下載鏈接。(全為英文)
先將Srvstart解壓到一固定位置,以後啟動eMule服務時都得用到。解壓後的文件夾下就有Srvstart.exe和幾個必需的.dll文件。在documentation文件夾下有一則services.htm服務指南,與網頁版一致。(另外還需微軟自帶的%SYSTEMROOT%\SYSTEM32\MSVCRT.DLL,一般已經有了。)
若在命令行直接運行srvstart
也會順出幫助。Srvstart大致語法如下:(詳情參考其指南)命令模式:
srvstart cmd [窗口標題] <選項> <程序> <程序參數>
服務模式:
srvstart <svc> [服務名] <選項> <程序> <程序參數>
(其安裝服務的模式並不好用,主要是無法正確處理帶空格的參數)
其中,命令模式是直接運行用的,可以測試命令是否有誤;而服務模式則應由服務控制經理啟動。Srvstart的參數既可以直接在啟動命令中給出,也可以通過一個文本文件做控制文件(Control Files)配置,然後用-c [控制文件路徑]
選項傳遞。
這裡用控制文件來配置啟動eMule的服務。該配置文件以後啟動eMule服務時都得用到,請保存到合適路徑。假設其路徑為X:\控制文件目錄\控制文件.ini
(這裡有更詳細的示例控制文件(英文)。)
#################################################
#Srvstart控制文件
#################################################
#以「#」號開頭的行是注釋
#「[…]」行是區塊標籤,表示服務名稱。
# 運行「srvstart [cmd|svc] [服務名]…」時,
# 僅與「服務名」相同的區塊和公共區選項會被載入
# 大小寫須一致
#其他行應為「選項=值」的格式。
#################################################
#env:環境變數,方便修改
#以下是創建稱作「eMule命令」的變數,儲存eMule程序路徑
#使用時兩邊加「%」,如%eMule命令%
#若路徑有空格請加在頭尾加""英文引號組織
##請修改
env=eMule命令="D:\Program Files\eMule\emule.exe"
#此例中服務名為eMule
[eMule]
#eMule區塊開始
#startup:啟動命令及參數
#這裡引用之前建的變數
startup=%eMule命令%
#startup_dir:啟動目錄,必須設,須是絕對路徑,不得用
# 引號組織
#對eMule無關緊要吧。隨便設。
startup_dir=D:\Program Files\eMule\
#auto_restart:是否自動重啟程序;y|n,默認為n
#若為n,則服務將在程序終止時退出
auto_restart=y
#restart_interval:重啟間隔(秒),默認為0
#在關機時,程序有可能先被關閉而服務還未停止。為避免其
# 一直重啟,可以設長些
restart_interval=42
#shutdown_method:退出程序方式/信號;
# kill|command|winmessage,默認為kill
#即「終止進程|其他命令|關閉窗口」
shutdown_method=winmessage
#wait_time:檢查程序是否仍在運行的間隔(秒),默認為0
#wait_time=7
#startup_delay:啟動服務時,等待一段時間(秒)再向
# NT Service Control Manager彙報程序啟動情況;默認為0
#用於啟動時間過長的程序
#startup_delay=6
#debug:調試信息輸出級別;0|1|2,表示「無|普通|詳細」
#要用Debug調試,需使用級別2
debug=1
#debug_out:調試信息輸出位置:
# stdout|LOG|文件路徑|>文件路徑
#其中stdout是命令行(在服務模式(svc mode)無意義);
#LOG是WinNT事件日誌里的【應用程序】類
#「文件路徑」須是絕對路徑,不得用引號組織;若開頭帶>,
# 則在寫入日誌前會將之前內容抹空;否則添加到文件末尾
#例:
#debug_out=>X:\Y Z\U.log
debug_out=LOG
現在可以用svrstart cmd eMule -c "X:\控制文件目錄\控制文件.ini"
測試一下,看看eMule出現了嗎?如果沒有……
接下來要用SC將這句命令添加到系統服務。在命令行輸入以下即可:(Vista、Win7等:「以管理員身份運行」)sc create emule或者其他服務名稱 binPath= "srvstart路徑\srvstart eMule -c \"X:\控制文件目錄\控制文件.ini\""
如果輸出SUCCESS,咱就成功了;如果輸出FAILURE,那就……請仔細檢查命令,參考幫助與SC用法表格吧。注意選項等號與值之間有個空格,以及英文引號和「\」號。並請再次注意若控制文件內所需代碼在某區塊下,則應把「eMule」換做其名稱,保持大小寫。
用戶賬戶問題
前文提到,系統服務在設定的賬戶名下啟動。默認系統服務以本地系統賬戶LocalSystem啟動。這個賬戶許可權過高,基於安全考慮不推薦。普通的用戶許可權也過高。推薦在「控制面板>管理工具>計算機管理>系統工具>本地用戶和組>用戶」之下右擊新建一個專門用戶運行eMule服務。注意除LocalSystem外,所有要運行服務的賬戶,密碼均不得為空。同時需去掉「用戶下次登錄時需修改密碼」選項,勾選「用戶不能更改密碼」和「密碼永不過期」。此外,需在「管理工具>本地安全策略>本地策略>用戶許可權分配/用戶權利指派」里,雙擊「作為服務登錄」,添加相應的用戶。添加時注意輸全名。可將用戶也添加至「拒絕本地登錄」組。
若使用NTFS等帶許可權管理的磁碟分區格式,則需注意修改以下文件和目錄的許可權(如打開「完全控制」):
- eMule安裝目錄
- config、Incoming和Temp目錄(「所有用戶共享相同的配置和下載」時除外,見下)(這些目錄詳細路徑見此處)
- eMule共享目錄
- srvstart或eMule Service程序及其日誌文件(目錄)
最後需要考慮的是多用戶共用eMule的影響,即eMule「選項>擴展設置>和本機其他用戶分享eMule」的設置。不應選擇「每個用戶的配置和下載是獨立的」。若選擇使用LocalSystem賬戶,則無論如何eMule都會按「在程序目錄下保存配置和下載」配置運行。
若是用eMule Service新建服務,則只需更改命令行參數即可選擇所需賬戶。其他情況請看下文「配置服務」。
配置服務
配置服務可使用服務單元。右擊一個服務點選【屬性】即可。「常規」選項卡中的啟動類型若為自動,則在開機時自動運行,手動只表明允許啟動,已禁用則不許啟動。「登錄」選項卡里可以更改啟動服務時的賬戶身份。要改變賬戶,選擇此賬戶,輸入賬戶全名和登錄密碼即可。服務單元會自動打開此賬戶運行服務的許可權。若選前文不推薦的本地系統賬戶,則可開啟允許服務與桌面交互,這樣eMule窗口、氣泡通知、系統托盤就都會顯示。但Win7等新系統不推薦打開交互,並不會顯示正常的用戶界面。最後,在「恢復」選項卡里可設置服務運行失敗退出時的操作。重疊失敗次數則設定累積失敗次數的有效期。
SC.EXE的功能更全面(包括增刪服務),可以參看後頭的表格,這裡略去。
eMule設置
按在「選項>安全」中,去掉以非特權身份運行eMule。eMule播放聲音不受後台與否影響,因此有需要請選擇「通知」中的無聲。若eMule服務不與用戶交互,請關閉「常規」里的退出時提示確認。這時還需考慮諸如啟用「Web伺服器」等方法來監管eMule,並關閉失效了的用戶界面功能。一般需要打開「連接」中的啟動時自動連接與斷開時自動重新連接。如果你要讓eMule服務自動啟動的話,也要關閉「常規」里的在Windows啟動時運行。
防火牆/殺毒軟體設置
如果適用,請修改防火牆的如下監控選項:
- 關閉DLL(動態鏈接庫)驗證
- 關閉應用(程序)劫持檢查,或將中介程序(eMuleService、srvstart等)添加到白名單中
應用(程序)劫持檢查會阻止不由Explorer啟動的進程。而系統服務狀態下的eMule是由中介啟動的,並非Explorer。
尾聲
在最終啟動服務前,還可以用runas /user:[服務配置賬戶] [eMule路徑]
以及srvstart的命令模式測試一下。然後就可以啟動服務了:在服務單元里右擊服務項選【啟動】,或用sc start [服務名]
。
運氣好的話,eMule就會在後台蹦躂了;運氣不好的話,要有耐心……
[命令] | <選項> | 可選參數(默認值加粗顯示) | |||
---|---|---|---|---|---|
qc | 查詢服務配置 | ||||
create | 創建服務 | type= | 服務類型 | own | 服務使用獨立進程,不與其他服務共用可執行文件。 |
share | |||||
interact | 服務與桌面交互。僅限本地系統賬戶。使用時須緊接基本類型配置,如:type= interact type= own
| ||||
start= | 啟動類型 | auto | 系統啟動後自動啟動 | ||
demand | 手動啟動 | ||||
disabled | 禁止啟動 | ||||
binPath= | 執行命令路徑、參數 | create命令必須有 | |||
obj= | 登錄賬戶 | 格式為「\主機名\用戶名 」,本機可用「.\用戶名 」縮寫。本地系統賬戶LocalSystem則不需帶主機名。在XP等系統中,改用戶必須跟上password=選項。該賬戶須有啟動服務的許可權,否則服務無法啟動。
| |||
password= | 登錄密碼 | 賬戶登錄密碼。若同時改為LocalSystem,則密碼忽略。無法設置空密碼。 | |||
config | 更改服務配置 | 參見create(上一條)。 | |||
qfailure | 查詢失敗時的操作 | ||||
failure | 配置失敗時的操作 | actions= | 操作序列 以「<參數>/<參數>/…」方式列出第一、二、三…次失敗時的操作,最後一項為所有後續失敗的操作。需與reset=一同使用。 | null | 無操作 |
restart | 重啟服務 | ||||
reboot | 重啟計算機 | ||||
run | 運行按command=設置的命令 | ||||
[間隔時間] | 以秒記的數值,標明前一項操作的延時。默認為0 | ||||
reset= | 重置計數時間 | 重置失敗計數時間(秒),-1為無窮大 | |||
reboot= | 重啟廣播 | 失敗時重新啟動之前的消息廣播,字元串 | |||
command= | 操作命令 | 失敗時run操作運行的命令行 | |||
query queryex | 查詢服務及其狀態 | 可在運行sc 命令後按y查看其用法 | |||
start | 啟動服務 | ||||
stop | 終止服務 | ||||
delete | 刪除服務 |
中文部分為釋義。請注意空格。要查看詳細用法,請用SC [命令]
查看幫助。也可查看微軟網頁(英文),或Technet(英文,有小錯,更有條理)。
參考
- FireDaemon路線
- moi.leRoi在eMule Wiki上的討論貼《指南:在伺服器上將eMule作為服務啟動》(英文)
- nethero在中國驢論壇上的帖子《【原創】將eMule變成系統的服務圖解》(貌似文是圖非)
- Srvany路線
- Travis的文章《在Windows NT/2000/XP/2003里創建用戶自定義的服務》(英文)
- rasker在VirtualBox.org論壇上發表的帖子「VirtualBox變身Windows系統服務三部曲之一(SRVANY.EXE)」(英文)
- Srvstart路線
- Jason Faulkner的文章《利用SrvStart,將任意程序作為服務啟動》(英文)
- rasker所著「VirtualBox變身Windows系統服務三部曲之二(srvstart.exe)」(英文)
- 其他
- rasker所著「VirtualBox變身Windows系統服務三部曲之三(NT Wrapper)」(英文)
- eMule Plus論壇帖《要eMule Plus整成Win NT/2K/XP服務?》(簡潔版)(英文)
- Boguś與Nick的說明文檔
- 微軟網站(沒有啟迪)
- 《如何創建用戶定義的服務》(英文版)(機器翻譯版(請對照英文)) Srvany路線
- 《如何通過使用 Sc.exe 創建 Windows 服務》(英文版)(機器翻譯版(請對照英文))
本文作者:孫山
4條評論隱藏
沒有耐心看完,能在文章開頭放出批處理或者執行文件的鏈接比較靠譜。
@usoon 作者寫的太專業了點,其實最簡單的就是用eMule Service這個小軟體
不好意思……
……我把簡便的鏈接在開頭加粗了……
沒有耐心看完,能在文章開頭放出批處理或者執行文件的鏈接比較靠譜。