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

如何使用C#获取Windows服务(services.msc)中的可执行文件路径?

如何用C#获取Windows服务的可执行文件路径?

你想获取Windows服务中(对应配图高亮内容)的可执行文件路径,但当前代码无法返回正确结果。你尝试的代码如下:

private string GetInstallationPath(string serviceName)
{
    ServiceController[] services = ServiceController.GetServices();
    foreach (ServiceController service in services)
    {
        if (service.ServiceName == serviceName)
        {
            return service.GetType().Assembly.Location.ToString();
        }
    }
    return string.Empty;
}

你的代码问题在于service.GetType().Assembly.Location获取的是.NET Framework中ServiceController类所在程序集的路径,完全不是目标服务的可执行文件路径。要获取服务真实的可执行路径,需要读取Windows注册表——服务的核心配置信息都存在这里。

正确实现方法

服务的配置项存储在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\{服务名}路径下,其中ImagePath键值就是服务的可执行文件路径(可能包含启动参数)。我们需要读取这个值并处理掉多余的引号和参数:

using Microsoft.Win32;
using System.Text.RegularExpressions;

private string GetServiceExecutablePath(string serviceName)
{
    // 拼接服务对应的注册表路径
    string registryKeyPath = $"SYSTEM\\CurrentControlSet\\Services\\{serviceName}";
    
    using (RegistryKey serviceKey = Registry.LocalMachine.OpenSubKey(registryKeyPath))
    {
        if (serviceKey == null)
            return string.Empty;

        // 读取ImagePath键值
        object imagePathValue = serviceKey.GetValue("ImagePath");
        if (imagePathValue == null)
            return string.Empty;

        string rawImagePath = imagePathValue.ToString();
        // 匹配带引号或不带引号的可执行文件路径,排除后续参数
        Match pathMatch = Regex.Match(rawImagePath, @"^""?([^""\s]+)""?");
        
        return pathMatch.Success ? pathMatch.Groups[1].Value : rawImagePath;
    }
}

注意事项

  • 运行程序需要管理员权限,否则可能无法读取注册表的该路径
  • 正则表达式会处理两种常见格式:"C:\Service.exe" 或 C:\Service.exe -arg1,提取出纯可执行文件路径
  • 如果服务的ImagePath格式特殊,可能需要根据实际情况调整正则逻辑

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 18:35:50