2009-02-19 67 views

回答

5

WMI具有以下信息:Win32_Service類。

WQL查詢喜歡使用System.Management應該做的伎倆

SELECT ProcessId FROM Win32_Service WHERE Name='MyServiceName' 

從快速查看:taskllist.exe /svc和其他工具從命令行。

4

您可以使用

tasklist /svc /fi "SERVICES eq YourServiceName" 

要查找的進程名和ID,並且如果同一進程的主機等服務。

12

您可以使用System.Management.MangementObjectSearcher獲取服務的進程ID,並使用System.Diagnostics.Process獲取相應的Process實例並將其終止。

在下面的程序將KillService()方法顯示瞭如何做到這一點:

using System; 
using System.ComponentModel; 
using System.Diagnostics; 
using System.Management; 

namespace KillProcessApp { 
    class Program { 
     static void Main(string[] args) { 
      KillService("YourServiceName"); 
     } 

     static void KillService(string serviceName) { 
      string query = string.Format(
       "SELECT ProcessId FROM Win32_Service WHERE Name='{0}'", 
       serviceName); 
      ManagementObjectSearcher searcher = 
       new ManagementObjectSearcher(query); 
      foreach (ManagementObject obj in searcher.Get()) { 
       uint processId = (uint) obj["ProcessId"]; 
       Process process = null; 
       try 
       { 
        process = Process.GetProcessById((int)processId); 
       } 
       catch (ArgumentException) 
       { 
        // Thrown if the process specified by processId 
        // is no longer running. 
       } 
       try 
       { 
        if (process != null) 
        { 
         process.Kill(); 
        } 
       } 
       catch (Win32Exception) 
       { 
        // Thrown if process is already terminating, 
        // the process is a Win16 exe or the process 
        // could not be terminated. 
       } 
       catch (InvalidOperationException) 
       { 
        // Thrown if the process has already terminated. 
       } 
      } 
     } 
    } 
}
+0

良好的代碼感謝。但是,我會將「if(process!= null)」更改爲「if(process!= null && process.Id> 0)」。 Windows不會讓你殺死進程零,但最好不要嘗試。更快地測試它,而不是引發和捕獲異常。 – 2012-03-20 14:44:15

0

微軟/ Sysinternals的有一個名爲PsKill一個命令行工具,可以讓你的名字來殺死一個進程。該工具還允許您終止其他服務器上的進程。 Windows SysInternals

用法:pskill [-t] [\計算機[-u用戶名[-p密碼]]] <進程ID |名稱>
      -t    殺死進程及其後代。
      -u    指定用於登錄遠程計算機的可選用戶名。
      -p    指定用戶名的可選密碼。如果你省略了這個,你會被提示輸入一個隱藏的密碼。

0

我想這是一個兩步過程 - 如果它總是相同的服務,您可以使用其他答案中建議的方法輕鬆找到進程名稱。

然後我有一個類中的.NET 1.1的Web服務器上的下面的代碼:

Process[] runningProcs = 
      Process.GetProcessesByName("ProcessName"); 

foreach (Process runningProc in runningProcs) 
{ 
    // NOTE: Kill only works for local processes 
    runningProc.Kill(); 
} 

Kill method可以拋出,你應該考慮抓住少數例外 - 尤其是Win32Exception,丟棄如果過程不能被殺死。

請注意,WaitForExit methodHasExited property也存在於1.1的世界中,但在1.1中的Kill的文檔頁面中未提及。

1

要準確地回答了我的問題 - 如何找到相關的一些服務流程:

ManagementObjectSearcher searcher = new ManagementObjectSearcher 
    ("SELECT * FROM Win32_Service WHERE DisplayName = '" + serviceName + "'"); 

foreach(ManagementObject result in searcher.Get()) 
{ 
    if (result["DisplayName"].ToString().ToLower().Equals(serviceName.ToLower())) 
    { 
    int iPID = Convert.ToInt32(result["ProcessId"]); 
    KillProcessByID(iPID, 1000); //some method that will kill Process for given PID and timeout. this should be trivial 
    } 
} 

}