ОглавлениеВведение ..........................................................................................................
ВведениеДжефри Хикс, гуру PowerShell, затеял как-то серию статей на сайте 4sysops.com, в которыхрассмотрел основные аспект...
Каждая строка представляет собой объект службы (serviceobject).Каждый сервисный объект, какправило, имеет свои свойства. В...
Результаты приведены на скриншоте ниже.Параметр Typenameсверху говорит о том, что за объект перед нами; в данном случае эт...
PS C:>get-service wuauserv | selectDisplayname,Status,Can*DisplayName : Windows UpdateStatus : StoppedCanPauseAndContinue ...
Вы можете получить полную справочную информацию, напечатав:PS C:> help get-service –fullИнформацию о службе можно получить...
------ ---- -----------Stopped WiaRpc Still Image Acquisition EventsRunning WinDefend Windows Defender ServiceRunning WinH...
Running spooler Print SpoolerЛюбая команда, которую я демонстрировал, можно использовать для передачи удаленномукомпьютеру...
Фильтрация служб осуществляется с помощью командлетаWhere-Object(where – сокращение длякомандлета). Все, что нам нужно от ...
Теперь давайте попробуем найти одну службу на нескольких машинах.Выводотформатируемвтаблицу.PS C:>get-service -computernam...
PS C:>get-service "win*" -comp chi-dc03 | where {$_.status -eqrunning}Status Name DisplayName------ ---- -----------Runnin...
Что касается меня, то я бы предпочел использовать хеш-таблицу.PS C:> $hash = get-service -computername chi-dc03 | Group-Ob...
PS C:> $hash.running.countОднако ничего не произойдет. Потому что свойство Status является просто перечислением(enumeratio...
Running NTDS Active Directory Domain ServicesПараметр –RequiredServices передаст объект в конвейер для каждой требуемой сл...
А пока Вы можете получить все зависимости для всех служб, следующая командаPS C:>get-service –DependentServicesЭто не даст...
Часть 2. Остановка, запуск и паузаВ этой части будут рассмотрены такие такие действия как:1 Остановка службы2 Запуск служб...
Взглянем на эти команды внимательнее.STOP-SERVICEЧтобы остановить службу, мы должны уточнить ее имя.PS C:>stop-service wua...
Если служба не запущена, то командлет ничего не выведет, равно как и не выдаст никакой ошибки.Поэтому иногда лучше передат...
В таком случае используем параметр –Force. В большинстве случаев это работает, но без ―защитыот дурака‖. Помните, чтокоман...
Причиной тому в большинстве случаев является выключенные службы. Как конфигурироватьнастройки службы, я расскажу в следующ...
Running spooler Print SpoolerТак как мы осуществляем остановку службы, нам может понадобиться параметр –Force.ПРИОСТАНОВКА...
DependentServices : {}MachineName : .ServiceName : bitsServicesDependedOn : {RpcSs, EventSystem}ServiceHandle : SafeServic...
УДАЛЕННЫЕ СЛУЖБЫКак вы могли обратить внимание, все примере выше мы демонстрировали на локальном машине. Иэто неслучайно. ...
Итак, мы выяснили, что у командлетаStop-Serviceотсутствует такой полезный параметр как –Computername. Мы можете использова...
К сожалению, у Set-Serviceотсутствует параметр –Force, поэтому придется вернуться киспользованию PowerShellremoting и Invo...
Commandиспользует PowerShellremoting, который мы может быть еще не настроили или невключили.УСТАНАВЛИВАЕМ ТИП АВТОЗАПУСКА ...
Помните, что изменение типа автозагрузки не повлияет на текущий статус службы.PS C:>set-serviceremoteregistry -StartupType...
Мы можем использоватьGet-WmiObject для извлечения экземпляра объекта службы. Япродемонстрирую в PS 3.0 на Windows 8, но та...
StartMode : AutoState : RunningStatus : OKЧтобы получить другие свойства, используем следующую команду.PS C:>get-wmiobject...
Получаем тип автозагрузкиСвойство StartMode показывает, стартует ли служба автоматически или должна запускатьсявручную. Ко...
Также с помощью WMI вы можете получить учетную запись, под которой запущена служба. В WMIтаковымявляетсясвойствоStartname....
PS C:>get-wmiobject win32_service -computer $computers -filter "startname like%administrator%"| SelectName,startmode,state...
Фильтрыработаютаналогичнымобразом.PS C:>get-ciminstance win32_service -filter "startmode=auto AND state<>Running" -comp ch...
ИтогИспользование WMI или CIM – хороший способ получить отчеты о конфигурации служб в вашейсреде. Класс Win32_Service соде...
Мы можем также получить ссылку на определенный объект службы и затем непосредственновызвать метод (directlyinvoke a method...
__DERIVATION : {}__SERVER :__NAMESPACE :__PATH :ReturnValue : 0В предыдущей частия искал те службы, для которых был задан ...
PS C:>get-wmiobject win32_service -filter "name=spooler" | Invoke-WmiMethod -NameChangeStartMode -ArgumentList"Manual" | S...
PS C:>Get-WmiObject win32_service -filter "Name=Spooler" | Invoke-WmiMethod-Name Change -ArgumentList @($null,$null,$null,...
PathName :ServiceDependencies :ServiceType :StartMode :StartName :StartPassword :PSComputerName :В этом списке ErrorContro...
Остановка и запуск служб с помощью CIM командлетовОдним из важных отличий CIM-объекта от ―чистого‖ WMI является то, что ре...
Чтобы внести изменения, запустим команду, но уже без –WhatIf.PS C:>get-ciminstance win32_service -filter "startmode=auto a...
Давайте поработаем с тем, что я делал в предыдущей статье, используя Invoke-WmiMethod. Сейчася работаю в PowerShell 3.0, т...
Можно добавить и другие кастомные свойства, например дату и время. Чтобы вывести толькоошибки, слегка изменим правила сорт...
PS C:>get-ciminstance win32_service -filter "name=rasman" -comp $computers |Invoke-CimMethod -methodnameChangeStartmode -A...
управления службами с помощью WMI, можно сделать и с помощью CIM командлетов, зачастуютребуется меньших усилий для этого.Я...
__GENUS : 2__CLASS : __PARAMETERS__SUPERCLASS :__DYNASTY : __PARAMETERS__RELPATH :__PROPERTY_COUNT : 11__DERIVATION : {}__...
ReturnValue : 0PSComputerName :0 в качестве возвращенного значения означает успешность нашего действия. Но помните, чтоизм...
Как вы видите, я сбросил пароль для службы MyCustomService запущенной на всех компьютерах,перечисленных в переменной $comp...
Руководство по управлению службами WIindows с помощью PowerShell
Руководство по управлению службами WIindows с помощью PowerShell
Upcoming SlideShare
Loading in …5
×

Руководство по управлению службами WIindows с помощью PowerShell

1,955 views

Published on

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
1,955
On SlideShare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
19
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Руководство по управлению службами WIindows с помощью PowerShell

  1. 1. ОглавлениеВведение .................................................................................................................................. 3Часть 1. Получаем статус служб ............................................................................................. 3Часть 2. Остановка, запуск и пауза........................................................................................17Часть 3. Конфигурируем службы с помощью WMI и CIM......................................................28Часть 4. Изменение служб с помощью WMI ..........................................................................35Часть 5. CIM-командлеты .......................................................................................................40Часть 6. Служебные учетные записи .....................................................................................46
  2. 2. ВведениеДжефри Хикс, гуру PowerShell, затеял как-то серию статей на сайте 4sysops.com, в которыхрассмотрел основные аспекты управления службами Windowsс помощью PowerShell. В послевниманияавтора оказалось не только использование командлетовPowerShell 2.0, но иновыхкомандлетов из PowerShell 3.0, которые значительно упрощают работу с WindowsServer2012.Я готовил перевод этих статей и выкладывал в блог на Хабрахабре. Здесь же я решилобъединить все материалы в один документ, который можно скачать и фактически использовать каккнижку. Приятного и полезного чтения.Часть 1. Получаем статус службВ первой части мы рассмотрим следующие вопросы управления службами Windows:● Получаем статус службы на локальном компьютере● Получаем статус службы на удаленном компьютере● Осуществляем фильтрацию служб (например, остановленные службы)● Зависимые службыОбозначим начальные условия: Вы работаете под Windows 7 и выше и у Вас имеются праваадминистратора. Все команды рекомендуются выполнять в лабораторной или виртуальной среде,перед тем, как применять в ―полевых условиях‖.ПОЛУЧАЕМ СТАТУС СЛУЖБЫДавайте начнем с того, что просто получим статус всех служб, запущенных на локальномкомпьютере. Используем для этого командлетGet-Service.PS C:>get-servicePowerShell, как правило, не чувствителен к регистру. Вывод приведен на скриншоте ниже.
  3. 3. Каждая строка представляет собой объект службы (serviceobject).Каждый сервисный объект, какправило, имеет свои свойства. Вы можете открыть их, просто передав эти объекты в другуюкоманду, Get-Member.PS C:>get-service | get-member
  4. 4. Результаты приведены на скриншоте ниже.Параметр Typenameсверху говорит о том, что за объект перед нами; в данном случае этоSystem.ServiceProcess.ServiceController. На скриншоте также обведены свойства объекта. Этоатрибуты, которые описывают этот тип объекта. Хотя большинство из них не используются приотображении по умолчанию, вы можете использовать их, если вы их знаете.Например, нам интересно посмотреть информацию только о WindowsUpdate. Через Get-Serviceполучим информацию только о некоторых ее свойствах.
  5. 5. PS C:>get-service wuauserv | selectDisplayname,Status,Can*DisplayName : Windows UpdateStatus : StoppedCanPauseAndContinue : FalseCanShutdown : FalseCanStop : FalseКак я узнал, что могу напечатать имя службы? Посмотрел с помощью Get-Service.PS C:>helpget-service
  6. 6. Вы можете получить полную справочную информацию, напечатав:PS C:> help get-service –fullИнформацию о службе можно получить по ее имени или даже начальным буквам имени.PS C:>get-service wi*Status Name DisplayName
  7. 7. ------ ---- -----------Stopped WiaRpc Still Image Acquisition EventsRunning WinDefend Windows Defender ServiceRunning WinHttpAutoProx... WinHTTP Web Proxy Auto-Discovery Se...Running Winmgmt Windows Management InstrumentationRunning WinRM Windows Remote Management (WS-Manag...Или если вам удобнее работать с отображаемыми именами, используйте параметр –Displayname.PS C:>get-service -DisplayName"windows a*"Status Name DisplayName------ ---- -----------Stopped AllUserInstallA... Windows All-User Install AgentRunning AudioEndpointBu... Windows Audio Endpoint BuilderRunning Audiosrv Windows AudioЯдолжениспользоватьимяпараметра, чтобы PowerShellвоспринималзначениявкачествеотображаемогоимени, анефактическогоименислужбы.Команда будетвыглядеть так:PS C:>get-service"windows a*"Параметр –Name можно не печатать.ПОЛУЧАЕМ СТАТУС СЛУЖБЫ НА УДАЛЕННЫХ КОМПЬЮТЕРАХДо этого нас интересовало получение информации о статусе служб на локальном компьютере.Однако управление службами осуществляется на удаленных компьютерах. Если посмотреть справкупо Get-Service, то можно увидеть наличие у этого командлета параметра –Computername. Вданном случае подключение к удаленным компьютерам осуществляется без включения функцииудаленного управления PowerShell. Если вы можете управлять службами, используя инструментыкомандной строки (sc.exe или консоль управления ServiceManager), вы можете использоватьPowerShell. Давайтевзглянемнапример:PS C:>get-service spooler -ComputerName novo8Status Name DisplayName------ ---- -----------
  8. 8. Running spooler Print SpoolerЛюбая команда, которую я демонстрировал, можно использовать для передачи удаленномукомпьютеру. Даже нескольким компьютерам, если у вас есть соответствующие права на удаленномкомпьютере. Если вы используете PowerShell v3, то можно легко выбрать одну службу на множествекомпьютеров.PS C:>get-service wuauserv -ComputerName chi-dc01,chi-dc02,chi-dc03Status Name DisplayName------ ---- -----------Running wuauserv Windows UpdateStopped wuauserv Windows UpdateRunning wuauserv Windows UpdateДля наглядности представления отформатируем вывод.PS C:>get-service wuauserv -ComputerName chi-dc01,chi-dc02,chi-dc03 | format-tableName,Status,Machinename -autosizeName Status MachineName---- ------ -----------wuauserv Running chi-dc03wuauserv Stopped chi-dc02wuauserv Running chi-dc01Тотжесамыйрезультат, нов PowerShell v2.PS C:>chi-dc01,chi-dc02,chi-dc03| foreach {get-service wuauserv -computername $_} | Format-Table Name,Status,Machinename -AutoSizeName Status MachineName---- ------ -----------wuauserv Running chi-dc01wuauserv Stopped chi-dc02wuauserv Running chi-dc03ОСУЩЕСТВЛЯЕМ ФИЛЬТРАЦИЮ (ИСПОЛЬЗУЯ WHERE-OBJECT)
  9. 9. Фильтрация служб осуществляется с помощью командлетаWhere-Object(where – сокращение длякомандлета). Все, что нам нужно от PowerShell в этом случае, так это получить только те службы, укоторых статус равен ―stopped‖.PS C:>get-service | where {$_.status -eqstopped}PowerShell получает информацию обо всех службах и передает их (с помощью ―|‖) в следующуюкоманду, которая осуществляет просмотр каждого объекта. Если свойство статуса объекта равно―stopped‖, она остается в конвейере (pipeline), в противном случае она из него исключается. Вконце выражение PowerShell отображает те объекты, которые остались в конвейере.Результаты приведены ниже.
  10. 10. Теперь давайте попробуем найти одну службу на нескольких машинах.Выводотформатируемвтаблицу.PS C:>get-service -computername @(chi-dc01,chi-dc02,chi-dc03) | where {$_.name -eqwuauserv} | format-table Name,Status,Machinename -autosizeName Status MachineName---- ------ -----------wuauserv Running chi-dc02wuauserv Running chi-dc01wuauserv Running chi-dc03Мы даже можем комбинировать запрос отдельных служб с их фильтрацией.
  11. 11. PS C:>get-service "win*" -comp chi-dc03 | where {$_.status -eqrunning}Status Name DisplayName------ ---- -----------Running Winmgmt Windows Management InstrumentationRunning WinRM Windows Remote Management (WS-Manag...Эта команда находит все службы на компьютере CHI-DC03, которые начинаются с ‗WIN‘, ноотображает только те, которые запущены.Также можно сгруппировать объекты по свойству статуса (statusproperty).PS C:> $dc03 = get-service -computername chi-dc03 | Group-Object -Property StatusПеременная $dc03 является объектом GroupInfo.PS C:> $dc03Count Name Group----- ---- -----64 Running {System.ServiceProcess.ServiceController, Sy...79 Stopped {System.ServiceProcess.ServiceController, Sy...Свойство Groupпредставляет собой коллекцию связанных служб.PS C:> $dc03.Get(0).groupНаписанное выше проще понять, если взглянуть на скриншот.
  12. 12. Что касается меня, то я бы предпочел использовать хеш-таблицу.PS C:> $hash = get-service -computername chi-dc03 | Group-Object -Property Status -AsHashTablePS C:> $hashName Value---- -----Running {System.ServiceProcess.ServiceController, Sys...Stopped {System.ServiceProcess.ServiceController, Sys...Теперькаждоеимяпредставляетсобойсвойствовхеш-таблице. Если у вас имеется опыт работы сPoweShell, вы, возможно, подумываете сделать сделующее:
  13. 13. PS C:> $hash.running.countОднако ничего не произойдет. Потому что свойство Status является просто перечислением(enumeration) для [System.ServiceProcess.ServiceControllerStatus] .NET клас и такие свойства, какRunning и Stopped представляют собой целые числа. PowerShell осуществляет конвертацию, чтобыпредставить в более наглядной форме.PS C:> $hash = get-service -computername chi-dc03 | Group-Object -PropertyStatus –AsHashTable –AsStringВ чем суть параметра –AsString, на мой взгляд, достаточно очевидно. Теперьработатьсхеш-таблицейсталопроще.PS C:> $hash.running.count62PS C:> $hash.running[0..3]Status Name DisplayName------ ---- -----------Running ADWS Active Directory Web ServicesRunning AppHostSvc Application Host Helper ServiceRunning BFE Base Filtering EngineRunning BrokerInfrastru... BackgroundTasksInfrastructureSer...Следующей задачей на повестке дня является проверка зависимостей сервера (serverdependencies).Требуемые службыPowerShell позволяет просто получить статус всех служб, которые требуется для данной службы,даже на удаленном компьютере.PS C:>get-service dns -ComputerName chi-dc03 –RequiredServicesStatus Name DisplayName------ ---- -----------Running Afd Ancillary Function Driver for WinsockRunning Tcpip TCP/IP Protocol DriverRunning RpcSs Remote Procedure Call (RPC)
  14. 14. Running NTDS Active Directory Domain ServicesПараметр –RequiredServices передаст объект в конвейер для каждой требуемой службы. Выможете даже пойти дальше и проверить требуемые службы для работы данной службы.PS C:>get-service dns -ComputerName chi-dc03 -RequiredServices | selectname,@{name="computername";expression={$_.machinename}} | get-service -RequiredServicesStatus Name DisplayName------ ---- -----------Running RpcEptMapper RPC Endpoint MapperRunning DcomLaunch DCOM Server Process LauncherПараметр –ComputernameкомандлетаGet-Service возьмет вывод, но только для тех объектов, укоторых есть объект свойство Computername – именно поэтому я использую хеш-таблицу с Select-Object. Как мы видим проблем со службой DNS на компьютере CHI-DC03 нет.ЗАВИСИМЫЕ СЛУЖБЫМы можем сделать то же самое с зависимыми службами. Если таковых не имеется, в конвейерничего передано не будет.PS C:>get-service dns -ComputerName chi-dc03 -DependentServicesPS C:>get-service lanmanworkstation -ComputerName chi-dc03 -DependentServicesStatus Name DisplayName------ ---- -----------Stopped SessionEnv Remote Desktop ConfigurationRunning NetlogonNetlogonRunning Dfs DFS NamespaceRunning Browser Computer BrowserТребуемые и зависимые службы также являются частью каждого объекта службы.PS C:>get-service rpcss | Select *servicesRequiredServicesDependentServices---------------- -----------------{RpcEptMapper, DcomLaunch} {WwanSvc, wuauserv, WSearch, wscsvc...}
  15. 15. А пока Вы можете получить все зависимости для всех служб, следующая командаPS C:>get-service –DependentServicesЭто не даст вам особо полезную информацию, поэтому я рекомендую осуществлять запрос поконкретным службам. Командаработаетгораздолучше PowerShell v3.PS C:>get-service dns -comp chi-dc01,chi-dc03 -RequiredServices | Sort Machinename,Name | Format-table -GroupBymachinenameРезультаты видны на скриншоте ниже.Чтобы получить подобные результаты в PowerShell v2, вам придется передать имена компьютеров(computernames) в Get-Service.PS C:>"chi-dc01","chi-dc03" | foreach { get-service dns -comp $_ -RequiredServices} | SortMachinename,Name | format-table -GroupBymachinename
  16. 16. Часть 2. Остановка, запуск и паузаВ этой части будут рассмотрены такие такие действия как:1 Остановка службы2 Запуск службы3 Перезапуск службы4 Приостановка и возобновление работы5 Управление удаленными службами6 Настраиваем автозагрузку службыМы уделим большее внимание разбору команд в PowerShell для осуществления вышеперечисленного на локальном компьютере. В разделе ―управление службами удаленныхкомпьютерах‖ мы рассмотрим, ограничения работы в PowerShell v2 и v3.PS C:>get-service bitsStatus Name DisplayName------ ---- -----------Running bits Background Intelligent Transfer Ser...Так как команда для получения статуса службы называется Get-Service, догадаться о том, какпишутся другие команды не составит труда. На худой конец мы можем спросить у PowerShell обовсех командах, так или иначе относящихся к работе со службами. Обратите внимание, что мыиспользовали параметр –nounдля получения всех команд, связанных со службами.
  17. 17. Взглянем на эти команды внимательнее.STOP-SERVICEЧтобы остановить службу, мы должны уточнить ее имя.PS C:>stop-service wuauservОднако в конвейер ничего не будет передано. Некоторые командлеты, такие как Stop-Service,созданы таким образом, что по умолчанию они не записывают объект в конвейер.Мыжезаставимэтосделать, использовавпараметр–Passthru.PS C:>stop-service bits -PassThruStatus Name DisplayName------ ---- -----------Stopped bits Background Intelligent Transfer Ser...
  18. 18. Если служба не запущена, то командлет ничего не выведет, равно как и не выдаст никакой ошибки.Поэтому иногда лучше передать объект в Stop-Service(естественно использовав при этом параметр–whatif).PS C:>get-service browser | stop-service -WhatIfWhat if: Performing operation ―Stop-Service‖ on Target ―Computer Browser (browser)‖.Параметр –WhatIfбыл добавлен для того, чтобы мы посмотрели, что будет, если командлет будетзапущен. Когда я удостоверюсь, что это именно та служба, которая меня интересует, я простоудалю -Whatifи остановлю службу.PS C:>get-service browser | stop-serviceКак я уже упомянул выше, если служба уже остановлена, то командлет ничего не сделает. Ииспользование Stop-Serviceв этом случае никому не навредит. Однако я все же предпочитаютболее цивилизованный подход, а именно:PS C:>get-service bits | where {$_.status -eqrunning} | stop-service -passStatus Name DisplayName------ ---- -----------Stopped bits Background Intelligent Transfer Ser...Если служба запущена, то объект передается в конвейер и отправляется в Stop-Service.Нижеприведенвариантсостановкойнесколькихслужб.PS C:>get-service bits,wsearch,winrm,spooler | where {$_.status -eqrunning} | stop-service -whatifWhat if: Performing operation "Stop-Service"on Target "Print Spooler (spooler)".What if: Performing operation "Stop-Service"on Target "Windows Remote Management (WS-Management)(winrm)".What if: Performing operation "Stop-Service"on Target "Windows Search (wsearch)".Некоторые службы не захотят останавливаться – в силу наличия зависимых служб – что мы и видимна скриншоте ниже.
  19. 19. В таком случае используем параметр –Force. В большинстве случаев это работает, но без ―защитыот дурака‖. Помните, чтокомандатакжеостановитзависимыеслужбы.PS C:>stop-service lanmanserver -force –PassThruStatus Name DisplayName------ ---- -----------Stopped Browser Computer BrowserStopped lanmanserver ServerSTART-SERVICEЗапуск службы осуществляется аналогичным образом. Он поддерживает параметр –Whatif, и вампридется использовать –Passthru, чтобы увидеть объекты.PS C:> start-service wuauserv -PassThruStatus Name DisplayName------ ---- -----------Running wuauserv Windows UpdateИ снова: если служба уже запущена, командлет ничего не сделает. Однако вы можете попытатьсязапустить службу и получите такую ошибку.
  20. 20. Причиной тому в большинстве случаев является выключенные службы. Как конфигурироватьнастройки службы, я расскажу в следующей статье.Если вы хотите запустить службы и все службы, зависимые от нее, используйте следующеевыражение:PS C:> get-service lanmanserver | Foreach { start-service $_.name -passthru; start-service$_.DependentServices -passthru}Status Name DisplayName------ ---- -----------Running lanmanserver ServerRunning Browser Computer BrowserМы должны явно получить зависимые службы, потому что Start-Serviceне запустит автоматическиих.RESTART-SERVICEВы удивитесь, но перезапуск службы работает также как два предыдущих примера. Используйте–Passthru, еслихотитеубедиться, чтослужбазапущена.PS C:> restart-service spooler -PassThruStatus Name DisplayName------ ---- -----------
  21. 21. Running spooler Print SpoolerТак как мы осуществляем остановку службы, нам может понадобиться параметр –Force.ПРИОСТАНОВКА И ВОЗОБНОВЛЕНИЕ РАБОТЫРабота некоторых служб может быть приостановлена на некоторое время, а затем возобновлена, имы можем это сделать через PowerShell. Однако если служба не удовлетворяет требованиям, мыполучим такие ошибки. (на примере показано, что мы пытались приостановить службу bits)В чем же проблема? Смотрим на объект (используя Get-Service).PS C:>get-service bits | select *Name : bitsRequiredServices : {RpcSs, EventSystem}CanPauseAndContinue : FalseCanShutdown : FalseCanStop : TrueDisplayName : Background Intelligent Transfer Service
  22. 22. DependentServices : {}MachineName : .ServiceName : bitsServicesDependedOn : {RpcSs, EventSystem}ServiceHandle : SafeServiceHandleStatus : RunningServiceType : Win32ShareProcessSite :Container :Если значение свойства CanPauseAndContinue равно True, значит мы можем приостанавливать ивозобновлять работу службы. Найдемтакиеслужбы:PS C:>get-service | where {$_.CanPauseandContinue}Status Name DisplayName------ ---- -----------Running LanmanServer ServerRunning LanmanWorkstation WorkstationRunning MSSQLSERVER SQL Server (MSSQLSERVER)Running O2FLASH O2FLASHRunning stisvc Windows Image Acquisition (WIA)Running Winmgmt Windows Management InstrumentationКакмывидим, нетакмногослужбудовлетворяютэтомутребованию.PS C:> suspend-service o2flash -PassThruStatus Name DisplayName------ ---- -----------Paused O2FLASH o2flashГотовы возобновить работу службы? Используйте следующее выражение:PS C:>resume-service o2flash -PassThruStatus Name DisplayName------ ---- -----------Running O2FLASH o2flashОба командлета также поддерживают –Whatif.
  23. 23. УДАЛЕННЫЕ СЛУЖБЫКак вы могли обратить внимание, все примере выше мы демонстрировали на локальном машине. Иэто неслучайно. К сожалению даже в PowerShell v3, ни у одного из этих командлетов нетпараметра, который позволял бы управлять службой на удаленном компьютере. Get-Service,конечно, поддерживает параметр –Computername, но не более. Службу лицезреть вы сможете, ачто-либо с ней сделать не получится. Нет, можно, конечно, если удаленный компьютер работает сPS v2 и включен PowerShellRemoting. Тогда мы можете использовать все выше приведенныекоманды, используя Invoke-Commandдля удаленного компьютера или PSSession. С другойстороны, проще управлять одной службой на нескольких серверах.PS C:> Invoke-Command {restart-service dns –passthru} –comp chi-dc03,chi-dc02,chi-dc01Управление службами на удаленных компьютерах не ограничивается вышеперечисленным, но этоуже будет предмет рассмотрения последующих статей.Все эти командлеты могут быть использованы в конвейерном выражении и зачастую это лучшийвариант. ИспользованиеGet-Serviceдля получения объектов и последующая передача их вподходящийкомандлет.УСТАНАВЛИВАЕМ УДАЛЕННЫЙ СТАТУС
  24. 24. Итак, мы выяснили, что у командлетаStop-Serviceотсутствует такой полезный параметр как –Computername. Мы можете использовать эти команды в удаленной сессии, обратившись ккомандлетуInvoke-Command, что уже само по себе продуктивно, если вы работаете со службой нанескольких компьютерах. Одно можно запускать, останавливать, перезапускать, ставить на паузу изапускать заново, используя Set-Service.PS C:>set-service wuauserv -ComputerName chi-dc03 -Status stopped -WhatIfWhat if: Performing operation "Set-Service"on Target "Windows Update (wuauserv)".Эта команда поддерживает параметр –WhatIf. Вы также должны использовать –Passthruдляпередачи объектов в конвейер.PS C:>set-service bits -ComputerName chi-dc03 -Status running -PassThruStatus Name DisplayName------ ---- -----------Running bits Background Intelligent Transfer Ser...Валидными значениям для параметра –Status являются ―запущена‖ (running), ―остановлена‖(stopped) и ―на паузе‖ (paused). Помните, что у службы есть зависимые службы, мы не сможетеизменять ее, что и продемонстрировано на скриншоте ниже.
  25. 25. К сожалению, у Set-Serviceотсутствует параметр –Force, поэтому придется вернуться киспользованию PowerShellremoting и Invoke-Command. Если вы хотите перезапустить удаленнуюслужбу, используйте следующую команду:PS C:>set-service w32time -ComputerName chi-dc03 -Status Stopped -PassThru | set-service -PassThru -Status RunningStatus Name DisplayName------ ---- -----------Running w32time Windows TimeНе забудьте использовать –Passthru, в противном случае вторая команда Set-Serviceничего неосуществит.Что по мне, так я предпочитаю работать сразу с несколькими службами, которые я не могуудаленно остановить, используя Set-Service, хотя их запуск проблем составляет. Я используюInvoke-Command. Но помните, что используя параметр –ComputernamePowerShell осуществляетподключение, используя RPC и DCOM, что может привести к проблемам с файрволом. Invoke-
  26. 26. Commandиспользует PowerShellremoting, который мы может быть еще не настроили или невключили.УСТАНАВЛИВАЕМ ТИП АВТОЗАПУСКА СЛУЖБЫSet-Serviceполезнен, когда вы хотите включить или отключить службу, используя параметр –StartupType. Если Вы настроили службу, используя значения Automatic, ManualorDisabled.Ксожалению, несуществуетвариантадля Automatic (Delayed).PS C:>set-service remoteregistry -StartupType Manual -WhatIfWhat if: Performing operation "Set-Service"on Target "Remote Registry (remoteregistry)".PS C:>set-service remoteregistry -StartupType Manual -PassThruStatus Name DisplayName------ ---- -----------Stopped remoteregistry Remote RegistryОднако, просто взглянув на объект, мы не сможем сказать, к какому типу автозагрузки онотносится.PS C:>get-service remoteregistry | select *Name : remoteregistryRequiredServices : {RPCSS}CanPauseAndContinue : FalseCanShutdown : FalseCanStop : FalseDisplayName : Remote RegistryDependentServices : {}MachineName : .ServiceName :remoteregistryServicesDependedOn : {RPCSS}ServiceHandle : SafeServiceHandleStatus : StoppedServiceType : Win32ShareProcessSite :Container :Как это сделать – одна из тем следующей статьи.
  27. 27. Помните, что изменение типа автозагрузки не повлияет на текущий статус службы.PS C:>set-serviceremoteregistry -StartupTypeDisabled -PassThruStatusNameDisplayName------ ---- -----------RunningremoteregistryRemoteRegistryТак что если вы хотите выключить и остановить (или включить и запустить) службу, передайтеобъект в подходящий командлет.PS C:>set-serviceremoteregistry -StartupTypeDisabled -PassThru | Stop-Service -PassThruStatusNameDisplayName------ ---- -----------StoppedremoteregistryRemoteRegistryТехнически, Set-Serviceпозволяет вам изменить отображаемое имя службы и описание, но личномне никогда не приходилось использовать в своей работе. Я использую Set-Serviceдля включенияи выключения служб. Если необходимо управлять службами удаленно, то я использую Invoke-Command.Все, что я продемонстрировал в предыдущих частях, было связано с использованиемспецифических типов объектов службы, которые, как вы могли заметить, имеют некоторыеограничения. В следующей части мы рассмотрим другие возможности по управлению службами,которые призваны обойти эти ограничения.Часть 3. Конфигурируем службы с помощью WMI и CIMВ этой части будет рассказано, как использовать WMI и CIM для целей конфигурирования служб наудаленных компьютерах.В предудущей части я показал пару примеров использования Set-Service для конфигурированияслужб. Однако здесь имеются некоторые ограничения, особенно когда мы работаем со службами наудаленных машинах. Частично это обусловлено тем, что такие командлеты как Get-Service и Set-Service предназначены для работы с объектом службы, который выражен через .NET Framework —System.ServiceProcess.ServiceController. С позиций администратора в таком определении объектаотсутствует ряд полезной информации, например, под какой учетной записью запущена служба. Ксчастью, здесь нам на помощь приходит WindowsManagementInstrumentation (WMI).Используем WMI
  28. 28. Мы можем использовать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 : 0Name : BITSProcessId : 876
  29. 29. StartMode : AutoState : RunningStatus : OKЧтобы получить другие свойства, используем следующую команду.PS C:>get-wmiobject win32_service -filter "name=bits" | Select *Вывод показан на скриншоте.Теперь вы знаете свойства службы, и можете создавать уточняющие запросы, используя параметр–Filter.
  30. 30. Получаем тип автозагрузкиСвойство StartMode показывает, стартует ли служба автоматически или должна запускатьсявручную. Когдавыэтоузнаете, томожетеиспользоватьследующиекоманды:PS C:>get-wmiobject win32_service -filter "StartMode<>disabled" | sort StartMode | format-table-GroupByStartMode -PropertyName,State,PathName -AutoSizeКоманда выведет нам таблицу, сгруппированную по типу загрузки с новыми ключевымисвойствами. Запуститееесамостоятельноипосмотритенарезультат.PS C:>get-wmiobject win32_service -filter "startmode=auto AND state<>Running" |SelectName,StateName State---- -----MMCSS StoppedRemoteRegistry Stoppedsppsvc Stoppedwuauserv StoppedЯ запрашиваю информацию о локальных службах, но то же самое можно сделать и на удаленныхмашинахPS C:>get-wmiobject win32_service -filter "startmode=auto AND state<>Running" -computernamechi-dc01,chi-dc02,chi-dc03 | SelectName,State,SystemnameName State Systemname---- ----- ----------sppsvc Stopped CHI-DC01sppsvc Stopped CHI-DC02VMTools Stopped CHI-DC02RemoteRegistry Stopped CHI-DC03ShellHWDetection Stopped CHI-DC03sppsvc Stopped CHI-DC03wuauserv Stopped CHI-DC03Получаем учетную запись, под которой запущена служба
  31. 31. Также с помощью WMI вы можете получить учетную запись, под которой запущена служба. В WMIтаковымявляетсясвойствоStartname.PS C:> get-wmiobject win32_service -comp chi-ex01 | group startnameCount 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...И конечно, вы можете осуществить фильтрацию по этому свойству.Это очень удобно, если вы ищете службы, запущенные под определенной учетной записью,например, доменного администратора.
  32. 32. PS C:>get-wmiobject win32_service -computer $computers -filter "startname like%administrator%"| SelectName,startmode,state,startname,systemnameName : BITSstartmode : Manualstate : Stoppedstartname : .Administratorsystemname : CHI-EX01Name : PeerDistSvcstartmode : Manualstate : Stoppedstartname : Administrator@GLOBOMANTICS.localsystemname : CHI-WIN8-01С помощью одной простой команды я нашел те службы, которые запущены под определеннойучетной записью администратора.Используем CIMВ PowerShell 3.0 вы можете использовать командлеты CIM, чтобы осуществлять те же самыезапросы. Преимущества CIM связаны с удаленной работой с PowerShell.PS C:>get-ciminstance win32_service -comp chi-dc01
  33. 33. Фильтрыработаютаналогичнымобразом.PS C:>get-ciminstance win32_service -filter "startmode=auto AND state<>Running" -comp chi-ex01 | SelectName,State,SystemnameName State Systemname---- ----- ----------clr_optimization_v4.0.30319_32 Stopped CHI-EX01clr_optimization_v4.0.30319_64 Stopped CHI-EX01MSExchangeProtectedServiceHost Stopped CHI-EX01MSExchangeRPC Stopped CHI-EX01MSExchangeSA Stopped CHI-EX01MSExchangeServiceHost Stopped CHI-EX01ShellHWDetection Stopped CHI-EX01sppsvc Stopped CHI-EX01Как можно видеть в выводе, имеются некоторые проблемы с Exchange. С ними и ими подобными мыбудем разбираться в следующей части.
  34. 34. ИтогИспользование WMI или CIM – хороший способ получить отчеты о конфигурации служб в вашейсреде. Класс Win32_Service содержит в себе много полезной информации. Плюс Вы можетезапускать длительные запросы (longrunningqueries) с параметром –Asjob или использоватьальтернативные учетные данные. Вы всегда можете это сделать с помощью Get-Service, но этоотнимает много времени. В следующей статье мы рассмотрим, как менять службы с помощью WMI иCIM.Часть 4. Изменение служб с помощью WMIЗапуск и остановкаКак известно, командлеты для управления, которые были бы ориентированы на использованиеWMI, отсутствуют, так что мы должны использовать методы объекта службы.PS C:>get-wmiobject win32_service -filter "name=lanmanserver" | get-member -MemberType Method |Select nameName—-ChangeChangeStartModeDeleteGetSecurityDescriptorInterrogateServicePauseServiceResumeServiceSetSecurityDescriptorStartServiceStopServiceUserControlService
  35. 35. Мы можем также получить ссылку на определенный объект службы и затем непосредственновызвать метод (directlyinvoke a method).PS C:> $service = get-wmiobject win32_service -filter "name=spooler"PS C:> $service.stateRunningPS C:> $service.StopService()__GENUS : 2__CLASS : __PARAMETERS__SUPERCLASS :__DYNASTY : __PARAMETERS__RELPATH :__PROPERTY_COUNT : 1__DERIVATION : {}__SERVER :__NAMESPACE :__PATH :ReturnValue : 0Я прямо вызываю метод StopService() для объекта службы Spooler. Возвращенное значение (―0‖)означает успех. Любое другое значение означает ошибку, посмотрите документацию на MSDN,посвященную классу Win32_Service.Недостатком этого метода является то, что у него отсутствует параметр –Whatif. Поэтому ярекомендую использовать командлетInvoke-WmiMethod. Мы получаем WMI объект и передаем егов Invoke-WmiMethod.PS C:> get-wmiobject win32_service -filter "name=spooler" | Invoke-WmiMethod-Name StartService -WhatIfWhat if: Performing operation "Invoke-WmiMethod" on Target "Win32_Service(StartService)".PS C:> get-wmiobject win32_service -filter "name=spooler" | Invoke-WmiMethod-Name StartService__GENUS : 2__CLASS : __PARAMETERS__SUPERCLASS :__DYNASTY : __PARAMETERS__RELPATH :__PROPERTY_COUNT : 1
  36. 36. __DERIVATION : {}__SERVER :__NAMESPACE :__PATH :ReturnValue : 0В предыдущей частия искал те службы, для которых был задан автозапуск, но которые по какой-топричине не были запущены. Теперь я могу слегка изменить это выражение и произвести запускслужбы.PS C:>get-wmiobject win32_service -filter"startmode=auto AND state<>Running" -comp chi-dc03 |invoke-wmimethod -NameStartServiceНедостатком этого является то, что объект результата только показывает возвращенное значение.Если здесь отсутствуют множественные службы, я не могу узнать, какой результат у определеннойслужбы. Чтобырешитьэтупроблему, используемвоттакойвариант:PS C:>get-wmiobject win32_service -filter "startmode=auto AND state<>Running"-comp chi-dc01,chi-dc02,chi-dc03 | foreach { $svc = $_ ; $_ | Invoke-WmiMethod -NameStartService | Select @{Name="Name";Expression={$svc.name}},@{Name="DisplayName";Expression={$svc.Displayname}},ReturnValue,@{Name="Computername";Expression={$svc.Systemname}}}Name DisplayNameReturnValueComputername---- ----------- ----------- ------------sppsvc Software Protection 0 CHI-DC01sppsvc Software Protection 0 CHI-DC02VMTools VMware Tools Service 7 CHI-DC02ShellHWDetection Shell Hardware Detection 0 CHI-DC03К блокеForEachя сохранил входной объект как переменную ($svc), так что я могу сноваиспользовать ее в качестве части хеш-таблицы, определяющей кастомные свойства. Как вы можетевидеть имеется одна ошибка для той службы, которую, как я думал, я удалил.Меняем режим запускаВы также можете менять режим запуска службы. Опциитаковы: Automatic, Disabled илиManual.Спомощью WMI невозможно установить значения запуска службы Automatic (Delayed).
  37. 37. PS C:>get-wmiobject win32_service -filter "name=spooler" | Invoke-WmiMethod -NameChangeStartMode -ArgumentList"Manual" | SelectReturnValueReturnValue-----------0Параметр ArgumentListпоказывает какое значение следует использовать. Запуск командыосуществляется с правами администратора.Устанавливаем свойства службыУ объекта службы не так много свойств, которые вы можете менять. Некоторые WMI объекты могутбыть изменены с помощью Set-WmiInstance. Но в случае с объектами служб, для объекта вамнеобходимо использовать метод Change(). Единственная проблема заключается в том, что у этогометода много параметров.Change(stringDisplayName,stringPathName,uint32ServiceType,uint32ErrorControl,stringStartMode,booleanDesktopInteract,stringStartName,stringStartPassword,stringLoadOrderGroup,stringLoadOrderGroupDependencies,stringServiceDependencies)Вы должны включить эти параметры в метод до того, который вы хотите использовать последним.Используйте значение$Nullдля тех параметров, которые вы хотите пропустить. Например: скажем,я хочу изменить свойство ErrorControlслужбы Spooler с Normal на Ignore. Исследовав свойствокласса, я обнаруживаю, что Normalсоответствует значение 1, а Ignore 0.Теперьдавайтепоработаемс PowerShell.
  38. 38. PS C:>Get-WmiObject win32_service -filter "Name=Spooler" | Invoke-WmiMethod-Name Change -ArgumentList @($null,$null,$null,0) | SelectReturnValueReturnValue-----------0Выглядит так, будто все работает, проверим.PS C:>get-wmiobject win32_service -filter "Name=spooler" | selectname,errorcontrolname errorcontrol---- ------------Spooler NormalАн нет! Так вышло, что у PowerShell есть небольшая ―причуда‖, о которой вы должны знать. Дажехотя WMI метод ожидает параметров в заданном порядке, ErrorControlдолжен быть на четвертомместе, когда используете Invoke-WmiMethod, порядок по алфавиту. И не спрашивайте почему.Вот что я делаю, чтобы определить ―правильный‖ порядок.PS C:> $svc = Get-WmiObject win32_service -filter "name=spooler"__GENUS : 2__CLASS : __PARAMETERS__SUPERCLASS :__DYNASTY : __PARAMETERS__RELPATH :__PROPERTY_COUNT : 11__DERIVATION : {}__SERVER :__NAMESPACE :__PATH :DesktopInteract :DisplayName :ErrorControl :LoadOrderGroup :LoadOrderGroupDependencies :
  39. 39. PathName :ServiceDependencies :ServiceType :StartMode :StartName :StartPassword :PSComputerName :В этом списке ErrorControlнаходится на 3 месте, так что я могу заново запустить изменѐнноевыражение Invoke-WmiMethod.PS C:>Get-WmiObject win32_service -filter "Name=Spooler" | Invoke-WmiMethod -Name Change -ArgumentList @($null,$null,0)Проверим еще раз и получим желаемый результат.PS C:>get-wmiobject win32_service -filter "Name=spooler" | selectname,errorcontrolname errorcontrol---- ------------Spooler IgnoreПомните, что в список аргументов необходимо включить $null для тех свойств, которые вы хотитепропустить. В следующей статье мы заострим внимание на работе со служебными учетнымизаписями, так как наверняка вы будете работать с ними с помощью PowerShell.ИтогИспользование WMI для управления службами в вашей среде довольно полезно, особенно для техситуаций, когда единственный вариант – WMI. Но если вы работаете с PowerShell 3.0, вы такжеможете использовать CIM командлеты, которые я рассмотрю в следующей статье.Часть 5. CIM-командлетыЕсли вы работаете с PowerShell 3.0, то вам доступны новые CIM-командлеты. Работать с ними проще— и в этом посте мы узнаем почему.
  40. 40. Остановка и запуск служб с помощью CIM командлетовОдним из важных отличий CIM-объекта от ―чистого‖ WMI является то, что результирующий объект(resultantobject) не имеет методов. А это значит, что вы не можете непосредственно извлекать(invoke) метод, например, StopService(). Вместо этого используйте командлетInvoke-CimMethod.Рассмотрим пример для службы spooler на локальном компьютере.PS C:>get-ciminstance win32_service -filter "Name=spooler"ProcessId Name StartMode State Status ExitCode--------- ---- --------- ----- ------ --------0 Spooler Manual Stopped OK 1077Каквслучаес WMI, прощевсегопередатьобъектвкомандлет Invoke-CimMethod.PS C:>get-ciminstance win32_service -filter "Name=spooler" | Invoke-CimMethod-Name StartServiceReturnValuePSComputerName----------- --------------0Работа этого командлета во много схода с Invoke-WmiMethod. Возвращенное значение, равное 0,обозначает успех. Давайте теперь рассмотрим предыдущий запрос, в котором требовалось найтивсе службы с автостартом, но которые не были запущены.PS C:>get-ciminstance win32_service -filter "startmode=auto and state<>running" -computer$computers | Invoke-CimMethod -Name StartService –WhatIfПеременная $computers включает в себя список всех интересующих нас компьютеров.Используйте -Whatif.
  41. 41. Чтобы внести изменения, запустим команду, но уже без –WhatIf.PS C:>get-ciminstance win32_service -filter "startmode=auto and state<>running" -computer$computers | Invoke-CimMethod -Name StartServiceНа скриншоте можно видеть, что проблема имеется у компьютера chi-dc02 (ReturnValue отличаетсяот 0).
  42. 42. Давайте поработаем с тем, что я делал в предыдущей статье, используя Invoke-WmiMethod. Сейчася работаю в PowerShell 3.0, так что можно взять каждый объект службы, запустить его и создатькастомный объект для выведения результатов.get-ciminstance win32_service -filter "startmode=auto and state<>running"-computer $computers |foreach {$result = $_ | Invoke-CimMethod -Name StartService#create a custom object[pscustomobject]@{Result=$Result.ReturnValueName=$_.NameDisplayName=$_.DisplaynameComputername=$Result.PSComputername}} | Sort Computername,NameСтало проще, не так ли?
  43. 43. Можно добавить и другие кастомные свойства, например дату и время. Чтобы вывести толькоошибки, слегка изменим правила сортировки.... | SortComputername,Name | Where {$_.result -gt0}ResultNameDisplayNameComputername------ ---- ----------- ------------7VMToolsVMwareToolsService chi-dc022gpsvcGroupPolicyClient chi-win8-01Меняем режим запуска (StartMode)Поменять свойство службы (например, Startmode) также просто. Например, мне не нужно, чтобыслужба RemoteAccessConnectionManager была запущена в сети.Такчтоясобираюсьотключитьеевезде.
  44. 44. PS C:>get-ciminstance win32_service -filter "name=rasman" -comp $computers |Invoke-CimMethod -methodnameChangeStartmode -Arguments @{startmode=Disabled}ReturnValuePSComputerName----------- --------------0 chi-win8-010 chi-dc030 chi-db010 chi-ex01Небольшое отличие от Invoke-WmiMethod – список аргументов должен быть в виде объектасловаря (dictionaryobject). Сложность здесь заключается в определении ключа, которым в данномслучае является StartMode. Лучше обратиться к документации для метода WMI и посмотреть имяпараметра. Внимательный читатель обратил внимание на то, что я использовал –MethodNameвместо привычного (и использовавшегося ранее) параметра –Name. –Name – этонедокументированное сокращение для параметра –MethodName.Так как мы используется объект словаря (dictionaryobject) для параметров метода, проще извлечьChange метод для объекта службы. В предыдущей статье для службы Spooler мы установилизначение свойства ErrorControl равным Ignore. Давайте вернем его значение в Normal, используятеперь CIM командлеты.PS C:>get-ciminstance win32_service -filter "name=spooler" | Invoke-CimMethod-MethodName Change -Arguments @{ErrorControl=1}ReturnValuePSComputerName----------- --------------0Это гораздо проще. Не нужно вычислять позиции и добавлять пустые ($Null) значения. Выберитеметод параметра и с делом покончено.ИтогПочему стоит использовать CIM командлеты: более простое удаленное управление и ―дружескиеотношения‖ с файрволом. Конечно, требуется PowerShell 3.0. Все, что вы можете сделать для
  45. 45. управления службами с помощью WMI, можно сделать и с помощью CIM командлетов, зачастуютребуется меньших усилий для этого.Я также наткнулся на одну особенность CIM командлетов. В нормальных условиях удаленныйкомпьютер должен также работать c PowerShell 3.0. Это справедливо, когда вы передаете всеэкземпляры заданного класса. Но когда вы используете фильтр, как я часто делаю в этой статье, тоя могу делать запрос с использованием Get-CimInstance даже если на удаленном компьютереработает PowerShell 2.0! Я до сих пор выясняю, почему так. В любом случае, напоминаю, что нужнотестировать все, что мы рассматриваем в лабораторной среде.В следующей части мы посмотрим на управление учетными данными (credentials), под которымизапущена служба.Часть 6. Служебные учетные записиВ этой части мы рассмотрим, как осуществлять управление служебными учетными записями спомощью WMI- и CIM-командлетов.Используем WMIЧтобы изменить пароль служебной учетной записи, нам нужна ссылка на объект службы. И япредполагаю, что это служба с учетной записью пользователя.PS C:>get-wmiobject win32_service -filter "name=yammmsvc" | Selectname,startnamename startname---- ---------YammmSvc .JeffВ предыдущих статьях мы рассматривали, что для этих целей можно использовать метод Change()для изменения пароля служебной учетной записи. Также помним, что параметры Invoke-WmiMethod не следует задокументированному на MSDN порядку.PS C:> $svc = get-wmiobject win32_service -filter "name=yammmsvc"PS C:> $svc.GetMethodParameters("change")
  46. 46. __GENUS : 2__CLASS : __PARAMETERS__SUPERCLASS :__DYNASTY : __PARAMETERS__RELPATH :__PROPERTY_COUNT : 11__DERIVATION : {}__SERVER :__NAMESPACE :__PATH :DesktopInteract :DisplayName :ErrorControl :LoadOrderGroup :LoadOrderGroupDependencies :PathName :ServiceDependencies :ServiceType :StartMode :StartName :StartPassword :PSComputerName :Пароль находится на 11 месте. А это значит, что нам необходимо вставить пустые значения для 10предыдущих параметров, которые не меняются.PS C:> $svc | Invoke-WmiMethod -Name Change -ArgumentList@($null,$null,$null,$null,$null,$null,$null,$null,$null,$null,"P@ssw0rd")__GENUS : 2__CLASS : __PARAMETERS__SUPERCLASS :__DYNASTY : __PARAMETERS__RELPATH :__PROPERTY_COUNT : 1__DERIVATION : {}__SERVER :__NAMESPACE :__PATH :
  47. 47. ReturnValue : 0PSComputerName :0 в качестве возвращенного значения означает успешность нашего действия. Но помните, чтоизменение не вступит в силу, пока мы не перезапустим службы.Если вы хотите изменить имя учетной записи, необходимо уточнить его в предыдущем параметре.PS C:> $svc | Invoke-WmiMethod -Name Change -ArgumentList@($null,$null,$null,$null,$null,$null,$null,$null,$null,"LocalSystem","P@ssw0rd")Также нам необходимо установить первоначальный пароль для системных учетных записей.Используем CIMОднако гораздо проще использовать CIM-командлеты для решения подобных задач. Еще разпоменяем учетную запись и пароль для службы.PS C:>Get-CimInstance win32_service -filter"name=yammmsvc" | Invoke-CimMethod -NameChange -Arguments @{StartName=".Jeff";StartPassword="P@ssw0rd"}И снова возращенное значение должно быть равно 0. ВведитеstartnameвформатеMACHINEUSERNAME или DOMAINUSERNAME. В моем случае, Jeff – это локальная учетная запись.Если Вы хотите только изменить пароль, вам необходимо лишь откорректировать аргумент в хеш-таблице.Отметим, что вы можете выполнить запрос и изменить его с помощью Invoke-CimMethod.Объектвнегопередаватьненадо.PS C:> Invoke-CimMethod -Name Change -Arguments {StartName=".Jeff";StartPassword="P@ssw0rd"} -Query "Select * from Win32_Service where name=yammmsvc" –ComputernameJeffPCХотя запустить команду можно было и локально, я решил показать ее запуск на удаленномкомпьютере. Ниже приведен пример для изменения службы на нескольких компьютерах.PS C:> Invoke-CimMethod -Name Change -Arguments @{StartPassword="P@ssw0rd"} -Query "Select * fromWin32_service where name=MyCustomService" –computername $computers | out-filec:workresults.txt
  48. 48. Как вы видите, я сбросил пароль для службы MyCustomService запущенной на всех компьютерах,перечисленных в переменной $computers. Результаты сохраняются в текстовый файл, в которомуказаны имя компьютера и возращенное значение. Конечно, службы нужно перезапустить, чтобыизменения вступили в силу.Подводим итогиЕсли вам необходимо осуществлять управление служебной учетной записью, то вам потребуетсяиспользовать WMI – через WMI- или CIM-командлеты. Последние гораздо проще в использовании.

×