windows平台使用C#创建系统服务

使用 C# 在 Windows 平台创建和管理系统服务

        在 Windows 平台上,系统服务(Windows Service)是一种运行在后台、无需用户交互的应用程序。系统服务广泛应用于长期任务处理、网络监听、后台调度等场景。本文将详细介绍如何使用 C# 创建一个 Windows 系统服务,并实现对外部程序(如 frp)的调用,同时探讨进程保护机制以提升服务的可靠性。

一、什么是 Windows 服务?

Windows 服务是一种特殊类型的应用程序,能够在系统启动时自动运行,且无需用户登录即可执行。它适合于以下场景:

  • 持续运行的任务(如日志采集、网络代理等)。
  • 系统后台维护(如自动更新、性能监控)。
  • 需要在无人值守环境中执行的任务。

Windows 服务的核心特性:

  • 通过 服务控制管理器(SCM) 管理。
  • 运行时与用户登录状态无关。
  • 支持系统启动时自动运行

二、C# 创建 Windows 服务的基本步骤

在 C# 中,可以通过 Visual Studio 和 .NET 提供的 System.ServiceProcess 命名空间快速创建和管理 Windows 服务。

1. 创建 Windows 服务项目
  1. 打开 Visual Studio,创建一个 Windows 服务项目

    • 文件 -> 新建 -> 项目 -> 选择 “Windows 服务 (.NET Framework)”。
  2. 配置项目:

    • 为服务项目命名,例如:WindowHelpTools
2. 定义服务逻辑

默认情况下,服务项目会生成一个名为 Service1.cs 的文件。我们可以在 OnStartOnStop 方法中定义服务启动和停止时的逻辑。

以下示例展示了如何在服务启动时运行一个外部程序(如 frp):

 private Process _process;

 protected override void OnStart(string[] args)
 {


     try
     {
         _process = new Process();
         _process.StartInfo.FileName = @"C:\windows\frp\frpc.exe"; // FRP 可执行文件路径
         _process.StartInfo.Arguments = "-c \"C:\\windows\\frp\\frpc.ini\""; // FRP 配置文件路径
         _process.StartInfo.UseShellExecute = false; // 不使用 shell 启动
         _process.StartInfo.CreateNoWindow = true;  // 不创建窗口



       // 提升进程优先级
        _process.PriorityClass = ProcessPriorityClass.High; // 设置为高优先级


         //调试时会用到,发布时要注释,不然服务会一直在启动状态
        // _process.StartInfo.RedirectStandardOutput = true;  // 捕获标准输出
        // _process.StartInfo.RedirectStandardError = true;   // 捕获标准错误

         // 启动 FRP 进程
         _process.Start();

         // 读取输出和错误信息
        // string output = _process.StandardOutput.ReadToEnd();
        // string error = _process.StandardError.ReadToEnd();

         // 将输出信息写入日志
       //  EventLog.WriteEntry("MyService", $"FRP Output: {output}", EventLogEntryType.Information);
       //  EventLog.WriteEntry("MyService", $"FRP Error: {error}", EventLogEntryType.Error);
     }
     catch (Exception ex)
     {
         // 处理启动过程中发生的错误
         EventLog.WriteEntry("MyService", $"Failed to start FRP process: {ex.Message}", EventLogEntryType.Error);
     }
}



protected override void OnStop()
{
    if (_process != null && !_process.HasExited)
    {
        _process.Kill();
    }
}
3. 安装和运行服务

 使用 Visual Studio 编译生成可执行文件。

如下图:

编译后把服务文件及相关的运行文件放在想要安装的位置,这里放在C盘目录如下图:

通过winddows自带的sc进行服务安装服务:

sc create frp binPath= "C:\windows\frp\windowsHelpTools.exe"

执行后创建成功,这里可以在服务管理操作服务了,进入 服务管理器 中找到服务(如 MyService),点击启动。如下图: 

这里可能根据需要配置服务,由于这个服务只是执行端口映射到公网并用于登陆远程控制windows,所以这个服务设置开机自动启动,只要开机不需登陆windows平台即可远程登陆控制 。

三、进程保护与可靠性提升

在实际应用中,外部程序可能因人为或意外原因被终止。以下是提高服务和外部进程可靠性的方法:

1. 自动重启外部进程

