zoukankan      html  css  js  c++  java
  • 使用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:WindowsSystem32后,我们可以通过下面的命令行进行srvany.exe的服务安装:

    instsrv ServiceName C:WindowsSystem32srvany.exe

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

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

    HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesServiceName

    同样的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_MACHINESYSTEMCurrentControlSetServices服务名称Parameters] 
    "Application"="值为你要作为服务运行的程序地址"
    "AppDirectory"="值为你要作为服务运行的程序所在文件夹路径"
    "AppParameters"="值为你要作为服务运行的程序启动所需要的参数"

    2011年7月14日更新

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

    2012年2月27日更新

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

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

    允许服务与桌面交互

    2012年7月3日更新

    为了大家利用srvany.exe创建自定义服务的方便我特别写了个名叫SrvanyUI的服务创建管理的小工具,大家可以移步这篇文章《SrvanyUI服务管理工具发布》来获得详细信息,这里放个截图:

    SrvanyUI服务管理工具

    2012年7月5日更新

    找到微软的一篇文章可以参考《故障排除使用 Cmd.exe 的 SrvAny》

    2012年7月23日更新

    近期有朋友咨询为什么勾选上 “允许服务与桌面交互”,窗体程序依旧不能显示,其实这个办法只适用于Windows XP或者Windows 2003系列的操作系统,对于以上版本的Windows Vista、Windows 2008、Windows 7以及Windows 2008 R2,微软做了改变,使用了Session 0会话隔离策略,所以再使用这个办法强制服务窗体显示就会出现提示框,只有手动允许后才会出现界面,并且桌面风格也将被更改:

    交互式服务检测提示

    交互式服务检测

    此计算机上运行的程序正在尝试显示一条消息,程序可能需要您的信息或权限来完成任务。

    交互式服务检测
    此计算机上运行的程序正在尝试显示一条消息
    程序可能需要您的信息或权限来完成任务。

    关于Vista及高版本Windows交互出现提示框是由Interactive Services Detection服务控制的。禁用此服务将不会出现上述提示框,当然窗体也就不会显示了。

    更详细的信息可以参考MSDN的《Interactive Services》文章。

    特别注意下面这段:

    Important Services cannot directly interact with a user as of Windows Vista. Therefore, the techniques mentioned in the section titled Using an Interactive Service should not be used in new code.

    如果要在新的Vista及以上操作系统上显示窗体,我们应当使用新的技术,比如使用WTSSendMessage在用户会话显示对话框,或者将服务程序与窗体分离开来再使用进程通信(推荐)。

    关于编程的方法可以参考这篇文章《解决vista和win7在windows服务中交互桌面权限问题:穿透Session 0 隔离》

    抱歉的是目前的办法仅限于编程方面的,其他有效的办法我暂时还没有找到。

    部分参考文档:

    2012年2月27日更新

    对于带参数的命令行方式直接利用srvany.exe创建自定义服务请参考文章《WScript/VBScript命令行参数使用srvany.exe创建自定义服务》

  • 相关阅读:
    48. Rotate Image
    83. Remove Duplicates from Sorted List
    46. Permutations
    HTML5笔记
    18. 4Sum
    24. Swap Nodes in Pairs
    42. Trapping Rain Water
    Python modf() 函数
    Python min() 函数
    Python max() 函数
  • 原文地址:https://www.cnblogs.com/TF12138/p/4570581.html
Copyright © 2011-2022 走看看