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

в 8:37, , рубрики: powershell, Блог компании NetWrix, системное администрирование

Управляем службами 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-EX01rootcimv2:Win32_Service.Name="AeLook...
36 NT AUTHORITYLocalService {\CHI-EX01rootcimv2:Win32_Service.Name="ALG", ...
24 NT AUTHORITYNetworkSe... {\CHI-EX01rootcimv2: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.

Автор: AMarkin

Источник

Поделиться

* - обязательные к заполнению поля