如何使用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
相关产品推荐
相关产品推荐

