.Net Core框架创建一个Windows服务类型的应用程序

embedded/2024/12/23 3:39:40/

在NuGet中的包管理中添加两个包

System.ServiceProcess.ServiceController

Microsoft.Extensions.Hosting.WindowsServices

在Program.cs中添加.UseWindowsService(),另外还需要设置管理员身份运行

Program.cs代码如下

public class Program
{public static void Main(string[] args){var identity = WindowsIdentity.GetCurrent();var principal = new WindowsPrincipal(identity);if (principal.IsInRole(WindowsBuiltInRole.Administrator)) //必须是管理员身份运行{CreateHostBuilder(args).Build().Run();}}public static IHostBuilder CreateHostBuilder(string[] args) =>Host.CreateDefaultBuilder(args).UseWindowsService().ConfigureWebHostDefaults(webBuilder =>{webBuilder.UseStartup<Startup>();});
}

以上步骤完成后,就可以通过以下几种方式启动这个Windows服务

  • 通过CMD命令启动
  • 通过一个.exe应用程序启动这个服务

以下列出的是通过CMD命令启动

1.CMD找到用于系统自动的用于启动Windows服务的工具
cd C:\Windows\Microsoft.NET\Framework\v4.0.30319 2.目录为你需要启动的Windows服务的程序(此命令是为了安装服务)
InstallUtil.exe "D:\Process.Manage.Service\bin\Debug\Process.Manage.Service.exe"3.启动这个服务(MyServive为服务名称)
net start MyServive4.停止服务(如果需要停止)
net stop MyServive5.卸载服务(如果需要卸载)
InstallUtil.exe /u "D:\Process.Manage.Service\bin\Debug\Process.Manage.Service.exe"

以下列出的是通过创建一个.exe应用程序,让后把这个应用程序放在.net Core程序目录中即可,下面是启动服务的详细代码

using System;
using System.Collections;
using System.Configuration.Install;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.ServiceProcess;
using System.Threading;namespace Install
{internal class Program{private static readonly string ServiceName = "Service";private static readonly string ServicePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Service.exe");private static void Consoler(string message){string date = System.DateTime.Now.ToString("HH:mm:ss,fff");System.Console.WriteLine($"{date} {message}");}static void Main(string[] args){try{if (IsExist(ServiceName)){Consoler($"检测到服务已安装。{ServicePath}");}else if (File.Exists(ServicePath)){//InstallService(ServicePath);Install(ServicePath);}else{throw new Exception($"指定文件不存在。{ServicePath}");}StartService(ServiceName);Consoler("操作已成功完成,3秒后窗口自动关闭……");Thread.Sleep(3000);}catch (Exception ex){Consoler($"服务安装失败!Error:{ex.Message}");Console.ReadKey(true);}}private static void Install(string servicePath){try{string createCommand = $"sc create \"{ServiceName}\" binPath= \"{servicePath}\" start= auto obj= \"LocalSystem\"";ExecuteCommand(createCommand);}catch (Exception err){Console.WriteLine(err.Message);}}private static void ExecuteCommand(string command){ProcessStartInfo startInfo = new ProcessStartInfo{FileName = "cmd.exe",Arguments = $"/c {command}",RedirectStandardOutput = true,RedirectStandardError = true,UseShellExecute = false,CreateNoWindow = true};using (Process process = new Process()){process.StartInfo = startInfo;process.Start();string output = process.StandardOutput.ReadToEnd();string error = process.StandardError.ReadToEnd();process.WaitForExit();}}/// <summary>/// 安装服务/// </summary>/// <param name="servicePath"></param>private static void InstallService(string servicePath){try{using (AssemblyInstaller installer = new AssemblyInstaller()){installer.UseNewContext = true;installer.Path = servicePath;IDictionary savedState = new Hashtable();installer.Install(savedState);installer.Commit(savedState);Consoler("安装服务成功");}}catch (Exception err){Consoler(err.Message);}}/// <summary>/// 启动服务/// </summary>/// <param name="serviceName"></param>private static void StartService(string serviceName){using (ServiceController service = new ServiceController(serviceName)){if (service.Status != ServiceControllerStatus.Running){service.Start();service.WaitForStatus(ServiceControllerStatus.Running, TimeSpan.FromSeconds(3));}Consoler("服务启动成功");}}private static bool IsExist(string serviceName){ServiceController[] services = ServiceController.GetServices();var list = services.Select(s => s.ServiceName).ToList();foreach (ServiceController sc in services){if (sc.ServiceName.ToLower() == serviceName.ToLower()){return true;}}return false;}}
}


