如何获取在" svchost.exe"下运行的所有服务名称处理

时间:2017-10-05 14:47:55

标签: c# wmi

使用以下WMI查询,我可以获取所有服务名称,

ManagementObjectSearcher mos = new ManagementObjectSearcher("SELECT * FROM Win32_Service ")

此外,当我在命令提示符下运行命令时,它将提供所有进程ID(PID)和服务名称,

tasklist /svc /fi "imagename eq svchost.exe" 

我希望WMI / C#方式找到在" svchost.exe"下运行的所有服务。过程

除了WMI之外还有其他方法吗?

3 个答案:

答案 0 :(得分:2)

我会创建一个批处理文件,我用C#触发它并捕获返回值 列表。

解决方案可能如下所示:

myBatch.bat:

tasklist /svc /fi "IMAGENAME eq svchost.exe"

C#程序:

 Process p = new Process();
 p.StartInfo.UseShellExecute = false;
 p.StartInfo.RedirectStandardOutput = true;
 p.StartInfo.FileName = "myBatch.bat";
 p.Start();
 string output = p.StandardOutput.ReadToEnd();
 Console.Write(output);
 p.WaitForExit();

答案 1 :(得分:1)

您可以使用与您相同的代码列出所有服务,然后只需遍历它们并检查其PathName是否类似于"C:\WINDOWS\system32\svchost.exe ... "。那将是最简单的方法。

另一种选择是将您的查询重写为以下内容:

string q = "select * from Win32_Service where PathName LIKE \"%svchost.exe%\"";
ManagementObjectSearcher mos = new ManagementObjectSearcher(q);

答案 2 :(得分:1)

ServiceController.getServices 方法怎么样?

通常,您可以通过 Process.GetProcesses 方法获取流程。文档说明:

  

可以在服务主机进程(svchost.exe)的同一实例中加载多个Windows服务。 GetProcesses不识别那些个人服务;为此,请参阅GetServices。

如果您需要有关服务的更多信息,您必须依赖WMI,而不是迭代它们。

所以我建议你用它来检查过程

foreach (ServiceController scTemp in scServices)
{
   if (scTemp.Status == ServiceControllerStatus.Running)
   {
      Console.WriteLine("  Service :        {0}", scTemp.ServiceName);
      Console.WriteLine("    Display name:    {0}", scTemp.DisplayName);

     // if needed: additional information about this service.
     ManagementObject wmiService;
     wmiService = new ManagementObject("Win32_Service.Name='" +
     scTemp.ServiceName + "'");
     wmiService.Get();
     Console.WriteLine("    Start name:      {0}", wmiService["StartName"]);
     Console.WriteLine("    Description:     {0}", wmiService["Description"]);
   }
}

Source