Проблема, с которой вы столкнулись, кажется, из-за кодирования. Можете ли вы обновить функцию open
, чтобы добавить кодировку, а также открыть ее в двоичном виде? Ваш код должен выглядеть примерно так.
with open("filename.txt", "rb") as f:
contents = f.read().decode("UTF-8")
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
}
}
}
Я предполагаю, что это - два процесса шага - если это всегда - тот же сервис, можно легко найти методы использования имени процесса предложенными в других ответах.
У меня затем есть следующий код в классе на.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 также существуют в 1,1 мирах, но не упоминаются на странице документации для Уничтожения в 1,1.
Microsoft/SysInternals имеет инструмент командной строки под названием PsKill, который позволяет Вам уничтожать процесс по имени. Этот инструмент также позволяет Вам уничтожать процессы на других серверах. Windows SysInternals
Использование: pskill [-t] [\computer [-u имя пользователя [-p пароль]]] <обрабатывают идентификатор | имя>
- t Уничтожают процесс и его потомков.
- u Указывает дополнительное имя пользователя для входа в систему удаленного компьютера.
- p Указывает дополнительный пароль для имени пользователя. При исключении этого, Вам предложат ввести скрытый пароль.