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 服务开发的全面指导,让您的服务更加稳定、高效。

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

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

相关文章

【C++笔记】位图和布隆过滤器

【C笔记】位图和布隆过滤器 🔥个人主页:大白的编程日记 🔥专栏:C笔记 文章目录 【C笔记】位图和布隆过滤器前言一. 位图1.1 位图相关面试题1.2 C库中的位图1.3位图优缺点1.4位图相关考察题目 二.布隆过滤器2.1 什么是布隆过滤器…

小迪安全第四十二天笔记 简单的mysql注入 mysql的基础知识 用户管理数据库模式 mysql 写入与读取 跨库查询

前言 之前的安全开发我们学习了 php联动数据库的模式 ,这个模式是现在常用的模式 这一节来学习 如何 进行数据库的注入和数据库相关知识 1、了解数据库的结构 我们使用 navicate连接数据库之后看一下 一共四层结构 库 》表》字段》数据 这个层级关系…

如何估算自然对流传热系数

介绍 一般来说,对流可以定义为通过加热流体(例如空气或水)的运动来传递热量的过程。 自然对流(对流的一种特定类型)可以定义为流体在重力作用下由于较热因此密度较小的物质上升,而较冷且密度较大的物质下…

阿里云服务器(centos7.6)部署前后端分离项目(MAC环境)

Jdk17安装部署 下载地址:https://www.oracle.com/java/technologies/downloads/ 选择自己需要的jdk版本进行下载。 通过mac终端scp命令上传下载好的jdk17到服务器的/usr/local目录下 scp -r Downloads/jdk-17.0.13_linux-x64_bin.tar.gz 用户名服务器ip地址:/us…

ipad项目 蓝湖宽度

ipad项目 横屏状态时 蓝湖宽度设置930px media screen and (orientation: portrait) {/* 竖屏时的样式 */ } media screen and (orientation: landscape) {/* 默认是 横屏时的样式 */ }

【Linux——实现一个简易shell】

黑暗中的我们都没有说话,你只想回家,不想你回家............................................................... 文章目录 前言 一、【shell工作过程】 二、【命令行参数】 2.1、【获取命令行参数】 1、【输出命令行提示符】 2、【输入命令行参数】 2…

理解Linux的select、poll 和 epoll:从原理到应用场景

I/O 多路复用并不是什么新东西,select 早在 1983 年就出现了,poll 在 1997 年,epoll 是 2002 年的产物。面试题总爱问“多路复用多厉害?”其实它就是把轮询的锅甩给了操作系统,而操作系统不过是用 CPU 指令帮你完成事件…

阅读方法论

选择固有缺陷,选项是对比出来的

关于函数式接口和编程的解析和案例实战

文章目录 匿名内部类“匿名”在哪里 函数式编程lambda表达式的条件Supplier使用示例 ConsumeracceptandThen使用场景 FunctionalBiFunctionalTriFunctional 匿名内部类 匿名内部类的学习和使用是实现lambda表达式和函数式编程的基础。是想一下,我们在使用接口中的方…

ChatGPT 网络安全秘籍(二)

第三章:代码分析和安全开发 这一章深入探讨软件开发的复杂过程,关注当今数字世界中的一个关键问题:确保软件系统的安全。随着技术的不断复杂和威胁的不断演变,采用融合了安全考虑的安全软件开发生命周期(SSDLC&#x…

学习笔记044——HashMap源码学习2

文章目录 1、HasMap 底层实现2、HashMap 加载顺序 1、HasMap 底层实现 JDK 1.8 HashMap 底层设计涉及到三种不同的数据结构,分别是数组、链表、红黑树。 1、基本的存储是数组,根据 key 值求出一个数组下标,将元素(key-value&am…

计算机网络常见面试题总结(上)

计算机网络基础 网络分层模型 OSI 七层模型是什么?每一层的作用是什么? OSI 七层模型 是国际标准化组织提出的一个网络分层模型,其大体结构以及每一层提供的功能如下图所示: 每一层都专注做一件事情,并且每一层都需…

用micropython 操作stm32f4单片机的定时器实现蜂鸣器驱动

import pyb import time # 初始化引脚和定时器通道作为PWM输出 # 注意:这里我们假设您使用的是支持PWM的引脚和定时器 # 在不同的MicroPython板上,支持的引脚和定时器可能不同 # 请查阅您的板的文档以确认正确的引脚和定时器 buzzer_pin pyb.Pin(PD15,…

前端框架Vue3项目实战(基于Vue3实现一个小相册)

下面是是对Vue3操作的一个项目实战 下面代码是html的基本骨架&#xff08;没有任何的功能&#xff09;&#xff1a; <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <title>相册</title> <style&…

【英特尔IA-32架构软件开发者开发手册第3卷:系统编程指南】2001年版翻译,2-39

文件下载与邀请翻译者 学习英特尔开发手册&#xff0c;最好手里这个手册文件。原版是PDF文件。点击下方链接了解下载方法。 讲解下载英特尔开发手册的文章 翻译英特尔开发手册&#xff0c;会是一件耗时费力的工作。如果有愿意和我一起来做这件事的&#xff0c;那么&#xff…

群控系统服务端开发模式-应用开发-前端短信配置开发

一、添加视图 在根目录下src文件夹下views文件夹下param文件夹下sms文件夹下&#xff0c;新建index.vue&#xff0c;代码如下 <template><div class"app-container"><div class"filter-container" style"float:left;"><el…

极致性能:19个Vue 项目的优化手段

前言 在前端开发领域&#xff0c;Vue.js 广泛应用于各种类型的项目中。然而&#xff0c;随着项目规模的扩大和用户需求的增加&#xff0c;性能优化的重要性愈发凸显。优化不仅可以提升用户体验&#xff0c;还能显著减少资源消耗&#xff0c;提高应用的响应速度和稳定性。 本文…

基于Java Springboot个人记账之财来财往微信小程序

一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术&#xff1a;Html、Css、Js、Vue、Element-ui 数据库&#xff1a;MySQL 后端技术&#xff1a;Java、Spring Boot、MyBatis 三、运行环境 开发工具&#xff1a;IDEA/eclipse 微信…

【maven-5】Maven 项目构建的生命周期:深入理解与应用

1. 生命周期是什么 ​在Maven出现之前&#xff0c;项目构建的生命周期就已经存在&#xff0c;软件开发人员每天都在对项目进行清理&#xff0c;编译&#xff0c;测试及部署。虽然大家都在不停地做构建工作&#xff0c;但公司和公司间&#xff0c;项目和项目间&#xff0c;往往…

LLamafactory API部署与使用异步方式 API 调用优化大模型推理效率

文章目录 背景介绍第三方大模型API 介绍LLamafactory 部署API大模型 API 调用工具类项目开源 背景介绍 第三方大模型API 目前&#xff0c;市面上有许多第三方大模型 API 服务提供商&#xff0c;通过 API 接口向用户提供多样化的服务。这些平台不仅能提供更多类别和类型的模型…