Выяснение запущенного процесса службы 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.