三步学会Service Contro

我在以前的文章中介绍过Service Control(sc.exe),它是一个用于管理Windows服务的命令行工具,功能十分强大。这一期我们再来学习一条命令:添加服务。除了工具的用法,你还可以学到Windows服务的工作原理。

初次尝试
设想你需要添加一个服务,该服务每隔几分钟就从摄像头上抓取一幅图像,并把它发送到特定的电子邮件地址。因为该服务是免费的,并没有附带详细的文档。你只知道服务的名字叫wcmail.exe,现在文件已经下载到了本地计算机:c:\wc\wcmail.exe,最简单的SC配置命令是:
sc create Webimagemailer binpath= c:\wc\wcmail.exe 
SC将回应一条简短的消息:[SC] CreateService SUCCESS。
这条命令实现了下面几个任务。首先,它在注册表“HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services”中创建了一个名为Webimagemailer的子键,并在该子键的下面创建了两个名为Enum和Security的子键,大多数服务都有这两个子键,这些子键中包含了一些可以通过SC进行配置的配置项,你也可以根据自己的需要对这些配置项进行调节。ImagePath是这些配置项中的一个,用来指示服务的位置,我们通过“binpath=”参数将路径信息传递给SC命令(SC命令的参数有点奇怪,在等号和参数之间要加一个空格)。
通过微软管理控制台(MMC)服务管理单元查看,你会看到名为Webimagemailer的服务已经存在,该服务以本地系统账号的身份运行。你可以使用“start=”参数来配置服务的启动方式,其值可以为boot、system、auto、demand(SC用这个词语表示手工启动)或disabled。也可以使用“obj= 用户名”参数来控制服务以哪个账号运行。出于安全的考虑,你也许不希望一个不太了解的服务以本地系统账号的身份运行,因此你创建了一个普通的用户账号,这里假设账号的名字为webcamguy,密码是swordfish,该账号只拥有wcmail.exe在执行任务时所需的权限。如果你觉得服务管理单元中显示的服务名字Webimagemailer不好看,也可以使用“displayname=”参数来指定一个描述性名字,这个描述性名字将代替服务名显示在服务列表中。

再次尝试
现在你可以尝试编写一条更合适的命令。要删除刚才创建的服务,输入:
sc delete Webimagemailer 
这条命令将该服务标志为删除,重启系统后删除操作就会生效。
现在可以尝试在命令中添加启动类型,服务账号和显示名字了:
 
sc create webimagemailer binpath= c:\wc\wcmail.exe start= auto displayname= "Web cam image mailer" obj= .\webcamguy password= swordfish 
切记:等号的后面要留个空格,否则SC就不听话了。

更好地调节它
服务运行得很好,但是偶尔也会有一点儿小麻烦。如果你把摄像头从计算机上断开又忘了连接回去,每次重新启动计算机时都会得到一条错误信息:“至少有一个服务或驱动程序在启动过程中没有正确加载”。服务是正常的,只是摄像头不在了,因为这个服务不太重要,所以你不想看到这条反复出现的提示,如果能关闭这条消息就好了。
要实现这个需求,可以使用“error=”参数。Windows会对服务的启动情况进行监视,操作系统在服务启动失败时所做出的响应是可配置的,以下四种方式可供选择:normal,缺省的选项,显示一条消息,正常启动Windows系统;ignore,这个正是你需要的选项,只在事件日志中记录一条消息;severe,识别服务或驱动程序的重要性,将Windows系统引导到上一次的正确配置;critical,将Windows系统引导到上一次的正确配置,如果驱动或服务仍然不能加载,系统将显示蓝屏。
好了,删除服务,重新启动系统,在前面的命令中添加“error= ignore”参数。这一次没有任何问题了。除非你还需要解决一些依赖性问题,这是下个月我要讨论的话题。

分享到