Продолжаем публиковать переводы статей, выходящих на портале 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
Я отформатировал вывод команды, чтобы его было легче читать. А теперь давайте взглянем на отдельную службу.
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 *
Вывод показан на скриншоте.
Теперь вы знаете свойства службы, и можете создавать уточняющие запросы, используя параметр–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...
И конечно, вы можете осуществить фильтрацию по этому свойству.
Это очень удобно, если вы ищете службы, запущенные под определенной учетной записью, например, доменного администратора.
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
Фильтры работают аналогичным образом.
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/
Добавить комментарий