Обнаружение рабочей службы Windows обрабатывает, называют.NET 1.1

Проблема, с которой вы столкнулись, кажется, из-за кодирования. Можете ли вы обновить функцию open, чтобы добавить кодировку, а также открыть ее в двоичном виде? Ваш код должен выглядеть примерно так.

with open("filename.txt", "rb") as f:
    contents = f.read().decode("UTF-8")
7
задан the berserker 19 February 2009 в 14:53
поделиться

6 ответов

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

WQL запрашивает как

SELECT ProcessId FROM Win32_Service WHERE Name='MyServiceName'

использование Системы. Управление должно добиться цели.

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

5
ответ дан 6 December 2019 в 07:28
поделиться

Можно использовать 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.
                }
            }
        }
    }
}
13
ответ дан 6 December 2019 в 07:28
поделиться

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

tasklist /svc /fi "SERVICES eq YourServiceName"

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

4
ответ дан 6 December 2019 в 07:28
поделиться

Для ответа точно на мой вопрос - как найти Процесс связанным с некоторым сервисом:

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

}

2
ответ дан 6 December 2019 в 07:28
поделиться

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

У меня затем есть следующий код в классе на.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.

0
ответ дан 6 December 2019 в 07:28
поделиться

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

Использование: pskill [-t] [\computer [-u имя пользователя [-p пароль]]] <обрабатывают идентификатор | имя>
   - t  Уничтожают процесс и его потомков.
   - u  Указывает дополнительное имя пользователя для входа в систему удаленного компьютера.
   - p  Указывает дополнительный пароль для имени пользователя. При исключении этого, Вам предложат ввести скрытый пароль.

0
ответ дан 6 December 2019 в 07:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: