如果我右键单击并在“服务”对话框中选择“服务上的属性”(比如“即插即用”),我会收到几条信息,包括“可执行文件的路径”。对于即插即用(在Vista中),这是:
C:\ Windows \ system32 \ svchost.exe -k DcomLaunch
如果我知道服务名称(和/或显示名称),是否有某些方法可以使用.NET代码获取相同的信息?
(我无法使用GetExecutingAssembly()
,因为我没有从我的项目中运行该服务。)
答案 0 :(得分:3)
没有互操作的另一个选择是WMI查找(或注册表 - 有点hacky!)。
以下是基于this code的简单示例:
private static string GetServiceImagePathWMI(string serviceDisplayName)
{
string query = string.Format("SELECT PathName FROM Win32_Service WHERE DisplayName = '{0}'", serviceDisplayName);
using (ManagementObjectSearcher search = new ManagementObjectSearcher(query))
{
foreach(ManagementObject service in search.Get())
{
return service["PathName"].ToString();
}
}
return string.Empty;
}
答案 1 :(得分:1)
此信息位于QUERY_SERVICE_CONFIG结构中。您将需要使用P / Invoke来解决它。
基本过程是:
调用OpenSCManager以获取托管服务的句柄。
调用OpenService以获取服务的句柄。
调用QueryServiceConfig以获取QUERY_SERVICE_CONFIG结构。
答案 2 :(得分:1)
总是有here所述的WMI课程Win32_Service
,特别是PathName
。
这有效:
ManagementClass mc = new ManagementClass("Win32_Service");
foreach(ManagementObject mo in mc.GetInstances())
{
if(mo.GetPropertyValue("Name").ToString() == "<Short name of your service>")
{
return mo.GetPropertyValue("PathName").ToString().Trim('"');
}
}
如果您有任何与Reference相关的问题,请在项目中添加System.Management的引用。