本文主要是介绍将应用程序注册成后台服务程序,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
将任何应用程序注册成后台服务程序,即:系统启动后该程序可以自动启动,并且在前台不要出现运行窗口。
解决办法:需要使用Windows提供的两个工具instsrv.exe和srvany.exe。(Windows 2003资源工具包带有)
- instsrv:把win32程序变成系统服务。
- srvany:将一个应用程序注册为一个服务。即注册一个系统服务,来启动要运行的应用程序。
基本用法:
- instsrv [服务名] [应用程序绝对路径] (增加服务)
- instsrv [服务名] REMOVE (删除服务)
- instsrv [服务名] [srvany的绝对路径]
一、应用程序具有服务功能(能响应服务控制台的查询请求)
使用instsrv.exe,指令格式:instsrv [服务名] [应用程序路径]
执行完成后,在注册表项“HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\”中自动增加项[服务名],并在其下成功添加各个键值:
执行完成后,在注册表项“HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\”中自动增加项[服务名],并在其下成功添加各个键值:
“DisplayName” =服务显示名 (字符串值)
“Description” =服务描述 (字符串值)
“ImagePath” =应用程序路径 (可扩充字符串值)
“ObjectName” =”LocalSystem” (字符串值)
“Type” =10(16进制) (dword值)
“Start” =2(16进制) (dword值)
“ErrorControl” =1(16进制) (dword值)
如果不使用instsrv.exe,同样可以在注册表中手工添加实现:在“HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\”下新建一个项,项名为要显示的服务名,并在其下新建以上各个键,填入键值。
这样,一个服务就增加成功了,运行services.msc在服务管理器中可以看到,重启电脑就会自动启动服务。
二、应用程序不具有服务功能(不能响应服务控制台的查询请求)
并不是所有程序都适合做系统服务,即便注册成系统服务后也是无法启动,这时就需要用到srvany.exe。
具体步骤如下:
- 注册服务: path\instsrv [服务名] path\srvany.exe (同样第一种情况,把[应用程序路径]换为[srvany路径]。)
- 运行regedit打开注册表,进入HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\[服务名]
- 新建一个项,项名为Parameters,在项Parameters下新建如下建值:
- 右键-新建-字符串值Application,值数据填入[应用程序绝对路径],如:D:\RuijieSupport\MentoHUST\MentoHUST.exe
- 右键-新建-字符串值AppDirectory,值数据填入[应用程序工作目录],如: D:\RuijieSupport\MentoHUST\
- 运行services.msc打开服务管理,找到刚添加的服务,在属性-登录中,勾选“允许服务与桌面交互”。
- 启动服务。
说明:
- 执行instsrv命令如果出现出错提示:- The fully qualified path to the .EXE must be given。则说明需要写完整的路径,并最好用引号包含。如:C:\Program Files\Windows Resource Kits\Tools> instsrv MentoHUST “C:\Program Files\Windows Resource Kits\Tools\srvany.exe”
- 在Parameters里还可以添加很多键值:
AppDirectory 工作目录
AppParameters 你的应用程序的参数。
AppEnvironment 运行环境变量。
三、以上方法同样可以采用inf文件实现。
inf文件格式:
增加一个服务:
[Version]
Signature=”$WINDOWS NT$”
[DefaultInstall.Services]
AddService=MentoHUST,,My_AddService_Name
[My_AddService_Name]
DisplayName=MentoHUST Replace Ruijie
Description=锐捷替代
ServiceType=0×10
StartType=2
ErrorControl=0
ServiceBinary=%11%\MentoHUST.exe
删除一个服务:
[Version]
Signature=”$WINDOWS NT$”
[DefaultInstall.Services]
DelService=MentoHUST
增加服务的inf文件创建后,保存,并执行命令:
rundll32.exe setupapi,InstallHinfSection DefaultInstall 128 path\inf文件名
执行完成后,同样会看到:在注册表中看到新增的服务项MentoHUST和键值,在服务管理器会看到新增的服务MentoHUST。
rundll32.exe setupapi,InstallHinfSection DefaultInstall 128 path\inf文件名
执行完成后,同样会看到:在注册表中看到新增的服务项MentoHUST和键值,在服务管理器会看到新增的服务MentoHUST。
遇到不具有服务功能的应用程序,还是要打开注册表,接着上述操作,在创建的服务项下新建项Parameters,并添加键值。
说明:
- ServiceType 服务类型:0×10为独立进程服务,0×20为共享进程服务(比如svchost);
- StartType 启动类型:0 系统引导时加载,1 OS初始化时加载,2 由SCM(服务控制管理器)自动启动,3 手动启动,4 禁用。(注意,0和1只能用于驱动程序)
- ErrorControl 错误控制:0 忽略,1 继续并警告,2 切换到LastKnownGood的设置,3 蓝屏。
- ServiceBinary 服务程序位置:%11%表示system32目录,%10%表示系统目录(WINNT或Windows),%12%为驱动目录system32\drivers。也可以不用变量,直接使用全路径。
- 服务名MentoHUST后面有两个逗号,因为中间省略了一个不常用的参数flags。
- Description、ServiceType、StartType、ErrorControl四项是必须要有的,还有LoadOrderGroup、Dependencies等就不做详述了。
使用inf文件的优势:
- 和用SC等工具一样,inf文件的效果是即时起效的,而导入reg后必须重启才有效。
- 导出一个系统自带服务的注册表项,如果数据类型是REG_EXPAND_SZ,会看到一堆16进制代码,可读性很差。手动导入注册表以增加服务时,这样定义ImagePath显然很不方便,而用REG_SZ代替又会有些问题,比如不能用环境变量。用inf文件完全没有这个问题,ServiceBinary(即ImagePath)自动成为REG_EXPAND_SZ。
- inf文件会自动为服务的注册表项添加一个Security子键,使它看起来更像系统自带的服务。
- AddService和DelService以及AddReg、DelReg可以同时且重复使用。即可以同时增加和删除多个服务和注册表项。
四、通过修改注册表来添加服务:
"DisplayName",字符串值,对应服务名称;
"Description",字符串值,对应服务描述;
"ImagePath",字符串值,对应该服务程序所在的路径;
"ObjectName",字符串值,值为"LocalSystem",表示本地登录;
"ErrorControl",Dword值,值为"1";
"Start",Dword值,值为2表示自动运行,值为3表示手动运行,值为4表示禁止;
"Type",Dword值,应用程序对应10,其它对应20。
这篇关于将应用程序注册成后台服务程序的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!