使用srvany.exe将任何程序作为Windows服务运行

srvany.exe是什么?

srvany.exe是Microsoft Windows Resource Kits工具集的一个实用的小工具,用于将任何EXE程序作为Windows服务运行。也就是说srvany只是其注册程序的服务外壳,这个特性对于我们来说非常实用,我们可以通过它让我们的程序以SYSTEM账户启动,或者实现随机器启动而自启动,也可以隐藏不必要的窗口,比如说控制台窗口等等。

如何获取?

你可以通过下载并安装Microsoft Windows Resource Kits获得或者可以通过我分享的下载地址1(国内线路)下载地址2(国外线路)得到。

如何使用?

当你获取到srvany后并决定将某程序作为服务启动后,请先将srvany安装为系统服务,具体的安装方法有很多,比如说可以通过Microsoft Windows Resource Kits中另外一个实用的小工具instsrv.exe进行安装(下载地址),将srvany.exe和instsrv.exe拷贝到C:\Windows\System32\后,我们可以通过下面的命令行进行srvany.exe的服务安装:

instsrv ServiceName C:\Windows\System32\srvany.exe

ServiceName即你自己定义的服务名称,可以是要作为系统服务启动的应用程序的名称。

安装完毕后,我们需要对srvany.exe进行配置,以便于能够加载我们指定的程序,配置的方法是,开始 – 运行 – regedit,打开注册表,定位到下面的路径。

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\ServiceName

同样的ServiceName是你刚才安装服务时自定义的服务名称。

如果该服务名下没有Parameters项目,则对服务名称项目右击新建项,名称为Parameters,然后定位到Parameters项,新建以下几个字符串值。

名称 Application 值为你要作为服务运行的程序地址。
名称 AppDirectory 值为你要作为服务运行的程序所在文件夹路径。
名称 AppParameters 值为你要作为服务运行的程序启动所需要的参数。

比如这里是个配置实例,我们这里配置的服务名称是NGINX,其余是nginx的安装配置情况。

srvany配置

当然还有一个比较简单的做法,那就是将下面的文本保存为*.reg文件,然后双击导入注册表。

1
2
3
4
5
6
Windows Registry Editor Version 5.00 
 
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\服务名称\Parameters] 
"Application"="值为你要作为服务运行的程序地址"
"AppDirectory"="值为你要作为服务运行的程序所在文件夹路径"
"AppParameters"="值为你要作为服务运行的程序启动所需要的参数"

2011年7月14日更新

找到微软的官方文章《如何创建用户定义的服务》,大家可以看一看。

2012年2月27日更新

今天有朋友问到将某窗体程序通过srvany作为服务运行的时候,桌面右下角图标和窗体无法显示,这个就涉及到服务的运行方式了,一般服务程序是不包含窗体的,所以系统默认可能会抑制这些服务程序产生的窗体,如果你的服务程序比较特殊,确实需要出现窗体,可以参考下面的办法:

控制面板 – 管理工具 – 服务(或者 开始 – 运行 – services.msc 确认)打开服务管理器,选择你刚刚安装并需要展示窗体的服务,然后右击选择属性,切换到 “登录” 选项卡,勾选上 “允许服务与桌面交互” 然后按确定保存,重启你的服务,看看窗体是否出现了:

允许服务与桌面交互

END

若无特别说明,本网站文章均为原创,原则上这些文章不允许转载,但是如果阁下是出于研究学习目的可以转载到阁下的个人博客或者主页,转载遵循创作共同性“署名-非商业性使用-相同方式共享”原则,请转载时注明作者出处谢绝商业性、非署名、采集站、垃圾站或者纯粹为了流量的转载。谢谢合作!

您可能喜欢

