將eMule作為系統服務運行

本文參考了許多類似的文章,一些列在末尾的列表里。謹此感謝他們的啟迪。

另外,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就會在後台蹦躂了;運氣不好的話,要有耐心……


SC <伺服器> [命令] [服務名] <選項> <選項參數>
[命令]

<選項>

可選參數(默認值加粗顯示)
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(英文,有小錯,更有條理)。


參考

回頁首


本文作者:孫山

4條評論隱藏

  1. #1 usoon
    2011年3月5日 周六 19:44 | 回復

    沒有耐心看完,能在文章開頭放出批處理或者執行文件的鏈接比較靠譜。

  2. 2011年3月5日 周六 23:55 | 回復

    @usoon 作者寫的太專業了點,其實最簡單的就是用eMule Service這個小軟體

  3. #3 孫山
    2011年3月6日 周日 12:50 | 回復

    不好意思……
    ……我把簡便的鏈接在開頭加粗了……

  4. #4 看到覺得好麻煩
    2015年9月11日 周五 20:42 | 回復

    沒有耐心看完,能在文章開頭放出批處理或者執行文件的鏈接比較靠譜。

發表評論

您的Email將不會顯示出來。頭像請至Gravatar.com註冊上傳。*號標註項為必填。

*
*
*
標籤用法
字數:0