本文参考了许多类似的文章,一些列在末尾的列表里。谨此感谢他们的启迪。
另外,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这个小软件
不好意思……
……我把简便的链接在开头加粗了……
没有耐心看完,能在文章开头放出批处理或者执行文件的链接比较靠谱。