Finding out Windows service's running process name .NET 1.1

前端 未结 6 629
野性不改
野性不改 2020-12-30 08:48

We are using a badly written windows service, which will hang when we are trying to Stop it from code. So we need to find which process is related to that service and kill i

6条回答
  •  误落风尘
    2020-12-30 09:42

    You can use System.Management.MangementObjectSearcher to get the process ID of a service and System.Diagnostics.Process to get the corresponding Process instance and kill it.

    The KillService() method in the following program shows how to do this:

    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.
                    }
                }
            }
        }
    }

提交回复
热议问题