Управляем службами Windows с помощью PowerShell. Часть 3

от автора


Продолжаем публиковать переводы статей, выходящих на портале 4sysops.com, посвященных управлению службами Windows с помощью PowerShell. В двух предыдущих постах были рассмотрены вопросы получения статуса служб на локальном и удаленном компьютерах (здесь) и базовые моменты управления службами (запуск, остановка, пауза и прочее – здесь). В этом посте будет рассказано, как использовать WMI и CIM для целей конфигурирования служб на удаленных компьютерах.

В последней статье я показал пару примеров использования Set-Service для конфигурирования служб. Однако здесь имеются некоторые ограничения, особенно когда мы работаем со службами на удаленных машинах. Частично это обусловлено тем, что такие командлеты как Get-Service и Set-Service предназначены для работы с объектом службы, который выражен через .NET Framework — System.ServiceProcess.ServiceController. С позиций администратора в таком определении объекта отсутствует ряд полезной информации, например, под какой учетной записью запущена служба. К счастью, здесь нам на помощь приходит Windows Management Instrumentation (WMI).

Используем WMI

Мы можем использовать Get-WmiObject для извлечения экземпляра объекта службы. Я продемонстрирую в PS 3.0 на Windows 8, но та же самая команда должна работать и PS 2.0. Найдем те службы, у которых класс — Win32_Service.

PS C:\> get-wmiobject win32_service | format-table 

image

Я отформатировал вывод команды, чтобы его было легче читать. А теперь давайте взглянем на отдельную службу.

PS C:\> get-wmiobject win32_service -filter "name='bits'" ExitCode : 0 Name : BITS ProcessId : 876 StartMode : Auto State : Running Status : OK 

Чтобы получить другие свойства, используем следующую команду.

PS C:\> get-wmiobject win32_service -filter "name='bits'" | Select * 

Вывод показан на скриншоте.

image

Теперь вы знаете свойства службы, и можете создавать уточняющие запросы, используя параметр–Filter.

Получаем тип автозагрузки

Свойство StartMode показывает, стартует ли служба автоматически или должна запускаться вручную. Когда вы это узнаете, то можете использовать следующие команды:

PS C:\> get-wmiobject win32_service -filter "StartMode <>'disabled'" | sort StartMode | format-table -GroupBy StartMode -Property Name,State,PathName -AutoSize 

Команда выведет нам таблицу, сгруппированную по типу загрузки с новыми ключевыми свойствами. Запустите ее самостоятельно и посмотрите на результат.

PS C:\> get-wmiobject win32_service -filter "startmode='auto' AND state<>'Running'" | Select Name,State Name State ---- ----- MMCSS Stopped RemoteRegistry Stopped sppsvc Stopped wuauserv Stopped 

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

PS C:\> get-wmiobject win32_service -filter "startmode='auto' AND state<>'Running'" -computername chi-dc01,chi-dc02,chi-dc03 | Select Name,State,Systemname Name State Systemname ---- ----- ---------- sppsvc Stopped CHI-DC01 sppsvc Stopped CHI-DC02 VMTools Stopped CHI-DC02 RemoteRegistry Stopped CHI-DC03 ShellHWDetection Stopped CHI-DC03 sppsvc Stopped CHI-DC03 wuauserv Stopped CHI-DC03 

Получаем учетную запись, под которой запущена служба

Также с помощью WMI вы можете получить учетную запись, под которой запущена служба. В WMI таковым является свойство Startname.

PS C:\> get-wmiobject win32_service -comp chi-ex01 | group startname Count Name Group ----- ---- ----- 95 localSystem {\\CHI-EX01\root\cimv2:Win32_Service.Name="AeLook... 36 NT AUTHORITY\LocalService {\\CHI-EX01\root\cimv2:Win32_Service.Name="ALG", ... 24 NT AUTHORITY\NetworkSe... {\\CHI-EX01\root\cimv2:Win32_Service.Name="aspnet... 

И конечно, вы можете осуществить фильтрацию по этому свойству.

image

Это очень удобно, если вы ищете службы, запущенные под определенной учетной записью, например, доменного администратора.

PS C:\> get-wmiobject win32_service -computer $computers -filter "startname like '%administrator%'"| Select Name,startmode,state,startname,systemname Name : BITS startmode : Manual state : Stopped startname : .\Administrator systemname : CHI-EX01 Name : PeerDistSvc startmode : Manual state : Stopped startname : Administrator@GLOBOMANTICS.local systemname : CHI-WIN8-01 

С помощью одной простой команды я нашел те службы, которые запущены под определенной учетной записью администратора.

Используем CIM

В PowerShell 3.0 вы можете использовать командлеты CIM, чтобы осуществлять те же самые запросы. Преимущества CIM связаны с удаленной работой с PowerShell.

PS C:\> get-ciminstance win32_service -comp chi-dc01 

image

Фильтры работают аналогичным образом.

PS C:\> get-ciminstance win32_service -filter "startmode='auto' AND state<>'Running'" -comp chi-ex01 | Select Name,State,Systemname Name State Systemname ---- ----- ---------- clr_optimization_v4.0.30319_32 Stopped CHI-EX01 clr_optimization_v4.0.30319_64 Stopped CHI-EX01 MSExchangeProtectedServiceHost Stopped CHI-EX01 MSExchangeRPC Stopped CHI-EX01 MSExchangeSA Stopped CHI-EX01 MSExchangeServiceHost Stopped CHI-EX01 ShellHWDetection Stopped CHI-EX01 sppsvc Stopped CHI-EX01 

Как можно видеть в выводе, имеются некоторые проблемы с Exchange. С ними и ими подобными мы будем разбираться в следующей статье.

Итог

Использование WMI или CIM – хороший способ получить отчеты о конфигурации служб в вашей среде. Класс Win32_Service содержит в себе много полезной информации. Плюс Вы можете запускать длительные запросы (long running queries) с параметром –Asjob или использовать альтернативные учетные данные. Вы всегда можете это сделать с помощью Get-Service, но это отнимает много времени. В следующей статье мы рассмотрим, как менять службы с помощью WMI и CIM.

ссылка на оригинал статьи http://habrahabr.ru/company/netwrix/blog/168011/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *