C# 注册Windows服务

news/2024/11/19 17:32:18/文章来源:https://www.cnblogs.com/kjgagaga/p/18555236

环境:.NET Farmework 4.7.2

IDE:Visual Studio 2022

添加程序集引用:

System.ServiceProcess

System.Configuration.Install

右键项目,添加UpdateServices1类,让UpdateServices1继承ServiceBase(UpdateServices1换成自己的Services服务)

 

编译过后如果需要更新服务代码,要在Windows服务里面先停止

const string ServiceName = "ClientUpdateServices";const string ServiceDescription = "服务描述";static void Main(string[] args){if (args.Length > 0){try{ServiceBase[] serviceToRun = new ServiceBase[] { new UpdateServices1() };ServiceBase.Run(serviceToRun);}catch (Exception ex){}}else{StartLable:Console.WriteLine("请选择你要执行的操作——1:自动部署服务(Q),2:安装服务(W),3:卸载服务(E),4:验证服务状态(R),5:退出(T)");Console.WriteLine("————————————————————");ConsoleKey key = Console.ReadKey().Key;string conkey = Console.ReadLine();ServiceHelper.SetServicesDesc(ServiceDescription);if (key == ConsoleKey.NumPad1 || key == ConsoleKey.D1 || key == ConsoleKey.Q || conkey == "1"){if (ServiceHelper.IsServiceExisted(ServiceName)){ServiceHelper.ConfigService(ServiceName, false);}if (!ServiceHelper.IsServiceExisted(ServiceName)){ServiceHelper.ConfigService(ServiceName, true);}ServiceHelper.StartService(ServiceName);goto StartLable;}else if (key == ConsoleKey.NumPad2 || key == ConsoleKey.D2 || key == ConsoleKey.W || conkey == "2"){if (!ServiceHelper.IsServiceExisted(ServiceName)){ServiceHelper.ConfigService(ServiceName, true);}else{Console.WriteLine("\n服务已存在......");}goto StartLable;}else if (key == ConsoleKey.NumPad3 || key == ConsoleKey.D3 || key == ConsoleKey.E || conkey == "3"){if (ServiceHelper.IsServiceExisted(ServiceName)){ServiceHelper.ConfigService(ServiceName, false);}else{Console.WriteLine("\n服务不存在......");}goto StartLable;}else if (key == ConsoleKey.NumPad4 || key == ConsoleKey.D4 || key == ConsoleKey.R || conkey == "4"){if (!ServiceHelper.IsServiceExisted(ServiceName)){Console.WriteLine("\n服务不存在......");}else{Console.WriteLine("\n服务状态:" + ServiceHelper.GetServiceStatus(ServiceName).ToString());}goto StartLable;}else if (key == ConsoleKey.NumPad5 || key == ConsoleKey.D5 || key == ConsoleKey.T || conkey == "5") { }else{Console.WriteLine("\n请输入一个有效键!");Console.WriteLine("————————————————————");goto StartLable;}}}
Program

 

public static class ServiceHelper{static string ServiceDescription = "";public static void SetServicesDesc(string serviceDesc){ServiceDescription = serviceDesc;}/// <summary>/// 服务是否存在/// </summary>/// <param name="serviceName"></param>/// <returns></returns>public static bool IsServiceExisted(string serviceName){ServiceController[] services = ServiceController.GetServices();foreach (ServiceController s in services){if (s.ServiceName == serviceName){return true;}}return false;}/// <summary>/// 启动服务/// </summary>/// <param name="serviceName"></param>public static void StartService(string serviceName){if (IsServiceExisted(serviceName)){System.ServiceProcess.ServiceController service = new System.ServiceProcess.ServiceController(serviceName);if (service.Status != System.ServiceProcess.ServiceControllerStatus.Running &&service.Status != System.ServiceProcess.ServiceControllerStatus.StartPending){service.Start();for (int i = 0; i < 60; i++){service.Refresh();System.Threading.Thread.Sleep(1000);if (service.Status == System.ServiceProcess.ServiceControllerStatus.Running){break;}if (i == 59){throw new Exception("Start Service Error:" + serviceName);}}}}}/// <summary>/// 获取服务状态/// </summary>/// <param name="serviceName"></param>/// <returns></returns>public static ServiceControllerStatus GetServiceStatus(string serviceName){System.ServiceProcess.ServiceController service = new System.ServiceProcess.ServiceController(serviceName);return service.Status;}/// <summary>/// 配置服务/// </summary>/// <param name="serviceName"></param>/// <param name="install"></param>public static void ConfigService(string serviceName, bool install){TransactedInstaller ti = new TransactedInstaller();ti.Installers.Add(new ServiceProcessInstaller{Account = ServiceAccount.LocalSystem});ti.Installers.Add(new ServiceInstaller{DisplayName = serviceName,ServiceName = serviceName,Description = ServiceDescription,StartType = ServiceStartMode.Automatic//运行方式
            });ti.Context = new InstallContext();ti.Context.Parameters["assemblypath"] = "\"" + Assembly.GetEntryAssembly().Location + "\" /service";if (install){ti.Install(new Hashtable());}else{ti.Uninstall(null);}}}
ServiceHelper

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/836892.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

20222321 2024-2025-1 《网络与系统攻防技术》 实验六实验报告

一、实验内容 本实践目标是掌握metasploit的用法。 、指导书参考Rapid7官网的指导教程。 https://docs.rapid7.com/metasploit/metasploitable-2-exploitability-guide/ 下载官方靶机Metasploitable2,完成下面实验内容: (1)前期渗透 ①主机发现(可用Aux中的arp_sweep,sea…

【刷题笔记】[BalticOI 2024] Portal

【刷题笔记】[BalticOI 2024] Portal \(Solution\) 先注意到,题目中的图形是许多的自相似图形,要求能满足要求的单位图形的最大面积 先考虑只有一维的情况, 设几个传送门的坐标为 \((a_i,0)\) ``` 发现将整个图形平移后答案不会改变,所以不妨把一个传送门移动到 \((0,0)\)…

关于作业系统的一些思考

作业程序有两种类型:Long-lived 作业程序:输入或输出是无限量的数据,常见近乎实时的业务数据处理,比如日志处理等。(一般将消息队列连接输入,用来做流量削峰或多个输入) Short-lived 作业程序:处理一组有限的数据然后终止。运行代码并在数据库中记录执行状态的任务,然…

安利一款好用的 gRPC 调试工具 Apifox

各位用gRPC的小伙伴们!今天要给大家安利一个超好用的gRPC调试神器 - Apifox!它对gRPC的支持真的是太友好了,让我们一起来看看~ gRPC 调试功能有多强?支持的调用类型 描述 使用场景一元调用 类似HTTP请求的简单调用 常规的请求-响应场景服务端流 服务器端持续推送数据 实时…

上门家政开发架构分析

随着科技的进步,手机被多数人使用,上门家政已成为家喻户晓的行业了,上门家政服务呈现出多元化、专业化、智能化等发展走向,上门家政到底时是走是留,何去何从呢? 服务专业化与精细化: 传统家政服务不断衍生出更多专业细分领域。例如在母婴护理方面,不再仅仅是简单照顾产…

抓包工具Fiddler安装及汉化

抓包工具Fiddler安装及汉化下载Fiddler 这里强烈建议大家在官网上下载安装,在此附上链接https://pan.quark.cn/s/e9447b1917b5(含汉化教程),在其它地方安装很有可能会给你再下一堆不必要的软件(垃圾全家桶)安装 点击文件夹里的 [FiddlerSetupy官网英文原版] 安装完成界面…

RCE

一、RCE(远程代码执行漏洞) owasp_top_10中,rce又称为os注入漏洞。 在Web应用开发中为了灵活性、简洁性等会让应用调用代码执行函数或系统命令执行函数处理,若应用对用户的输入过滤不严,容易产生远程代码执行漏洞或系统命令执行漏洞。二、常见RCE漏洞函数 1.系统命令执行函数…

CTF_Web笔记_RCE

一、RCE(远程代码执行漏洞) owasp_top_10中,rce又称为os注入漏洞。 在Web应用开发中为了灵活性、简洁性等会让应用调用代码执行函数或系统命令执行函数处理,若应用对用户的输入过滤不严,容易产生远程代码执行漏洞或系统命令执行漏洞。二、常见RCE漏洞函数 1.系统命令执行函数…

上门家政系统功能解析案例实战演练

上门家政 APP 平台的问世,在极大程度上化解了大众家庭中不愿做家务的难题,这让众多创业者从中看到了新的创业方向。他们觉得上门家政 APP 平台竞争小,易于复制,属于轻资产创业模式,经济负担不大,并且上线速度快,能够迅速抢占市场。上门家政 APP 平台主要涵盖用户端、家政…

DNS解析智能线路有何优势?

在当今数字化的网络环境中,DNS(域名系统)解析智能线路正逐渐成为提升网络性能和用户体验的关键技术。它具有诸多显著优势,深刻地影响着网络数据的传输和处理。 1、智能线路优化了网络访问速度 传统的DNS解析可能会将用户请求指向距离较远或网络拥塞路径上的服务器,导致数据…

MySQL 性能定位

一、SQL性能分析1.SQL执行频率MySQL 客户端连接成功后,通过 show [session|global] status 命令可以提供服务器状态信息。通过如下指令,可以查看当前数据库的 INSERT 、 UPDATE 、 DELETE 、 SELECT 的访问频次: -- session 是查看当前会话 ; -- global 是查询全局数…

Mit6.S081笔记Lab10: mmap 文件内存映射

课程地址:https://pdos.csail.mit.edu/6.S081/2020/schedule.html Lab 地址:https://pdos.csail.mit.edu/6.S081/2020/labs/mmap.html 我的代码地址:https://github.com/Amroning/MIT6.S081/tree/mmap xv6手册:https://pdos.csail.mit.edu/6.S081/2020/xv6/book-riscv-rev1…