将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