通过后台线程监控外部进程状态,如果检测到进程已终止,服务将自动重启进程。这种机制已在上面的 MonitorProcess 方法中实现。

2. 限制任务管理器操作

可以通过以下方式减少用户对进程的干预:

  • 将外部进程设置为高优先级:
    _process.PriorityClass = ProcessPriorityClass.High;
3. 直接集成外部程序

将外部程序的逻辑直接集成到服务中,避免生成独立进程。

4. 隐藏或保护进程
  • 使用 Windows API 隐藏进程(不推荐,可能被视为恶意行为)。
  • 将进程运行在更高权限的账户中(如 SYSTEM)。

四、注意事项
  1. 权限要求

    • 服务通常需要管理员权限运行,尤其是涉及网络配置的外部程序(如 frp)。
    • 可以在服务属性中配置合适的登录账户。
  2. 日志记录

    • 记录服务和外部进程的运行状态,方便调试和问题排查。
  3. 服务超时问题

    • 服务启动时,应尽快返回控制权,避免 Windows 认为服务“未响应”。可以使用异步启动机制。
五、总结

        使用 C# 创建 Windows 服务为实现后台任务提供了强大的工具支持。在本文中,我们展示了如何创建一个服务并调用外部程序(如 frp),同时实现了进程保护和重启机制,提升了服务的可靠性。无论是在企业环境还是个人项目中,这种方法都可以有效解决后台任务自动化的问题。

希望本文能为您提供关于 Windows 服务开发的全面指导,让您的服务更加稳定、高效。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

JVM_总结详解

1、CPU和内存的交互 了解jvm内存模型前,了解下cpu和计算机内存的交互情况。【因为Java虚拟机内存模型定义的访问操作与计算机十分相似】 有篇很棒的文章,从cpu讲到内存模型:[什么是java内存模型?] 在计算机中,cpu和内存的交互最…

TLinux 3.1 (Centos 8)修改网卡设备名

原网卡设备名:ifcfg-enp17s 新网卡设备名:ifcfg-eth0 1. 修改接口配置文件名 rename /etc/sysconfig/network-scripts/ifcfg-enp17s /etc/sysconfig/network-scripts/ifcfg-eth0 2. 修改接口配置文件 vi /etc/sysconfig/network-scripts/ifcfg-eth…

ElasticSearch7.x入门教程之全文搜索(七)

文章目录 前言一、多条件查询:bool query二、更加精准查询:dis_max query总结 前言 这里再接着上一篇文章继续记录。非常感谢江南一点雨松哥的文章。 欢迎大家去查看,地址:http://www.javaboy.org 一、多条件查询:boo…

基于springboot 的体质测试数据分析及可视化设计LWPPT

技术可行性:技术背景 本企业网站在Windows操作系统中进行开发,并且目前PC机的性能已经可以胜任普通网站的web服务器。系统开发所使用的技术也都是自身所具有的,也是当下广泛应用的技术之一。 系统的开发环境和配置都是可以自行安装的&#x…

oracle小技巧-解决特殊密码字符而导致的exp错误

在使用oracle数据库的时候,我们经常会利用exp工具对某些表进行导出。但有些时候,因我们用户密码为安全性设有特殊字符,导致exp导出时候报:“EXP-00056和ORA-12154”,今天我们就分享下如何通过设置符号隔离的小技巧解决…

【ArcGIS Pro实操第11期】经纬度数据转化成平面坐标数据

