You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用C#获取Windows服务的启动类型(替代可视化界面操作)

获取Windows服务启动类型的C#实现方案

嘿,我刚好帮客户处理过类似的需求,不用让他们去折腾Windows服务控制台,用C#代码就能轻松获取服务的启动类型,给你分享两种靠谱的实现方式:

方法一:通过WMI(System.Management)查询

这种方式比较直观,WMI专门提供了Win32_Service类来管理系统服务,能直接拿到启动类型。

步骤:

  1. 右键你的项目 → 管理NuGet程序包,搜索并安装System.Management包(或者直接在项目引用里添加System.Management程序集)
  2. 编写代码:
using System;
using System.Management;

public static string GetServiceStartType(string serviceName)
{
    try
    {
        // 构造WMI查询语句,指定要查询的服务名称
        string query = $"SELECT StartMode FROM Win32_Service WHERE Name = '{serviceName}'";
        ManagementObjectSearcher searcher = new ManagementObjectSearcher(query);
        
        foreach (ManagementObject service in searcher.Get())
        {
            // StartMode返回的是字符串,比如"Auto"、"Manual"、"Disabled"等
            return service["StartMode"]?.ToString() ?? "未知";
        }
        return "未找到指定服务";
    }
    catch (Exception ex)
    {
        return $"查询失败:{ex.Message}";
    }
}

// 使用示例
public static void Main()
{
    string serviceName = "wuauserv"; // Windows更新服务的内部名称
    string startType = GetServiceStartType(serviceName);
    Console.WriteLine($"服务 {serviceName} 的启动类型:{startType}");
}

方法二:读取注册表获取启动类型

如果某些环境下WMI被禁用或者权限受限,直接读取注册表也是个不错的选择。服务的启动类型信息存在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\[服务名]路径下的Start值里。

代码实现:

using System;
using Microsoft.Win32;

public static string GetServiceStartTypeFromRegistry(string serviceName)
{
    try
    {
        // 打开注册表路径
        using (RegistryKey key = Registry.LocalMachine.OpenSubKey($"SYSTEM\\CurrentControlSet\\Services\\{serviceName}"))
        {
            if (key == null)
                return "未找到指定服务";
            
            // 获取Start值,不同数值对应不同启动类型
            int startValue = (int)key.GetValue("Start", -1);
            return startValue switch
            {
                0 => "引导启动",
                1 => "系统启动",
                2 => "自动",
                3 => "手动",
                4 => "禁用",
                _ => "未知"
            };
        }
    }
    catch (Exception ex)
    {
        return $"查询失败:{ex.Message}";
    }
}

// 使用示例
public static void Main()
{
    string serviceName = "wuauserv";
    string startType = GetServiceStartTypeFromRegistry(serviceName);
    Console.WriteLine($"服务 {serviceName} 的启动类型:{startType}");
}

注意事项:

  • 两种方式都需要管理员权限才能正常读取所有服务的信息,所以记得让程序以管理员身份运行
  • 服务名称是服务的“内部名称”,不是显示名称,比如Windows更新服务的显示名称是"Windows Update",但内部名称是"wuauserv",可以在服务控制台的“属性”里查看

内容的提问来源于stack exchange,提问作者Dionatas Firmino

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 10:09:12