2017-10-05 59 views
1

使用下面的WMI查詢我能夠得到所有服務的名稱上運行的所有服務的名稱,如何獲得,根據「中svchost.exe」進程

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

而且,當我在命令提示符下運行以下命令,它會給所有的進程ID(PID)和服務名稱,

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

我想WMI/C#的方式找到所有這下「的svchost.exe」進程中運行的服務?

除了WMI還有其他方法嗎?

+0

我認爲你正在尋找一個比較難看的解決方案,基本上你最終使用電話(非託管)的DLL PInvoke的。我認爲你需要的ABI參考是在https://msdn.microsoft.com/en-us/library/aa394418(v=vs.85).aspx。它可能會減少調用一個麻煩PowerShell腳本或在後臺的東西。 – BurnsBA

+1

更好的問題:你對這些信息做了什麼?根據這一點,甚至可能比獲得現在獲得的更簡單/更好的方法。 –

回答

1

你可以使用和你一樣的代碼列出所有的服務,然後遍歷它們並檢查它們的PathName是否與"C:\WINDOWS\system32\svchost.exe ... "類似。這將是最簡單的方法。

另一種選擇是將您的查詢改寫成這樣:

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

我想創建一個批處理文件,我觸發與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

怎麼樣ServiceController.getServices方法?

通常情況下,您將通過Process.GetProcesses方法獲取流程。雖然文檔狀態如下:

多個Windows服務可以在服務主機進程(svchost.exe)的同一實例中加載。 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

相關問題