.NET 6.0 Worker Service如何通过代码设置Windows服务描述等属性?
.NET 6 Worker Service 代码设置Windows服务信息
当然可以通过代码设置Windows服务的名称、显示名称和描述,具体方法如下:
1. 设置服务名称
直接在.UseWindowsService()的配置选项里指定即可,这是最直接的方式:
var builder = Host.CreateDefaultBuilder(args) .ConfigureServices(services => { services.AddHostedService<Worker>(); }) .UseWindowsService(options => { options.ServiceName = "MyCustomWorkerService"; // 自定义服务名称 }); var host = builder.Build(); host.Run();
2. 设置显示名称和服务描述
这两个信息存储在Windows注册表中,需要通过修改注册表或ServiceController类来设置,注意必须以管理员权限运行程序才能操作:
方法:写个辅助工具类实现
using Microsoft.Win32; using System.ServiceProcess; public static class ServiceConfigHelper { public static void UpdateServiceMetadata(string serviceName, string displayName, string description) { // 操作注册表更新显示名称和描述 using var serviceKey = Registry.LocalMachine.OpenSubKey( $"SYSTEM\\CurrentControlSet\\Services\\{serviceName}", writable: true); if (serviceKey == null) return; serviceKey.SetValue("DisplayName", displayName); serviceKey.SetValue("Description", description); // 可选:重启服务让设置立即生效 using var serviceController = new ServiceController(serviceName); if (serviceController.Status == ServiceControllerStatus.Running) { serviceController.Stop(); serviceController.WaitForStatus(ServiceControllerStatus.Stopped); serviceController.Start(); serviceController.WaitForStatus(ServiceControllerStatus.Running); } } }
然后在Worker服务的启动逻辑里调用(建议只执行一次,比如判断注册表是否已有值再调用):
protected override async Task ExecuteAsync(CancellationToken stoppingToken) { // 仅第一次运行时设置(可根据实际情况调整判断逻辑) using var checkKey = Registry.LocalMachine.OpenSubKey($"SYSTEM\\CurrentControlSet\\Services\\MyCustomWorkerService"); if (checkKey != null && checkKey.GetValue("Description") == null) { ServiceConfigHelper.UpdateServiceMetadata( "MyCustomWorkerService", "我的后台任务服务", "基于.NET 6 Worker Service开发的Windows服务,负责定时执行后台任务"); } // 你的业务逻辑代码 while (!stoppingToken.IsCancellationRequested) { _logger.LogInformation("Worker running at: {time}", DateTimeOffset.Now); await Task.Delay(1000, stoppingToken); } }
注意事项
- 操作注册表和服务必须拥有管理员权限,否则会抛出权限异常
- 显示名称和描述只需设置一次,没必要每次服务启动都执行修改操作,可以加判断逻辑避免重复操作
- 也可以通过
sc命令在安装服务时直接设置(比如sc create 服务名 binPath= "exe路径" DisplayName= "显示名称" Description= "描述"),但如果要完全通过代码实现,上面的方法就适用
内容的提问来源于stack exchange,提问作者MCMod
相关产品推荐
相关产品推荐

