我們正在使用寫得很差的Windows服務,當我們試圖從代碼中停止它時,它將掛起。所以我們需要找到哪個進程與該服務相關並殺死它。 有什麼建議嗎?查找Windows服務的運行進程名稱.NET 1.1
6
A
回答
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
微軟/ 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 method和HasExited 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
}
}
}
相關問題
- 1. .Net Windows服務不運行
- 2. 查找MySql服務器實例的windows服務名稱
- 3. 從Windows服務運行外部進程
- 4. C#.net windows服務與遠程web服務進行通信
- 5. Windows服務器查殺長時間運行的PHP進程
- 6. 檢查Windows服務器中運行的PHP進程
- 7. 如何在.net中查找服務的「顯示名稱」?
- 8. 查找域的名稱服務器
- 9. 查找InstallShield服務/進程
- 10. .NET Windows服務用戶名
- 11. .NET運行時如何找到非強名稱的程序集?
- 12. 檢查進程是否正在運行(使用進程名稱)
- 13. 如何找出PID從給定的服務名稱在命令行中運行的Windows服務的?
- 14. .net 1.1在服務器2008r2
- 15. 如何在運行時獲取Windows服務的名稱?
- 16. 查找UNIX上是否運行進程(服務器)
- 17. 在Azure中查找服務名稱?
- 18. 如何查找Oracle服務名稱
- 19. 在任務管理器中查找Windows進程的名稱以殺死它。
- 20. 運行外部應用程序的.NET Windows服務
- 21. 通過PID查找進程名稱
- 22. sql服務器查詢找到SSIS運行代理的名稱套件
- 23. 我們如何找到正在運行的Windows服務的進程ID?
- 24. 如何讓進程在遠程Windows服務器上運行
- 25. 查找運行服務的Android
- 26. 在運行時更改進程名稱
- 27. 運行.NET程序作爲服務
- 28. 從C#獲取正在運行的Java程序的名稱(如.NET應用程序的進程名稱)
- 29. Windows Form .Net 1.1&WCF
- 30. 從windows服務中查殺進程
良好的代碼感謝。但是,我會將「if(process!= null)」更改爲「if(process!= null && process.Id> 0)」。 Windows不會讓你殺死進程零,但最好不要嘗試。更快地測試它,而不是引發和捕獲異常。 – 2012-03-20 14:44:15