移花接木

在上一篇文章《限制程序只能同时启动一个实例-唯一》中,我们详细讨论了在Windows中,将软件设置为开机启动的方法。从而实现保护程序开机的时候自动保护服务的运行。

有的时候,我们没有某个控制台程序的源代码,但是我们需要一直运行这个控制台程序。而且这个控制台程序是静默运行的,不需要用户参与任何交互。

比如我们需要用到其提供的某些功能,并且不能停止运行。

这个时候,如果我们以控制台的形式启动这个程序,会有两个问题:

  • 控制台窗口,容易被关掉
  • 如果不小心选中了控制台里面的内容,程序会暂停运行

那如何解决这个问题呢?

编写简单的控制台程序

先来创建一个C#控制台项目:

创建项目

我们就用上次的保护进程的逻辑代码,来演示控制台程序转服务。

控制台程序代码如下:

程序代码

经过外老师测试,控制台程序内部,不管是不是使用了后台线程,都不影响转服务。只要控制台程序在运行即可。采用后台线程运行的时候,通过Console.ReadKey类似的方式,保持程序持续运行即可。

同样,因为我们这个控制台程序需要启动服务,所以也需要管理员权限。我们在项目的【属性】中,在【安全性】选项卡里面,启用【Click Once 安全设置】,再关闭【Click Once 安全设置】,最后修改其配置文件【app.manifest】:

请求管理员权限

这样我们的程序启动之后,就可以启动服务了。

我们编译程序,然后直接运行,检验一下是否可以正常守护服务:

正常启动

然后结束掉服务进程,看进程能否重启:

检验保护效果

经过外老师测试,功能正常。那么我们的控制台程序就写好了。

控制台转服务

现在来想办法将上面的控制台程序转换为服务运行。外老师尝试了3种办法,最后才成功:

  1. sc create 直接创建服务
  2. 使用srvany来转换
  3. 使用一个开源项目RunAsService来转换

前面两种,最终未能成功,但是第三种,终于成功了。前面两种失败的过程,在后面的踩坑记录里面简单介绍,这里我们重点介绍第三种!

由于第二种svrany是比较常用的方法,但是经过我一番尝试,最终失败。

无奈只好求助于程序员的万能朋友圈github,最后找到一个项目【RunAsService】,经过尝试,最后终于成功!

RunAsService

将这个仓库克隆下来,然后编译,然后研究了一下其运行方式:

RunAsService也需要先以服务的形式运行起来:

安装RunAsService服务

然后在【RunAsService.xml】中配置需要转换为服务的控制台程序:

配置程序

其中的【CmdLine】为最重要的控制台程序启动命令。再配置好服务的描述和启动方式。然后就可以启动【RunAsService】服务来启动这里配置的控制台程序了:

启动RunAsService

然后我们再测试,是否能够保护服务:

保护测试

测试结果正常,结束掉进程【TestService】之后,迅速重启。

这里外老师还发现一个小惊喜,就是【RunAsService】本身,也具备保护进程的效果。它可以保护【TestConsole】这个控制台程序。

不得不说【RunAsService】功能还是蛮强大的。后面有机会,给大家分享一下其源代码,探索一下其背后的深层原理。

踩坑记录

刚开始尝试了网上的一种办法,使用 sc create 来创建服务:

sc create SvcProtectorConsole binpath= F:WeMedia01付费专栏C#-Windows服务全面开发win-serviceSrcTestServiceTestConsolebinDebugTestConsole.exe type= own start= auto displayname= SvcProtectorCsl

但是经过测试,这种方法,只适用于以服务的形式编写的程序,对于普通的控制台程序,并不适用。

普通程序,在启动服务的时候会报错。

当然不排除有解决的办法,但是目前外老师还没找到方法。

srvany尝试失败,目前原因未知

参考:https://wangye.org/blog/archives/42/

下期预告

RunAsService背后的原理

敬请期待。。。

下一篇文章《控制台转服务背后的秘诀》,欢迎检阅!

服务启动失败_将控制台程序转换为服务运行相关推荐

  1. sqlserver服务启动失败_条码打印软件连接SQL数据库出现TCP连接失败解决办法

    小编今天用条码打印软件连接SQL 数据库遇到了一个问题:通过端口1433连接到主机localhost的TCP/IP连接失败.错误:"Connection refused:connect.请验 ...

  2. centos7.4 mysql启动,centos7下mysql服务启动失败_网站服务器运行维护,centos7,mysql

    centos7系统启动流程_网站服务器运行维护 centos7系统启动流程:1.POST加电自检:2.选择启动设备以加载MBR:3.加载bootloader:4.Kernel自身初始化:5.init管 ...

  3. linux下rip服务启动失败,RIP协议_linux系统管理与服务的技术博客_51CTO博客

    理解并配置动态路由协议RIP RIP(Routing Information Protocol)是应用较早.使用较普遍的内部网关协议(Interior Gateway Protocol,IGP),适用 ...

  4. linux系统mysql服务启动失败

    查看mysql.sock文件,如忘记了文件位置,则查看/etc/my.cnf文件. 查看mysql.sock文件是否存在 若不存在 1.service mysqld stop (停止服务) 2.rm ...

  5. mysql star item 失败_解决CentOS7下MySQL服务启动失败的问题.md

    --- title: 解决CentOs7下MySQL服务启动失败的问题 date: 2021-01-06 15:21:31 tags: MySQL --- 老夫前几天才在虚拟机的CentOS安装好My ...

  6. eas报错日记_(FAQ)EAS服务启动失败[金蝶EAS]

    [问题]: (FAQ)EAS服务启动失败 版本: 6.0 模块: 系统部署 [答复]: 原因分析: 日志都是两周前的日志,显示都是SQLServer的数据库网络端口没有打开相关报错. 经沟通得知当前已 ...

  7. 一刀斩 :“SVN” failed to start 服务启动失败

    最近需要使用SVN,在安装过程中遇到了一个坑爹的问题.分享一下,以免你们也被雷到. [ "SVN" failed  to  start 服务启动失败:] 按照正常的软件安装过程:打 ...

  8. windows服务启动失败解决流程

    最近遇到windows服务启动失败的情况,网上查阅了一下相关的解决方式,顺便记录一下解决的一般流程和方式: (一般是软件的配置文件出现问题,先检查配置文件是否有问题,例如没有符合yml格式(不可使用t ...

  9. Linux系统下SSH服务启动失败故障处理

    Linux系统下SSH服务启动失败故障处理 一.系统版本 二.报错状态 三.处理方法 四.查看服务状态 一.系统版本 [root@localhost ~]# cat /etc/os-release N ...

最新文章

  1. 计算机组成原理ppt免费,计算机组成原理(白中英)第二章1.ppt
  2. 深度学习 正则化 正则化率_何时以及如何在深度学习中使用正则化
  3. ASP.NET(c#)常用类函数
  4. P2350-[HAOI2012]外星人【线性筛】
  5. grumble.js--气泡形状的提示(Tooltip)控件
  6. 【华为云技术分享】《跟唐老师学习云网络》 - TUN/TAP网线
  7. Windows Restart Manager 重启管理器
  8. Palindrome Degree(hash的思想题)
  9. 计算机开题报告参考文献,开题报告中参考文献.docx
  10. 解决AXURE RP EXTENSION FOR CHROME的快捷方法
  11. prewitt算子实现
  12. HTML5--植物大战僵尸网页版
  13. 新手小白如何选择吉他,初学者的入门吉他推荐
  14. 为什么我会感到迷茫? 文/江湖一剑客
  15. 导致Android手机崩溃的壁纸,一张壁纸导致安卓手机崩溃作者首发声:绝非故意...
  16. C# Excel导出超出65536行报错 Invalid row number (65536) outside allowable range (0..65535)
  17. Excel PivotTable 使用心得手顺分享(六)
  18. Python爬取人民网夜读文案
  19. 笔记本无线网卡天线接线柱掉了(AUX和MAIN两个接口)
  20. 【硬件】Z7_DDR_pcb layout(纯干货,建议收藏)

热门文章

  1. JavaScript 败北,TypeScript 大势所趋?
  2. 字节跳动自研重度游戏;中国移动前董事长谈飞信失败;Linux 5.3-rc3 发布 | 极客头条...
  3. 性能提升 3 倍的树莓派 4,被爆设计缺陷!
  4. 量子计算时代到来,摩尔定律将要失效?
  5. 谷歌中国 AI 中心要凉?李飞飞否认将离职
  6. 成为一名架构师得学习哪些知识?
  7. 阿尔法狗 3 天走完人类千年棋史,被反超的我们该如何绝地求生?34 个开源项目告诉你!
  8. Java实例方法和类方法的区别
  9. “金三银四”春招指南!在线javascript
  10. java导_java——导入功能