Выяснение запущенного процесса службы Windows name.NET 1.1

мы используем плохо написанный сервис windows, который будет висеть, когда мы пытаемся остановить его из кода. Поэтому нам нужно найти, какой процесс связан с этой услугой, и убить его. Есть предложения?

6 ответов


WMI имеет эту информацию: класс Win32_Service.

запрос WQL, такой как

SELECT ProcessId FROM Win32_Service WHERE Name='MyServiceName'

использование системы.Руководство должно сделать трюк.

от быстрого взгляда см.:taskllist.exe /svc и другие инструменты из командной строки.


можно использовать System.Management.MangementObjectSearcher получить идентификатор процесса службы и 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.
                }
            }
        }
    }
}

можно использовать

tasklist /svc /fi "SERVICES eq YourServiceName"

чтобы найти имя и идентификатор процесса, а также если тот же процесс размещает другие службы.


чтобы точно ответить на мой вопрос-как найти процесс, связанный с какой-либо услугой:

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

}


Microsoft / SysInternals имеет инструмент командной строки под названием PsKill, который позволяет убить процесс по имени. Этот инструмент также позволяет убивать процессы на других серверах. Windows SysInternals

использование: pskill [- t] [\computer [- U username [- p password]]]
   -убивал процесс и его потомки.
   -U указывает имя пользователя для входа в удаленную систему.
   -п указывает пароль для имени пользователя. Если вы опустите это, вам будет предложено ввести скрытый пароль.


Я думаю, это двухэтапный процесс - если это всегда одна и та же Служба, вы можете легко найти имя процесса, используя методы, предложенные в других ответах.

затем у меня есть следующий код в классе на веб-сервере .NET 1.1:

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

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

на убить способ может выдать несколько исключений, которые вы должны рассмотреть, чтобы поймать - особенно Win32Exception, который выдается, если процесс не может быть убит.

отметим, что WaitForExit метод и HasExited property также существуют в мире 1.1, но не упоминаются на странице документации для Kill в 1.1.