我的项目中的Windows服务*不是*的位置

时间:2009-05-15 16:38:37

标签: c# .net windows-services

如果我右键单击并在“服务”对话框中选择“服务上的属性”(比如“即插即用”),我会收到几条信息,包括“可执行文件的路径”。对于即插即用(在Vista中),这是:

C:\ Windows \ system32 \ svchost.exe -k DcomLaunch

如果我知道服务名称(和/或显示名称),是否有某些方法可以使用.NET代码获取相同的信息?

(我无法使用GetExecutingAssembly(),因为我没有从我的项目中运行该服务。)

3 个答案:

答案 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的引用。