使用srvany.exe将任何程序作为Windows服务运行》上有 16 条评论

  1. 你好,我自己添加了一个服务成功了。可是启动失败,提示1053错误。可能会是哪里的错误呢。。
    是不是执行程序做为服务的时候是有要求的。

    • @chy
      检查你的Application和AppDirectory路径值是否正确,下面以NGINX程序举个例子,reg文件内容应该形如下面这样,然后导入:
      Windows Registry Editor Version 5.00

      [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\NGINX\Parameters]
      "Application"="E:\\nginx-0.8.16\\nginx.exe"
      "AppParameters"=""
      "AppDirectory"="E:\\nginx-0.8.16\\"
      如果已经导入了注册表,请选择开始,运行,输入regedit并确认以便于打开注册表编辑器,定位到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\你的服务名称\Parameters,检查路径和参数配置是否正确。
      如果问题依旧,建议打开控制面板,“管理工具”下面的“事件查看器”,选择旁边的“系统项目”,选择类型为错误的日志,看看具体内容是什么。

  2. 谢谢。还是1053错误,系统错误日志提示:服务没有及时响应启动服务和控制请求。
    是不是03系统对要做为系统服务的执行程序有什么要求呢。
    是不是利用instsrv工具的时候,执行程序只能是单独的一个执行程序,不能有动态库文件其他东西呢。。

    • @chy
      您好,貌似instsrv只能将服务程序(*.EXE)安装为服务,普通EXE程序,动态链接库等无法单独安装为服务,对于普通程序,建议采用本文所述利用instsrv将srvany.exe安装为服务,然后通过配置参数加载普通EXE程序作为服务运行,对于DLL,请参考svchost的做法进行加载,或者你可以写个简单的EXE服务程序,然后静态链接或者动态调用(LoadLibrary)这个DLL,然后再通过instsrv安装这个能加载DLL的简单EXE服务程序。

  3. 非常感谢您耐心的指导。
    还想问您一下,您说的“配置参数加载普通EXE程序作为服务运行”具体怎么理解呢。
    一个软件包含了可执行程序,dll文件,为了主执行程序作为系统服务运行,其他执行程序和dll文件都需要不同的操作吗。
    呵呵,我是个刚接触系统管理的小白,问的不对的地方请您见谅。

    • @chy
      通过配置参数主要是配置的srvany.exe参数,当我们把srvany.exe作为服务安装的时候,我们还要告诉srvany.exe要加载的EXE的路径等参数信息,这样这个EXE才能以“服务”的形式存在,具体的做法是修改注册表相关项,这点可以参考本篇文章,如果说单纯谈一个软件包,里面有一个调用的EXE和一堆DLL链接库,我们只需要加载EXE就可以了,那些DLL动态库是为EXE提供必要函数指令的,也就是说EXE主程序需要它们时才会加载它们,这个是这个EXE主程序的事情,我们只需要将EXE主程序作为服务运行即可,如果该EXE是服务程序,可以直接安装为系统服务,然后再启动,如果该EXE程序是普通程序,那么就不能直接作为服务程序启动,请利用本篇文章所述的srvany.exe加载的办法进行相关操作,你可以下载一个叫Dependency Walker的程序,然后利用这个程序打开你的软件包中的EXE,如果该程序没有经过加壳压缩(比如UPX等加壳程序),你应该就会发现其静态所需要加载的DLL了,当然程序内部通过LoadLibrary方式动态加载的DLL可能需要其他手段,比如反编译等才能追踪到。关于应用程序EXE和动态链接库的关系,可以参考《Windows核心编程》的动态链接库部分。没关系,有什么疑问,欢迎提出:-)

  4. 您好。你说的“服务程序”是不是指windows系统自带的执行程序。“普通程序”是自己开发的程序呢。如果是这样,我我们的普通程序能不能修改为服务程序呢。
    我要做的这个服务就是我同事自己开发的程序,我利用srvany.exe添加了服务,注册表也修改了,可是就是启动服务到一半的时候就会报1053的错误。
    真的很头大。%>_

    • @chy
      不是这样的,服务程序是指遵循微软的服务程序开发规范开发出来的特殊程序,这类程序和普通程序相比最大的特点是可以被系统作为服务启动,服务程序和普通程序都可以是自己开发的程序,普通程序不能直接作为服务程序启动,否则服务启动会报错,所以srvany.exe就是为解决这个问题而诞生的,srvany.exe本身是作为服务程序而开发的,其是遵循服务程序开发规范的,所以可以被系统作为服务程序启动,然后srvany.exe会根据注册表的配置参数启动你所设定的普通程序,所以进程列表会有两个一个是srvany.exe另一个是你的普通EXE程序,注意它们都是以SYSTEM账户启动的,如果srvany.exe服务被停止,那么相应的普通程序也会被srvany.exe停止,这样就将普通程序模拟出服务程序的功能了。你同事的那个程序是不是包含窗体界面,如果是这样的话,开始,运行,输入services.msc,打开服务管理器,找到你设置的那个服务项,右击属性,切换到“登录”选项卡,然后勾选“允许服务与桌面交互”试试,不过一般情况下不建议将有窗体的程序作为服务程序运行,这样会有一些问题。关于服务程序的介绍和开发示例可以参考《Using Services》《The Complete Service Sample》或者《用 C++ 创建简单的 Win32 服务程序》

    • @chy
      首先这个程序必须是能够持续运行的程序,如果是那种一运行很快就结束的程序,那么使用srvany.exe就没有效果了,因为srvany.exe启动了这个程序,而这个程序却很快就运行结束自动退出了,那么你在进程中将看不到你所希望运行的程序,只看到srvany.exe进程,因为它已经运行结束了,对于持续性程序,就是你不点关闭、不中止进程程序就不会退出的那种,在srvany.exe启动这类程序时,进程列表中将有你要启动的程序名和srvany.exe这两项,这时如果你停止服务,这两个进程将自动结束。
      我们知道系统自带的notepad.exe和nslookup.exe都是那种持续性程序,你不点关闭它们将不会退出,这两个程序一个是窗体程序、一个是控制台程序,将instsrv.exe和srvany.exe拷贝到SYSTEM32文件夹中,下面我用这两个程序做了实验:
      1.notepad.exe
      instsrv sample1 C:\Windows\System32\srvany.exe
      将下面导入注册表:
      Windows Registry Editor Version 5.00

      [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\sample1\Parameters]
      "Application"="C:\\WINDOWS\\SYSTEM32\\notepad.exe"
      "AppDirectory"="C:\\WINDOWS\\SYSTEM32\\"
      "AppParameters"=""
      然后启动服务sample1,观察任务管理器进程列表,出现srvany.exe和notepad.exe两个SYSTEM账户运行的进程,停止sample1服务后,两个进程消失,证明窗体类程序可以正常挂到srvany.exe下作为服务运行。
      2.nslookup.exe
      instsrv sample2 C:\Windows\System32\srvany.exe
      将下面导入注册表:
      Windows Registry Editor Version 5.00

      [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\sample2\Parameters]
      "Application"="C:\\WINDOWS\\SYSTEM32\\nslookup.exe"
      "AppDirectory"="C:\\WINDOWS\\SYSTEM32\\"
      "AppParameters"=""
      同上操作,证明控制台程序也是可以被srvany.exe作为服务启动的。
      对于持续性程序,可以通过 输入等待getchar()、死循环、互斥、消息循环等方式实现。

  5. 始终出现:本地计算机上的XX服务启动后又停止了。一些服务自动停止,
    如果它们没有什么可做的,例如“性能日志和警报”服务

    • @枯燥洒徒哈达
      不知道你那个是不是因为程序是那种一闪而过的,自动结束的程序。看上面那条回复:
      “首先这个程序必须是能够持续运行的程序,如果是那种一运行很快就结束的程序,那么使用srvany.exe就没有效果了,因为srvany.exe启动了这个程序,而这个程序却很快就运行结束自动退出了,那么你在进程中将看不到你所希望运行的程序,只看到srvany.exe进程,因为它已经运行结束了,对于持续性程序,就是你不点关闭、不中止进程程序就不会退出的那种,在srvany.exe启动这类程序时,进程列表中将有你要启动的程序名和srvany.exe这两项,这时如果你停止服务,这两个进程将自动结束。”
      希望对你能有所帮助:-)

  6. 你好,我想请问个问题,我想给Server 2003 或 2007 设置特定登陆用户显示窗体程序 ,比如系统登陆用户默认管理员是 Administrator 我设置了一个 sample1,我登陆sample1的时候才开启 服务中已设置好的窗体程序。

    • 暂时没能找到如何针对不同的用户启动不同服务的解决方案,不过可以将要启动的程序存放到用户的个性化启动文件夹中,比如Windows 7下是:
      C:\Users\<用户名>\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup
      Windows XP下路径是:
      C:\Documents and Settings\<用户名>\「开始」菜单\程序\启动
      假如说你需要运行的是服务程序,可以先将服务程序设置为手动启动,然后在上述用户启动文件夹中编写如下批处理文件(另存为*.bat):

      net start 服务名称

      这样不同的用户启动计算机就会自动执行其启动目录下的程序了,如果正好是启动服务的批处理,那么这个手动的服务也会被启动了。

发表评论

电子邮件地址不会被公开。 必填项已用 * 标注

*

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="" highlight="">