经纬度数据转化成平面坐标数据 数据准备ArcGIS操作步骤-投影转换为 Sinusoidal1 投影2 计算几何Python 示例 另:Sinusoidal (World) 和 Sinusoidal (Sphere) 的主要区别参考 数据准备 数据投影: 目标投影:与MODIS数据相同(Sinu…

病理组学分析系列教程1:使用Python-histolab进行病理图像预处理,tiles切片自动生成

首先,先上参考资料链接: 了解数字病理影像图片WSI如何切割-使用histolab 视频详细讲解使用histolab进行病理图像切分 详细介绍数字病理图像的存储格式及格式转换工具介绍 一、病理图像预处理 相信很多朋友对于WSI这种巨大的病理图像的预处理都觉得束…

kubernetes——part3-2 集群声明式文件YAML

一、YAML介绍 YAML 的意思是:仍是一种标记语言,但为了强调这种语言以数据做为中心,而不是以标记语言为重点。是一个可读性高,用来表达数据序列的格式。 二、基本语法 1.低版本缩进时不允许使用Tab键,只允许使用空格…

使用Postman搞定各种接口token实战

现在许多项目都使用jwt来实现用户登录和数据权限,校验过用户的用户名和密码后,会向用户响应一段经过加密的token,在这段token中可能储存了数据权限等,在后期的访问中,需要携带这段token,后台解析这段token才…

什么是换电系统?驱动新能源汽车发展的“能源驿站”

随着新能源汽车保有量上升,新能源汽车充换电设施需求量同步增加。由于我国土地、电力资源相对紧张,随着车辆保有量继续增加,换电模式有望成为对充电模式的良好补充,具备广阔的中长期发展前景。蔚来是换电领域的先行者,…

Power BI - Connect to SharePoint online list with Image column

1.简单介绍 当前SharePoint online list有modern和classic两种模式,现在使用modern模式的比较多。list中有Image类型的列,Power BI如何连接到SharePoint list并显示image呢 note, SharePoint list中的Image列,Lookup列,People列…

[在线实验]-Redis Docker镜像的下载与部署

镜像下载 dockerredis镜像资源-CSDN文库 加载镜像 使用以下命令从redis.tar文件中加载Docker镜像 docker load --input redis.tar 创建映射目录 为了确保Redis的数据能够持久化,我们需要创建一个本地目录来存储这些数据 mkdir -p datasource/docker/redis 运…

redis学习(016 实战:黑马点评:分布式锁:Redisson)

黑马程序员Redis入门到实战教程,深度透析redis底层原理redis分布式锁企业解决方案黑马点评实战项目 总时长 42:48:00 共175P 此文章包含第64p-第p68的内容 文章目录 分布式锁的优化Redission操作编写代码 Redission可以实现可重入锁的原理lua脚本编写可重入锁获取…

SystemUI 下拉框 Build 版本信息去掉

需求及场景 去掉SystemUI 下拉框 Build 版本信息 如下图所示:去掉 12 (SP1A.201812.016) 了解 去掉之前我们先了解它是个什么东西:其实就是一个Build RTM 信息显示 Android_12_build_SP1A.210812.016 修改文件 /frameworks/base/packages/Syste…

UE5 打包报错 Unknown structure 的解决方法

在虚幻引擎5.5 打包报错如下: UATHelper: 打包 (Windows): LogInit: Display: LogProperty: Error: FStructProperty::Serialize Loading: Property ‘StructProperty /Game/Components/HitReactionComponent/Blueprints/BI_ReactionInterface.BI_ReactionInterface…

电子电气架构 --- 面向服务的汽车诊断架构

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 所有人的看法和评价都是暂时的,只有自己的经历是伴随一生的,几乎所有的担忧和畏惧,都是来源于自己的想象,只有你真的去做了,才会发现有多快乐。…

分布式协同 - 分布式锁一二事儿

文章目录 导图Pre概述概述1. 分布式互斥和临界资源的协调2. 分布式锁的基本原理3. 分布式锁的实现方式a. 基于数据库实现的分布式锁b. 基于Redis实现的分布式锁c. 基于Zookeeper实现的分布式锁 4. 高并发场景下的分布式锁优化a. 分段锁(Sharded Locks)b.…

CSP-J初赛不会备考咋办?

以下备考攻略仅供参考,如需资料请私信作者!求支持! 目录 一、编程语言基础 1.语法知识 -变量与数据类型 -运算符 -控制结构 -函数 2.标准库的使用 -输入输出流 -字符串处理 -容器类(可选) 二、算法与数据结构 1.基…

使用easyexcel导出复杂模板,同时使用bean,map,list填充

背景 在使用easyexcel导出时,如果遇到一个模板中同时存在 一部分是实体类中的字段,另外部分是列表的字段,需要特殊处理一下,比如下面的模板: 这里面 user, addr 是实体类(或者map&#xff09…

Monitor 显示器软件开发设计入门二

基础篇--显示驱动方案输出接口介绍 写在前面:首先申明,这篇文章是写给那些初入显示器软件行业的入门者,或是对显示器没有基本知识的小白人员。如您是行业大咖大神,可以绕行,可看后期进阶文章。 上篇介绍了输入接口及相…