C # Query Windows Service - PullRequest
       38

C # Query Windows Service

3 голосов
/ 15 июля 2011

Я использую приложение, которое запрашивает службы Windows, работающие на удаленных серверах, и записывает имя машины, имя службы и состояние в базу данных.

Тем не менее, я хочу также попытаться захватить тип запуска (автоматический, ручной, отключенный). Я использовал Service Controller, у которого нет опций для типа запуска, поэтому я начал смотреть на использование класса управления. Этот класс выглядит так, как будто в нем есть все, что мне нужно, но я не знаю, как использовать его на своих удаленных серверах. Для Service Controller я делал это:

ServiceController[] services = ServiceController.GetServices(serverIP);

foreach (ServiceController service in services)
{
   var machine = service.MachineName;
   var displayName = service.DisplayName;
   var status = service.Status;
}

Я пробовал это для класса управления:

ManagementClass class1 = new ManagementClass(serverIP + "\\" + "Win32_Service");

foreach (ManagementObject ob in class1.GetInstances())
{
   var machine = serverIP;
   var displayName = ob.GetPropertyValue("Description");
   var name = ob.GetPropertyValue("PathName");
   var startMode = ob.GetPropertyValue("StartMode");
   var status = ob.GetPropertyValue("State");
}

Но, конечно, это не сработало. Кто-нибудь знает, как я могу получить Услуги с удаленного компьютера, используя класс управления? Или есть другой способ использования Service Controller для получения типа запуска?

Я также пытался объединить их обоих и поместить оператор foreach класса управления в Service Controller, но он застрял в бесконечном цикле.

Ответы [ 2 ]

1 голос
/ 15 июля 2011

Информация, которую вы ищете, доступна в WMI.

Будет гораздо проще написать все это в PowerShell, чем в Pure C #. Код WMI очень быстро запутывается в C # (или C ++, или VBScript). Этот фрагмент демонстрирует получение данных из списка компьютеров. Чтобы встроить в C #, просто используйте System.Management.Automation и добавьте PowerShell.Create (). AddScript (...). Invoke ()

.
$computerList = "a","b","c"
Get-WmiObject -computerName $computerList -asjob
    | Wait-job
    | receive-job
    | Select-Object DisplayName, Description, StartMode, State

Надеюсь, это поможет,

0 голосов
/ 16 июля 2011

Тот же код выше работал.Просто добавьте это в класс управления

(@"\\" + serverIP + "\\root\\cimv2:Win32_Service")
...