http://www.ppmy.cn/embedded/147968.html

相关文章

BUUCTF-[SUCTF 2019]CheckIn -[WP]

进入环境、文件上传 先上传一句话 不能上传php后缀文件 改成图片后缀 <?被过滤 修改一下代码&#xff0c;上传 <script languagephp>eval($_POST[a]);</script> 返回exif_imagetype类型不对 exif_imagetype这个是php中的一个内置函数 用于判断一个给定文件…

信号处理:傅里叶变换与离散傅里叶变换

傅里叶变换&#xff08;Fourier Transform&#xff0c;FT&#xff09;和离散傅里叶变换&#xff08;Discrete Fourier Transform&#xff0c;DFT&#xff09;之间的关系在于它们处理的对象和应用场景不同&#xff0c;但本质上它们是相同的数学思想的两种实现形式。 关系与区别…

将VSCode配置成Goland的视觉效果

各种开发语言有其擅长的IDE作为开发工具&#xff0c;建议C/C首选Visual Studio&#xff0c;Go首选Goland&#xff0c;Java首选IDEA。当然如果习惯VSCode&#xff0c;或者使用的语言比较多&#xff0c;不想切换各种IDE&#xff0c;那就首选VSCode。 笔者开发Go项目有两三年了&a…

深入解析 `DataFrame.groupby` 和 `agg` 的用法及使用场景

深入解析 DataFrame.groupby 和 agg 的用法及使用场景 1. groupby 的基本用法语法&#xff1a;示例&#xff1a; 2. agg 的基本用法语法&#xff1a;示例&#xff1a; 3. first、sum、lambda 的用法3.1 first示例&#xff1a; 3.2 sum示例&#xff1a; 3.3 lambda示例&#xff…

获取显示器(主/副屏)友好名称(FriendlyName)

在开发涉及多显示器的应用程序时&#xff0c;获取显示器的友好名称&#xff08;Friendly Name&#xff09;是一个常见需求。本文将深入探讨GetMonitorFriendlyName 方法&#xff0c;了解其实现细节和工作原理。 方法签名 public static string GetMonitorFriendlyName(bool i…

网络安全概论——网络安全基础

一、网络安全引言 信息安全的四个属性&#xff08;信息安全的基本目标 &#xff09; 保密性:信息不会被泄露给非授权用户完整性&#xff1a;保证数据的一致性可用性&#xff1a;合法用户不会被拒绝服务合法使用&#xff1a;不会被非授权用户或以非授权的方式使用 二、网络安…

Docker实战

Docker 介绍 开始之前,还是简单介绍一下 Docker,更多 Docker 概念介绍可以看前一篇文章Docker 核心概念总结。 什么是 Docker? 说实话关于 Docker 是什么并不太好说,下面我通过四点向你说明 Docker 到底是个什么东西。 Docker 是世界领先的软件容器平台,基于 Go 语言 进…

【漏洞复现】CVE-2023-37461 Arbitrary File Writing

漏洞信息 NVD - cve-2023-37461 Metersphere is an opensource testing framework. Files uploaded to Metersphere may define a belongType value with a relative path like ../../../../ which may cause metersphere to attempt to overwrite an existing file in the d…