Service restart powershell: Управляем службами Windows с помощью PowerShell. Часть 2 / Блог компании Netwrix / Хабр

Содержание

Управляем службами Windows с помощью PowerShell. Часть 2 / Блог компании Netwrix / Хабр


Продолжаем знакомиться с тем, как осуществлять управление службами Windows с использованием PowerShell. В предыдущем посте мы рассмотрели, как получить статус службы на локальном и удаленном компьютере, произвести фильтрацию служб (например, найти только остановленные службы) и определить зависимые службы. В этом посте будут рассмотрены такие достаточно тривиальные вещи, как:
  1. Остановка службы
  2. Запуск службы
  3. Перезапуск службы
  4. Приостановка и возобновление работы
  5. Управление удаленными службами
  6. Настраиваем автозагрузку службы

Мы уделим большее внимание разбору команд в PowerShell для осуществления выше перечисленного на локальном компьютере. В разделе “управление службами удаленных компьютерах” мы рассмотрим, ограничения работы в PowerShell v2 и v3. Подробности под катом.

Предыдущая статья:
Управляем службами Windows с помощью PowerShell. Часть 1. Получаем статус служб

PS C:\> get-service bits
Status Name DisplayName
------ ---- -----------
Running bits Background Intelligent Transfer Ser...

Так как команда для получения статуса службы называется Get-Service, догадаться о том, как пишутся другие команды не составит труда. На худой конец мы можем спросить у PowerShell обо всех командах, так или иначе относящихся к работе со службами. Обратите внимание, что мы использовали параметр –noun для получения всех команд, связанных со службами.

Взглянем на эти команды внимательнее.

STOP-SERVICE

Чтобы остановить службу, мы должны уточнить ее имя.
PS C:\> stop-service wuauserv

Однако в конвейер ничего не будет передано. Некоторые командлеты, такие как Stop-Service, созданы таким образом, что по умолчанию они не записывают объект в конвейер. Мы же заставим это сделать, использовав параметр –Passthru.

PS C:\> stop-service bits -PassThru
Status Name DisplayName
------ ---- -----------
Stopped bits Background Intelligent Transfer Ser...

Если служба не запущена, то командлет ничего не выведет, равно как и не выдаст никакой ошибки. Поэтому иногда лучше передать объект в Stop-Service (естественно использовав при этом параметр –whatif).

PS C:\> get-service browser | stop-service -WhatIf
What 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 -eq 'running'} | stop-service -pass
Status Name DisplayName
------ ---- -----------
Stopped bits Background Intelligent Transfer Ser...

Если служба запущена, то объект передается в конвейер и отправляется в Stop-Service. Ниже приведен вариант с остановкой нескольких служб.

PS C:\> get-service bits,wsearch,winrm,spooler | where {$_.status -eq 'running'} | stop-service -whatif
What 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)".

Некоторые службы не захотят останавливаться – в силу наличия зависимых служб – что мы и видим на скриншоте ниже.

В таком случае используем параметр –Force. В большинстве случаев это работает, но без “защиты от дурака”. Помните, что команда также остановит зависимые службы.

PS C:\> stop-service lanmanserver -force –PassThru
Status Name DisplayName
------ ---- -----------
Stopped Browser Computer Browser
Stopped lanmanserver Server
START-SERVICE

Запуск службы осуществляется аналогичным образом. Он поддерживает параметр –Whatif, и вам придется использовать –Passthru, чтобы увидеть объекты.

PS C:\> start-service wuauserv -PassThru
Status Name DisplayName
------ ---- -----------
Running wuauserv Windows Update

И снова: если служба уже запущена, командлет ничего не сделает. Однако вы можете попытаться запустить службу и получите такую ошибку.

Причиной тому в большинстве случаев является выключенные службы. Как конфигурировать настройки службы, я расскажу в следующей статье.
Если вы хотите запустить службы и все службы, зависимые от нее, используйте следующее выражение:

PS C:\> get-service lanmanserver | Foreach { start-service $_.name -passthru; start-service $_.DependentServices -passthru}
Status Name DisplayName
------ ---- -----------
Running lanmanserver Server
Running Browser Computer Browser

Мы должны явно получить зависимые службы, потому что Start-Service не запустит автоматически их.

RESTART-SERVICE

Вы удивитесь, но перезапуск службы работает также как два предыдущих примера. Используйте –Passthru, если хотите убедиться, что служба запущена.

PS C:\> restart-service spooler -PassThru
Status Name DisplayName
------ ---- -----------
Running spooler Print Spooler

Так как мы осуществляем остановку службы, нам может понадобиться параметр –Force.

ПРИОСТАНОВКА И ВОЗОБНОВЛЕНИЕ РАБОТЫ

Работа некоторых служб может быть приостановлена на некоторое время, а затем возобновлена, и мы можем это сделать через PowerShell. Однако если служба не удовлетворяет требованиям, мы получим такие ошибки. (на примере показано, что мы пытались приостановить службу bits)

В чем же проблема? Смотрим на объект (используя Get-Service).

PS C:\> get-service bits | select *
Name : bits
RequiredServices : {RpcSs, EventSystem}
CanPauseAndContinue : False
CanShutdown : False
CanStop : True
DisplayName : Background Intelligent Transfer Service
DependentServices : {}
MachineName : .
ServiceName : bits
ServicesDependedOn : {RpcSs, EventSystem}
ServiceHandle : SafeServiceHandle
Status : Running
ServiceType : Win32ShareProcess
Site :
Container :

Если значение свойства CanPauseAndContinue равно True, значит мы можем приостанавливать и возобновлять работу службы. Найдем такие службы:

PS C:\> get-service | where {$_.CanPauseandContinue}
Status Name DisplayName
------ ---- -----------
Running LanmanServer Server
Running LanmanWorkstation Workstation
Running MSSQLSERVER SQL Server (MSSQLSERVER)
Running O2FLASH O2FLASH
Running stisvc Windows Image Acquisition (WIA)
Running Winmgmt Windows Management Instrumentation

Как мы видим, не так много служб удовлетворяют этому требованию.

PS C:\> suspend-service o2flash -PassThru
Status Name DisplayName
------ ---- -----------
Paused O2FLASH o2flash

Готовы возобновить работу службы? Используйте следующее выражение:

PS C:\> resume-service o2flash -PassThru
Status Name DisplayName
------ ---- -----------
Running O2FLASH o2flash

Оба командлета также поддерживают –Whatif.

УДАЛЕННЫЕ СЛУЖБЫ

Как вы могли обратить внимание, все примере выше мы демонстрировали на локальном машине. И это неслучайно. К сожалению даже в PowerShell v3, ни у одного из этих командлетов нет параметра, который позволял бы управлять службой на удаленном компьютере. Get-Service, конечно, поддерживает параметр –Computername, но не более. Службу лицезреть вы сможете, а что-либо с ней сделать не получится. Нет, можно, конечно, если удаленный компьютер работает с PS v2 и включен PowerShell Remoting. Тогда мы можете использовать все выше приведенные команды, используя Invoke-Command для удаленного компьютера или PSSession. С другой стороны, проще управлять одной службой на нескольких серверах.

PS C:\> Invoke-Command {restart-service dns –passthru} –comp chi-dc03,chi-dc02,chi-dc01

Управление службами на удаленных компьютерах не ограничивается вышеперечисленным, но это уже будет предмет рассмотрения последующих статей.
Все эти командлеты могут быть использованы в конвейерном выражении и зачастую это лучший вариант. Использование Get-Service для получения объектов и последующая передача их в подходящий командлет.

УСТАНАВЛИВАЕМ УДАЛЕННЫЙ СТАТУС

Итак, мы выяснили, что у командлета Stop-Service отсутствует такой полезный параметр как –Computername. Мы можете использовать эти команды в удаленной сессии, обратившись к командлету Invoke-Command, что уже само по себе продуктивно, если вы работаете со службой на нескольких компьютерах. Одно можно запускать, останавливать, перезапускать, ставить на паузу и запускать заново, используя Set-Service.

PS C:\> set-service wuauserv -ComputerName chi-dc03 -Status stopped -WhatIf
What if: Performing operation "Set-Service" on Target "Windows Update (wuauserv)".

Эта команда поддерживает параметр –WhatIf. Вы также должны использовать –Passthru для передачи объектов в конвейер.

PS C:\> set-service bits -ComputerName chi-dc03 -Status running -PassThru
Status Name DisplayName
------ ---- -----------
Running bits Background Intelligent Transfer Ser...

Валидными значениям для параметра –Status являются “запущена” (running), “остановлена” (stopped) и “на паузе” (paused). Помните, что у службы есть зависимые службы, мы не сможете изменять ее, что и продемонстрировано на скриншоте ниже.

К сожалению, у Set-Service отсутствует параметр –Force, поэтому придется вернуться к использованию PowerShell remoting и Invoke-Command

. Если вы хотите перезапустить удаленную службу, используйте следующую команду:

PS C:\> set-service w32time -ComputerName chi-dc03 -Status Stopped -PassThru | set-service -PassThru -Status Running
Status Name DisplayName
------ ---- -----------
Running w32time Windows Time

Не забудьте использовать –Passthru, в противном случае вторая команда Set-Service ничего не осуществит.
Что по мне, так я предпочитаю работать сразу с несколькими службами, которые я не могу удаленно остановить, используя Set-Service, хотя их запуск проблем составляет. Я использую Invoke-Command. Но помните, что используя параметр –Computername PowerShell осуществляет подключение, используя RPC и DCOM, что может привести к проблемам с файрволом. Invoke-Command использует PowerShell remoting, который мы может быть еще не настроили или не включили.

УСТАНАВЛИВАЕМ ТИП АВТОЗАПУСКА СЛУЖБЫ

Set-Service полезнен, когда вы хотите включить или отключить службу, используя параметр –StartupType. Если Вы настроили службу, используя значения Automatic, Manual or Disabled. К сожалению, не существует варианта для Automatic (Delayed).

PS C:\> set-service remoteregistry -StartupType Manual -WhatIf
What if: Performing operation "Set-Service" on Target "Remote Registry (remoteregistry)".
PS C:\> set-service remoteregistry -StartupType Manual -PassThru
Status Name DisplayName
------ ---- -----------
Stopped remoteregistry Remote Registry

Однако, просто взглянув на объект, мы не сможем сказать, к какому типу автозагрузки он относится.

PS C:\> get-service remoteregistry | select *
Name : remoteregistry
RequiredServices : {RPCSS}
CanPauseAndContinue : False
CanShutdown : False
CanStop : False
DisplayName : Remote Registry
DependentServices : {}
MachineName : .
ServiceName : remoteregistry
ServicesDependedOn : {RPCSS}
ServiceHandle : SafeServiceHandle
Status : Stopped
ServiceType : Win32ShareProcess
Site :
Container :

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

PS C:\> set-service remoteregistry -StartupType Disabled -PassThru
Status Name DisplayName
------ ---- -----------
Running remoteregistry Remote Registry

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

PS C:\> set-service remoteregistry -StartupType Disabled -PassThru | Stop-Service -PassThru
Status Name DisplayName
------ ---- -----------
Stopped remoteregistry Remote Registry

Технически, Set-Service позволяет вам изменить отображаемое имя службы и описание, но лично мне никогда не приходилось использовать в своей работе. Я использую Set-Service для включения и выключения служб. Если необходимо управлять службами удаленно, то я использую Invoke-Command.
Все, что я продемонстрировал в последних статьях, было связано с использованием специфических типов объектов службы, которые, как вы могли заметить, имеют некоторые ограничения. В следующей статье мы рассмотрим другие возможности по управлению службами, которые призваны обойти эти ограничения.

Upd:
В посте приведены переводы статей с портала 4sysops.com
Managing Services the PowerShell way – Part 3
Managing Services the PowerShell way – Part 4

Как остановить, запустить и перезапустить службу

А любите Вы PowerShell так-же как и я его люблю?

Большинство пользователей боятся консоли и команд, отдавая предпочтение в сторону графического интерфейса, но я не такой, я люблю автоматизацию .\

Регулярно приходится приходится что-то автоматизировать и что-то перезапускать. Так что без PowerShell я как без рук.

Сегодня хочу поговорить о службах Windows, остановка запуск и перезапуск будет выполняться средствами PowerShell.

И так на сегодня наш комендлет «Get-Service».

И так первым делом отобразим список всех служб Windows, для этого достаточно выполнить:

Get-Service

Данный командлет выведет список всех служб их статус и имя

Status   Name               DisplayName                           
------   ----               -----------                           
Running  ABBYY.Licensing... Сервис лицензирования ABBYY Lingvo x5 
Running  AdobeARMservice    Adobe Acrobat Update Service          
Stopped  AdobeFlashPlaye... Adobe Flash Player Update Service     
Stopped  AeLookupSvc        Application Experience                
Stopped  ALG                Application Layer Gateway Service     
Stopped  AppIDSvc           Application Identity                  
Running  Appinfo            Application Information               
Stopped  AppMgmt            Application Management                
Stopped  aspnet_state       ASP.NET State Service                 
Running  AudioEndpointBu... Windows Audio Endpoint Builder        
Running  AudioSrv           Windows Audio

Дальше усложняем задачу, выведем все службы, которые запущенны:

Get-Service | Where-Object {$_.Status -EQ "Running"}

Будет как-то так

Status   Name               DisplayName                           
------   ----               -----------                           
Running  ABBYY.Licensing... Сервис лицензирования ABBYY Lingvo x5 
Running  AdobeARMservice    Adobe Acrobat Update Service          
Running  Appinfo            Application Information               
Running  AudioEndpointBu... Windows Audio Endpoint Builder        
Running  AudioSrv           Windows Audio                         
Running  AVP                Kaspersky Endpoint Security Service   
Running  avpsus             Kaspersky Seamless Update Service     
Running  BFE                Base Filtering Engine                 
Running  BITS               Background Intelligent Transfer Ser...
Running  Browser            Computer Browser                      
Running  bthserv            Bluetooth Support Service             
Running  CcmExec            SMS Agent Host

С командлетом «Get-Service», пока все, а дальше будем Запускать останавливать и перезапускать используя Start-Service, Stop-Service, Restart-Service. Какой для чего думаю не стоит объяснять .

Давайте попробуем остановить службу по имени BITS или отображаемому имени «Background Intelligent Transfer Service»

Первый Вариант:

Stop-Service -Name BITS

И второй

Stop-Service -DisplayName 'Background Intelligent Transfer Service'

В Windows есть имя и Экранное имя, первое короткое и занимает мало букв, второе это отображаемый синоним, т.е. полное наименование, лично я предпочитаю пользоваться коротким именем сервиса.

Запустить и перезупустсть можно антологичным способом

Start-Service -DisplayName 'Background Intelligent Transfer Service'
Restart-Service -Name BITS

Отобразить текущий статус службы можно так:

Get-Service -Name BITS
Get-Service -DisplayName 'Background Intelligent Transfer Service'

Каким воспользоваться, решать Вам.

Еще записи по теме

Получение списка и запуск служб Powershell Service и управление

Для управления службами в Powershell есть восемь команд с помощью которых мы можем контролировать весь процесс работы сервисов и создавать новые. Что бы увидеть весь список команд созданных в PS для работы с сервисами нужно выполнить:


Get-Command -Noun Service

Мы увидим следующие командлеты:

  • Get-Service — получение списка служб в Powershell.
  • New-Service — создание нового сервиса.
  • Restart-Service — перезапуск службы.
  • Resume-Service — восстанавливает работу остановленного сервиса.
  • Set-Service — изменение настроек.
  • Start-Service — запуск службы в Powershell.
  • Stop-Service — остановка.
  • Suspend-Service — приостановка работы (пауза).

Учитывайте, что в виде команд делается не полное управление сервисами. Например удаление делается через WMI, которое тоже будут рассмотрены.

Узнать статус всех служб можно так:


Get-Service

Каждый результат выдаваемый командами в PS представляет собою объект. Этот объект содержит разные свойства и методы. Свойства — это например имя или статус. По умолчанию мы видим не все свойства. Что бы узнать какие еще свойства есть у команды нужно выполнить следующее:


Get-Service | Get-Member -MemberType Properties

Часть свойств реализована в виде ключей. Попробуем вывести сразу все свойства всех сервисов, но в таком случая вывод будет сложно читаемый:


Get-Service | SELECT *

Возможно вывести только имена, статус и тип запуска:


Get-Service | Ft Name, Status, StartType

Или выведем информацию по одному сервису:


Get-Service "WinRM" | Ft Name, Status, StartType

У сервисов есть короткое имя и отображаемое. Так мы выведем оба:

В именах мы можем использовать маски, а это значит что мы можем не знать полное название и использовать знак * в том месте, где не уверены в названии или написании:


Get-Service -DisplayName "Win*" | Ft Name, DisplayName, Status, StartType

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

  • Cannot find any service with service name
  • Cannot find any service with display name
  • Не удается найти службу с отображаемым именем

Кроме этого есть два ключа, которые тоже поддерживают маски:

  • Include — включают поиск по какой-то маске или точному соответствию.
  • Exclude — исключает упоминание.

Можно сравнить разницу с прошлым примером:


Get-Service -Name "Win*" -Include "*RM" -Exclude "*mgmt","*Http*","*Defend" | Ft Name, Status, StartType

У сервисов несколько статусов:

  • Running — запущен.
  • Stopped — остановлен.
  • Paused — приостановлен (пауза).

По каждому из них мы можем отфильтровать результат:


Get-Service | where -Property Status -eq Stopped

Кроме этого есть 3 типа запуска:

  • Automatic — автоматический запуск вместе с системой.
  • AutomaticDelayedStart — запуск после загрузки системы.
  • Manual — ручной запуск.
  • Disabled — отключенный.

Допустим, что у нас есть какая-то проблема в операционной системе и мы хотим проверить все сервисы, который автоматически запускаются при включении ОС. Для этого нам нужно использовать несколько условий, где статус не равен Running и тип запуска равен Automatic:


Get-Service | where -FilterScript {$_.Status -ne 'Running' -and $_.StartType -eq 'Automatic'} | ft 'Name','StartType','Status'

Службы могут быть зависимы от других и для проверки этих свойств есть два параметра:

  • DependentServices — кто зависит от этого сервиса.
  • RequiredServices — от кого зависит этот сервис.

Get-Service -DisplayName 'Windows Remote Management (WS-Management)' -RequiredServices -DependentServices

Аналогично параметрам команды выше есть свойства DependentServices и ServicesDependedOn (RequiredServices). Они выводят одно и то же.

Есть несколько свойств, которые не выведены в параметры — это:

  • CanPauseAndContinue — можно ли приостановить работу сервиса и возобновить.
  • CanShutdown — может ли быть выключен.
  • CanStop — может ли быть полностью остановлен.

Эти свойства так же можно увидеть в GUI. В командлете ниже я использую алиас gsv (короткое имя Get-Service):


gsv -ServiceName 'Winrm' | SELECT CanPauseAndContinue,CanShutdown,CanStop | fl

Каждая команда PS, где присутствует параметр ComuterName, может быть выполнена удаленно. Для удаленного управления в Powershell нужны дополнительные настройки, которые уже описывались в предыдущей статье. 

Имена всех компьютеров, с которых мы хотим получить имена сервисов, можно указать через запятую:


gsv -ComputerName 'AD1','localhost' | where Status -eq 'Stopped' | Select MachineName,Name,Status,StartType

 

 

Чтобы в Powershell запустить службу и остановить достаточно указать только имя. Причем можно указывать как короткое и отображаемое имя:


Stop-Service -Name 'WinRM'
Start-Service -DisplayName 'Служба удаленного управления Windows (WS-Management)'

Можно выполнить получение, остановку и запуск в одну команду:


gsv 'WinR*' | Stop-Service | Start-Service

 Во большинстве командлетах PS, которые делают изменения, можно увидеть два параметра. Первый — это WhatIf, который покажет результат выполнения командлета, но не попытается ее выполнить. Такие параметры удобно использовать при выполнении сложных задач типа кластеров. Второй параметр Confirm, который потребует подтверждение перед выполнением. Вместе эти параметры не работают:


Stop-Service -DisplayName 'Windows Remote Management (WS-Management)' -Confirm

В запуске и остановке так же можно использовать параметры фильтрации, которые вы видели при получении статусов выше. Будьте осторожны перед выполнением так как вы можете остановить все службы:


Stop-Service 'WinR*' -Include '*M'
Start-Service 'WinR*' -Include '*M'

Если с сервисом работает другой сервис, то мы не завершим его работу и нужно указать дополнительный ключ Force:


Stop-Service 'WinRM' -Force

Если он не стоит появится ошибка:

  • Cannot stop service ‘Remote Procedure Call (RPC) (RpcSs)’ because it has dependent services. It can only be stopped if the Force flag is set.
  • Не удается получить доступ к зависимым службам «Удаленный вызов процедур (RPC) (RpcSs)».

Как уже было описано выше сервисы могут быть зависимы от других и в таком случае запуск может не получится. На примере ниже я получил все родительские сервисы (от которых зависит Spooler) и запустил их, а затем запустил требуемый:


$sub_services = Get-Service 'Spooler'
$sub_services.RequiredServices | Start-Service
$sub_services.Name | Start-Service

Перезапуск сервисов работает так же со всеми параметрами:


Restart-Service 'WinRM'

Удаленный запуск и остановка командлетами не предусмотрена, но это исправляется стандартными методами:


Invoke-Command -ComputerName 'AD1','localhost' -ScriptBlock {Start-Service 'WinRM'}

 

Не каждую службу можно приостановить (Pause) и восстанавливть. Что бы увидеть все службы, у которых есть такая возможность, выполните:


Get-Service | where CanPauseAndContinue | select -Property Name,CanPauseAndContinue,DisplayName

 

Командой ниже мы получи, нажмем паузу и восстановим работу сервиса Winmgmt:


Get-Service -Name 'Winmgmt' | Suspend-Service | Resume-Service

Ошибки, если мы попытаемся остановить службу у которых нет такой возможности:

  • Service ‘Windows Remote Management (WS-Management)’ cannot be suspended because the service does not support beingsuspended or resumed. 
  • Не удается приостановить службу «Spooler», так как этой службой не поддерживается приостановка или возобновление.

В этих командах так же можно использовать параметры Include и Exclude, с масками. 

На скрипте ниже показана проверка возможности приостановки сервиса, если у него есть такая возможность. Если ее нет, то сервис остановит свою работу:


# Закомментировано от случайностей
#$srv = 'Winmgm*'
$srv_suspend_on = (Get-Service $srv).CanPauseAndContinue
if ($srv_suspend_on){Suspend-Service $srv}
else {Stop-Service $srv}

 

Командлетом ниже я изменил тип запуска сервиса с отключенного на автоматический:


Set-Service 'WinRM' -StartupType Automatic

В случае изменения сервисов нельзя использовать маски *. 

В документации Microsoft говориться про возможность изменения на четыре режима со следующими названиями:

  1. Automatic
  2. AutomaticDelayedStart
  3. Disabled
  4. Manual

Во первых половина называется иначе и изменение не срабатывает. Возможно изменение не срабатывает из-за багов Windows Server 2019,может из-за зависимостей (в GUI все работает), но скорее всего дело в PS. При работе с WMI все срабатывает. Реальные варианты запуска такие:

  1. Automatic
  2. Boot
  3. Disabled
  4. Manual
  5. System

Через эту команду можно так же выполнить запуск и остановку:


Set-Service 'WinRM' -Status Stopped

Все возможные значения:

Можно изменить описание сервиса:


Set-Service 'WinRM' -Description 'что вы сделали с PS'

Команды изменения можно выполнять удаленно:


Set-Service WinRM -ComputerName 'AD1' -StartupType Automatic

 

Для создания сервиса необходимо указать два параметра — это имя и путь до бинарного файла:


New-Service -Name 'TestService' -BinaryPathName 'C:\test.exe'

В PS 5.1 не предусмотрена команда удаления, она появилась в версии 6.1, которая устанавливается отдельно и может работать иначе. Для удаления сервисов, а так же частичного изменения, используется WMI. Указывайте все возможные параметры, что бы в последующем не лезть в WMI.

Параметры, которые в последующем нельзя будет изменить через PS:

  • DisplayName — полное отображаемое имя.
  • Credential  — учетная запись, под которой будет происходить запуск.
  • DependsOn — от кого будет зависеть.

$credential = Get-Credential
New-Service -Name 'TestService1' -BinaryPathName 'C:\test.exe' -DisplayName 'Testing Services In Powershell' -Credential $credential -DependsOn WinRM

При объявлении переменной $credential у нас запросятся учетные данные (логин/пароль). По умолчанию сервис работает под текущим аккаунтом. Я создавал сервис на доменном компьютере и пока я не ввел FQDN вид [email protected] я получал ошибку:

  • Service ‘Testing Services In Powershell (TestService1)’ cannot be created due to the following error: The account name is invalid or does not exist, or the password is invalid for the account name specified

Кроме этого есть параметры, которые возможно изменить через команды выше:

  • Description — описание.
  • StartupType — тип запуска.

New-Service 'InstallService' -BinaryPathName 'C:\test.exe' -Description 'Descr' -StartupType Automatic

 

За работу со службами в WMI отвечает класс win32_service. Преимущества такого подхода в том, что тут можно посмотреть и изменить все детали работы сервисов. Более подробно WMI в Powershell мы уже рассматривали.

Что бы получить список аналогичный Get-Service выполните:


Get-WmiObject -Class 'Win32_Service' | ft

 

В классе WMI можно увидеть больше свойств, которые можно использовать:


Get-WmiObject -Class 'Win32_Service' | Get-Member -MemberType Properties

Одно из преимуществ использования в WMI это то, что мы можем увидеть идентификатор процесса под которым работает сервис. Если сервис остановлен, то его идентификатор 0. Так мы увидим идентификатор процесса с именем WinRM и получим всю информацию по процессу:


$srv = Get-WmiObject -Class Win32_Service | Where -Property Name -eq 'WinRM'
$srv.ProcessId
Get-Process -Id $srv.ProcessId

О том как работать с процессами в Powershell мы писали в прошлой статье. 

С помощью WMI мы можем вернуть имя аккаунта, под которым запущена служба и ее описание. Используя параметр ComputerName это можно сделать удаленно на множестве компьютеров:


Get-WmiObject -ComputerName 'AD1','localhost' -Class Win32_Service | ft Name,StartName,Description -AutoSize

 

Для управления в WMI существую методы. Все методы класса можно получить так:


Get-WmiObject -Class 'Win32_Service' | Get-Member -MemberType Method

Удалим сервис, который создавался через New-Service:


Get-WmiObject -Class 'Win32_Service' | Get-Member -MemberType Method

Для изменения паролей нужно использовать следующую конструкцию. После выполнения команды сервис нужно перезапустить:


# Логин пользователя
$user = 'ServiceUser'
# Пароль пользователя
$password = 'Pass0000'
# Имя сервиса
$srv_name = 'ServiceName'
$srv = Get-WmiObject -Class win32_service | where -Property Name -eq $srv_name
$srv.Change($null,$null,$null,$null,$null,$null,$null,$null,$null,$user,$password)

$null установлены у всех параметров, которые мы не хотим изменять. В нашем случае нужно изменить только логин и пароль и они указаны в переменных. Увидеть какие параметры не меняются с $null можно так:


$srv = get-wmiobject win32_service | where Name -eq Winrm
$srv.GetMethodParameters("change")

Теги: #powershell

Управляем службами Windows с помощью PowerShell / Блог компании Netwrix / Хабр


Начинаем серию переводов, посвященную управлению службами Windows с помощью PowerShell 2.0 и 3.0.
В данном посте будут рассмотрены следующие вопросы управления службами Windows:
  • Получаем статус службы на локальном компьютере
  • Получаем статус службы на удаленном компьютере
  • Осуществляем фильтрацию служб (например, остановленные службы)
  • Зависимые службы


Обозначим начальные условия: Вы работаете под Windows 7 и выше и у Вас имеются права администратора. Все команды рекомендуются выполнять в лабораторной или виртуальной среде, перед тем, как применять в “полевых условиях”.
ПОЛУЧАЕМ СТАТУС СЛУЖБЫ

Давайте начнем с того, что просто получим статус всех служб, запущенных на локальном компьютере. Используем для этого командлет Get-Service.

PS C:\> get-service

PowerShell, как правило, не чувствителен к регистру. Вывод приведен на скриншоте ниже.

Каждая строка представляет собой объект службы (service object).Каждый сервисный объект, как правило, имеет свои свойства. Вы можете открыть их, просто передав эти объекты в другую команду, Get-Member.

PS C:\> get-service | get-member

Результаты приведены на скриншоте ниже.

Параметр Typename сверху говорит о том, что за объект перед нами; в данном случае это System.ServiceProcess.ServiceController. На скриншоте также обведены свойства объекта. Это атрибуты, которые описывают этот тип объекта. Хотя большинство из них не используются при отображении по умолчанию, вы можете использовать их, если вы их знаете.
Например, нам интересно посмотреть информацию только о Windows Update. Через Get-Service получим информацию только о некоторых ее свойствах.

PS C:\> get-service wuauserv | select Displayname,Status,Can*
DisplayName : Windows Update
Status : Stopped
CanPauseAndContinue : False
CanShutdown : False
CanStop : False

Как я узнал, что могу напечатать имя службы? Посмотрел с помощью Get-Service.
PS C:\> help get-service

Вы можете получить полную справочную информацию, напечатав:

PS C:\> help get-service –full

Информацию о службе можно получить по ее имени или даже начальным буквам имени.

PS C:\> get-service wi*
Status Name DisplayName
------ ---- -----------
Stopped WiaRpc Still Image Acquisition Events
Running WinDefend Windows Defender Service
Running WinHttpAutoProx... WinHTTP Web Proxy Auto-Discovery Se...
Running Winmgmt Windows Management Instrumentation
Running WinRM Windows Remote Management (WS-Manag...

Или если вам удобнее работать с отображаемыми именами, используйте параметр –Displayname.

PS C:\> get-service -DisplayName "windows a*"
Status Name DisplayName
------ ---- -----------
Stopped AllUserInstallA... Windows All-User Install Agent
Running AudioEndpointBu... Windows Audio Endpoint Builder
Running Audiosrv Windows Audio

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

PS C:\> get-service "windows a*"

Параметр –Name можно не печатать.

ПОЛУЧАЕМ СТАТУС СЛУЖБЫ НА УДАЛЕННЫХ КОМПЬЮТЕРАХ

До этого нас интересовало получение информации о статусе служб на локальном компьютере. Однако управление службами осуществляется на удаленных компьютерах. Если посмотреть справку по Get-Service, то можно увидеть наличие у этого командлета параметра –Computername. В данном случае подключение к удаленным компьютерам осуществляется без включения функции удаленного управления PowerShell. Если вы можете управлять службами, используя инструменты командной строки (sc.exe или консоль управления Service Manager), вы можете использовать PowerShell. Давайте взглянем на пример:

PS C:\> get-service spooler -ComputerName novo8
Status Name DisplayName
------ ---- -----------
Running spooler Print Spooler

Любая команда, которую я демонстрировал, можно использовать для передачи удаленному компьютеру. Даже нескольким компьютерам, если у вас есть соответствующие права на удаленном компьютере. Если вы используете PowerShell v3, то можно легко выбрать одну службу на множестве компьютеров.

PS C:\> get-service wuauserv -ComputerName chi-dc01,chi-dc02,chi-dc03
Status Name DisplayName
------ ---- -----------
Running wuauserv Windows Update
Stopped wuauserv Windows Update
Running wuauserv Windows Update

Для наглядности представления отформатируем вывод.

PS C:\> get-service wuauserv -ComputerName chi-dc01,chi-dc02,chi-dc03 | format-table Name,Status,Machinename -autosize
Name Status MachineName
---- ------ -----------
wuauserv Running chi-dc03
wuauserv Stopped chi-dc02
wuauserv Running chi-dc01

Тот же самый результат, но в PowerShell v2.

PS C:\> 'chi-dc01','chi-dc02','chi-dc03'| foreach {get-service wuauserv -computername $_} | Format-Table Name,Status,Machinename -AutoSize
Name Status MachineName
---- ------ -----------
wuauserv Running chi-dc01
wuauserv Stopped chi-dc02
wuauserv Running chi-dc03

ОСУЩЕСТВЛЯЕМ ФИЛЬТРАЦИЮ (ИСПОЛЬЗУЯ WHERE-OBJECT)

Фильтрация служб осуществляется с помощью командлета Where-Object (where – сокращение для командлета). Все, что нам нужно от PowerShell в этом случае, так это получить только те службы, у которых статус равен “stopped”.

PS C:\> get-service | where {$_.status -eq 'stopped'}

PowerShell получает информацию обо всех службах и передает их (с помощью “|”) в следующую команду, которая осуществляет просмотр каждого объекта. Если свойство статуса объекта равно “stopped”, она остается в конвейере (pipeline), в противном случае она из него исключается. В конце выражение PowerShell отображает те объекты, которые остались в конвейере.
Результаты приведены ниже.

Теперь давайте попробуем найти одну службу на нескольких машинах. Вывод отформатируем в таблицу.

PS C:\> get-service -computername @('chi-dc01','chi-dc02','chi-dc03') | where {$_.name -eq 'wuauserv'} | format-table Name,Status,Machinename -autosize
Name Status MachineName
---- ------ -----------
wuauserv Running chi-dc02
wuauserv Running chi-dc01
wuauserv Running chi-dc03

Мы даже можем комбинировать запрос отдельных служб с их фильтрацией.

PS C:\> get-service "win*" -comp chi-dc03 | where {$_.status -eq 'running'}
Status Name DisplayName
------ ---- -----------
Running Winmgmt Windows Management Instrumentation
Running WinRM Windows Remote Management (WS-Manag...

Эта команда находит все службы на компьютере CHI-DC03, которые начинаются с ‘WIN’, но отображает только те, которые запущены.
Также можно сгруппировать объекты по свойству статуса (status property).

PS C:\> $dc03 = get-service -computername chi-dc03 | Group-Object -Property Status

Переменная $dc03 является объектом GroupInfo.

PS C:\> $dc03
Count Name Group
----- ---- -----
64 Running {System.ServiceProcess.ServiceController, Sy...
79 Stopped {System.ServiceProcess.ServiceController, Sy...

Свойство Group представляет собой коллекцию связанных служб.

PS C:\> $dc03.Get(0).group

Написанное выше проще понять, если взглянуть на скриншот.

Что касается меня, то я бы предпочел использовать хеш-таблицу.

PS C:\> $hash = get-service -computername chi-dc03 | Group-Object -Property Status -AsHashTable
PS C:\> $hash
Name Value
---- -----
Running {System.ServiceProcess.ServiceController, Sys...
Stopped {System.ServiceProcess.ServiceController, Sys...

Теперь каждое имя представляет собой свойство в хеш-таблице. Если у вас имеется опыт работы с PoweShell, вы, возможно, подумываете сделать сделующее:

PS C:\> $hash.running.count

Однако ничего не произойдет. Потому что свойство Status является просто перечислением (enumeration) для [System.ServiceProcess.ServiceControllerStatus] .NET клас и такие свойства, как Running и Stopped представляют собой целые числа. PowerShell осуществляет конвертацию, чтобы представить в более наглядной форме.

PS C:\> $hash = get-service -computername chi-dc03 | Group-Object -Property Status –AsHashTable –AsString

В чем суть параметра –AsString, на мой взгляд, достаточно очевидно. Теперь работать с хеш-таблицей стало проще.

PS C:\> $hash.running.count
62
PS C:\> $hash.running[0..3]
Status Name DisplayName
------ ---- -----------
Running ADWS Active Directory Web Services
Running AppHostSvc Application Host Helper Service
Running BFE Base Filtering Engine
Running BrokerInfrastru... Background Tasks Infrastructure Ser...

Следующей задачей на повестке дня является проверка зависимостей сервера (server dependencies).

Требуемые службы

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

PS C:\> get-service dns -ComputerName chi-dc03 –RequiredServices
Status Name DisplayName
------ ---- -----------
Running Afd Ancillary Function Driver for Winsock
Running Tcpip TCP/IP Protocol Driver
Running RpcSs Remote Procedure Call (RPC)
Running NTDS Active Directory Domain Services

Параметр –RequiredServices передаст объект в конвейер для каждой требуемой службы. Вы можете даже пойти дальше и проверить требуемые службы для работы данной службы.

PS C:\> get-service dns -ComputerName chi-dc03 -RequiredServices | select name,@{name="computername";expression={$_.machinename}} | get-service -RequiredServices
Status Name DisplayName
------ ---- -----------
Running RpcEptMapper RPC Endpoint Mapper
Running DcomLaunch DCOM Server Process Launcher

Параметр –Computername командлета Get-Service возьмет вывод, но только для тех объектов, у которых есть объект свойство Computername – именно поэтому я использую хеш-таблицу с Select-Object. Как мы видим проблем со службой DNS на компьютере CHI-DC03 нет.

ЗАВИСИМЫЕ СЛУЖБЫ

Мы можем сделать то же самое с зависимыми службами. Если таковых не имеется, в конвейер ничего передано не будет.

PS C:\> get-service dns -ComputerName chi-dc03 -DependentServices
PS C:\> get-service lanmanworkstation -ComputerName chi-dc03 -DependentServices
Status Name DisplayName
------ ---- -----------
Stopped SessionEnv Remote Desktop Configuration
Running Netlogon Netlogon
Running Dfs DFS Namespace
Running Browser Computer Browser

Требуемые и зависимые службы также являются частью каждого объекта службы.

PS C:\> get-service rpcss | Select *services
RequiredServices DependentServices
---------------- -----------------
{RpcEptMapper, DcomLaunch} {WwanSvc, wuauserv, WSearch, wscsvc...}

А пока Вы можете получить все зависимости для всех служб, следующая команда

PS C:\> get-service –DependentServices

Это не даст вам особо полезную информацию, поэтому я рекомендую осуществлять запрос по конкретным службам. Команда работает гораздо лучше PowerShell v3.

PS C:\> get-service dns -comp chi-dc01,chi-dc03 -RequiredServices | Sort Machinename,Name | Format-table -GroupBy machinename

Результаты видны на скриншоте ниже.

Чтобы получить подобные результаты в PowerShell v2, вам придется передать имена компьютеров (computernames) в Get-Service.

PS C:\> "chi-dc01","chi-dc03" | foreach { get-service dns -comp $_ -RequiredServices} | Sort Machinename,Name | format-table -GroupBy machinename

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

Upd:
В посте приведены переводы статей с портала 4sysops.com
Managing Services the PowerShell way – Part 1
Managing Services the PowerShell way – Part 2

P.S. Хотим также поделиться нашей бесплатной программой для управления службами Windows – NetWrix Service Monitor. Программа отслеживает все автоматически запускаемые службы на группе серверов и в случае внезапного сбоя одной или нескольких из них отправляет уведомления по электронной почте. Функция перезапуска гарантирует, что все подконтрольные службы будут работать без простоев. Программа проста в настройке: устанавливаем, вводим имена компьютеров и указываем нужный адрес электронной почты.

Управление службами в Windows PowerShell

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

Служба (service) — это процесс, который запускается на устройстве в фоновом режиме для выполнения определенных действий в ответ на запросы пользователей, приложений, системы.

Состав имеющихся в наличии и запущенных служб зависит от версии операционной системы и установленных в ней приложений.

Основным инструментом для управления службами в графическом режиме на локальном компьютере является консоль Службы, которая находится в программной группе Средства администрирования Windows. Запустить консоль Службы также можно выполнив команду services.msc в диалоговом окне Выполнить. Также в состав всех версий операционной системы Windows, входит стандартная утилита net.exe командного интерпретатора cmd.exe, в которой для управления службами предусмотрены команды net start и net stop.

Как просмотреть список служб в Windows PowerShell

Запустите консоль Windows PoweShell с административными привилегиями.
Чтобы получить список служб зарегистрированных на локальном компьютере, используйте командлет:

Get-Service

На скриншоте ниже видно, что по умолчанию отображаются имя службы (колонка Name), её отображаемое имя (колонка DisplayName) и состояние (колонка Status).

Для того чтобы отобразить только работающие в данный момент службы, то нужно отфильтровать объекты, у которых значением свойства Status является строка «Running». Для этого выполните команду:

Get-Service | Where-Object {$_.Status -eq «Running»}

Чтобы просмотреть службы зарегистрированные на удалённом компьютере, можно воспользоваться WMI классом Win32_Service. Если с помощью командлета Select-Object получить свойства State, Name, и DisplayName объекта Win32_Service, то формат выводимых данных будет похож на формат вывода командлета Get-Service. Например:

Get-WmiObject -Class Win32_Service -ComputerName winnoteRU | Select-Object -Property State, Name, DisplayName

Как остановить или приостановить службы в Windows PowerShell

Локальную службу можно остановить с помощью командлета Stop-Service. Параметр -Name задает имя службы для остановки, параметр -Force позволяет остановить указанную службу вместе со всеми службами зависящими от нее. Например следующая команда остановит службу Spooler (Диспетчер печати) со всеми зависящими от нее службами:

Stop-Service -Name Spooler -Force

По умолчанию команлет Stop-Service не передает далее по конвейеру объекты, соответствующие останавливаемым службам, и поэтому на экране ничего не отображается. Для остановки служб с выводом информации нужно указать параметр -PassThru, например выполните команду:

Stop-Service -Name Spooler -Force -PassThru

Командлет Suspend-Service позволяет приостановить работу одной или нескольких служб, имена которых задаются в качестве параметра -Name. При приостановке (временной остановке) службы, она продолжает выполняться, однако её действия приостанавливаются до поступления команды на возобновление работы.
Также следует учитывать, что не всякую службу можно приостановить.
У объектов System.ServiceProcess.ServiceController, соответствующих службам, имеется логическое свойство CanPauseAndContinue, которое равно $True, если служба может быть приостановлена. Следующая команда приостановит все службы, для которых это возможно:

Get-Service | Where-Object {$_.CanPauseAndContinue} | Suspend-Service -PassThru

Для остановки или приостановки служб на удалённом компьютере можно воспользоваться соответственно методами StopService и PauseService WMI-класса Win32_Service.

Как запустить или перезапустить службу в Windows PowerShell

Запустить службу на локальном компьютере можно с помощью командлета Start-Service. В качестве значения параметра Name указывается имя запускаемой службы. Как и в предыдущих командлетах *-Service, после запуска службы на экран не выводится никакого сообщения. Для вывода информации можно использовать параметр -PassThru. Например, следующая команда запускает службу WSearch (служба индексирования контента) и выводит на экран информацию об этой службе:

Start-Service -Name Wsearch -PassThru

Командлет Restart-Service выполняет перезапуск (то есть остановку и последующий запуск) служб, указанных в качестве значения параметра -Name или полученных по конвейеру. Например, следующая команда перезапустит службу NetSetupSvc (Служба настройки сети):

Get-Service -Name NetSetupSvc | Restart-Service

Как изменить параметры службы

В Windows PowerShell имеется командлет Set-Service, позволяющий редактировать некоторые параметры служб, такие как, отображаемое имя (параметр -DisplayName), описание (параметр -Description), и тип запуска (параметр -StartupType).Возможные значения параметра -StartupType: Automatic (служба запускается автоматически), Manual (служба запускается вручную), или Disabled (служба отключена). Имена изменяемых служб указываются в качестве значения -Name.

Следует отметить, что ни описание службы, ни тип запуска не являются свойствами объектов System.ServiceProcess.ServiceController, возвращаемых командлетом Get-Service. Это значит что командлет Get-Service не позволяет проверить чему равны значения данных параметров для определенной службы. Решить эту проблему можно с помощью WMI-класса Win32_Service, который имеет свойства Description (описание службы) и StartMode (режим запуска службы). Теперь посмотрим, например, чему равно значение этих свойств для службы WSearch (служба индексирования контента):

Get-WmiObject Win32_Service -Filter «name = \’WSearch\'» | fl StartMode, Description

Выведенная информация показывает что служба индексирования контента запускается автоматически (значение свойства StartMode равно Auto).

Теперь с помощью командлета Set-Service изменим режим запуска службы индексирования контента с автоматического на ручной, для этого выполните команду:

Set-Service -Name WSearch -StartupType Manual

Проверим проделанные изменения с помощью объекта Win32_Service, для этого выполните следующую команду:

Get-WmiObject Win32_Service -Filter «name = \’WSearch\'» | fl Name, StartMode

Значение свойства StartMode успешно изменено.

Чтобы удалить службу, нужно использовать средство настройки диспетчера служб sc.exe, о том как это сделать, читайте в статье Как удалить службу в Windows 10

Рестарт IIS через PowerShell » Pechenek.NET

Рестарт IIS + PowerShell + Task Scheduler. Связка весьма замечательная, особенно, когда в случае неудачного запуска высылается письмо на почту. В этой статье мы с вами научимся перезапускать Internet Information Service.

Рестарт IIS через PowerShell

Вопрос главный, но не единственный: зачем ребутать iis? А затем, что иногда в веб-приложениях появляются ошибки, которые правятся только ребутом IIS-a. Конечно, еще некоторые изменения веб-конфигов могут потребовать перезапуска. Но в моей практике возникали именно ошибки, которые решались путем перезапуска. Я решил пойти простым способом, воспользовавшись командой iisreset, но далее я подумал: “А что если iis не запустится? Как я об этом узнаю?” сразу же я пришел к тому, что необходимо делать проверку.

Так как PowerShell не возвращает результат выполнения скрипта, то есть неизвестно с ошибками он выполнился или без, нужен был какой-то критерий, по которому можно отслеживать успешный результат. В итоге я решил ссылаться на одну единственную фразу, которая имеете в ряде строк при успешном перезапуске IIS – Internet services successfully restarted. Соответственно, мне необходимо реализовать проверку и в случае отрицательного результата, я решил воспользоваться способом оповещения через письмо, который описал в этой статье. Плюс ко всему, если понадобится скалировать скрипт на несколько серверов, я бы хотел знать, на котором возникла проблема. Приступим к реализации:

Первым делом получим имя сервера:
$server = hostname

Далее вобьем в переменную команду перезапуска IIS:
$iisr = iisreset

После чего, добавим переменную, которая будет в себе содержать искомое значение:
$equals = “Internet services successfully restarted”

Отлично, теперь необходимо добавить проверку. Мы знаем, что в одной из четырех строк, которые выводятся как результат выполнения команды имеется и наша строка из переменной $equals. Соответственно мы будем проверять текст, следующим образом:

$Final = echo $iisr.Contains($equals)

Проверка реализована, едем дальше. Так как у нас есть условие для отправки письма, будет логично заранее подумать о том, что у нас появится if. Но предварительно нам необходимо задать настройки для адреса, на который отправлять письмо и адреса, с которого отправлять письмо:
$EmailFrom = “[email protected]
$EmailTo =”[email protected]

Пришло время добавить условия отправки письма:

if ($Final -ne “True”)

Итог:

Соответственно в теле нужно выполнить отправку письма. В переменной $Final мы получим значение либо True, либо False, поэтому в условии мы указываем, что письмо необходимо отправлять в том случае, если в переменной Final значение равно False. ПыСы: условие еще можно написать так: if ($Final -eq “False”) – эквивалентно первому варианту.

В целом, весь скрипт выглядит так:

#Restart iis and searching contains# $server=hostname $iisr = iisreset $equals = «Internet services successfully restarted» $Final = echo $iisr.Contains($equals) ##$Final must be True #SMTP Settings# $EmailFrom=»[email protected]» $EmailTo=»[email protected], [email protected]» if ($Final -ne «True») { $Subject=»$server iisreset failed» $Body=»One of IIS instanses is not restarted. Please login on $server and see the outlog.» $SmtpServer=»postserv.domain.ru» $smtp=New-Object net.mail.smtpclient($SmtpServer) $smtp.Send($EmailFrom, $EmailTo, $Subject, $Body) }

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

#Restart iis and searching contains#

$server=hostname

$iisr = iisreset

$equals = «Internet services successfully restarted»

 

$Final = echo $iisr.Contains($equals) ##$Final must be True

 

#SMTP Settings#

$EmailFrom=»[email protected]»

$EmailTo=»[email protected], [email protected]»

 

if ($Final -ne «True»)

{

$Subject=»$server iisreset failed»

$Body=»One of IIS instanses is not restarted. Please login on $server and see the outlog.»

$SmtpServer=»postserv.domain.ru»

$smtp=New-Object net.mail.smtpclient($SmtpServer)

$smtp.Send($EmailFrom, $EmailTo, $Subject, $Body)

}

Кстати, если перезапуск IIS был успешен, то никаких отчетов не высылается. Подписывайтесь на нашу группу ВК и YouTube-канал!

Командлет перезапуска службы PowerShell | Службы Windows

Служба перезапуска Windows PowerShell

Самый эффективный способ для PowerShell вылечить зависшую службу — использовать команду «перезапустить». Restart-Service xyz просто проще и эффективнее, чем stop-Service xyz, за которым следует start-Service xyz. Если вы новичок в PowerShell Restart-Service, я предлагаю вам начать со страницы Get-Service.

Темы для PowerShell Restart-Service

Пример 1. Как перезапустить службу

Служба, которая больше всего выигрывает от Restart-Service, — это «Spooler».Причина в том, что принтер доставляет больше проблем, чем любое другое оборудование, и часто перезапуск диспетчера очереди печати решает проблему. Низкий, но безжалостный метод устранения таких застреваний в принтере — это перезагрузка компьютера. Когда компьютер также является файловым сервером, этот прием нежелателен.

Production Script

Все, что вам действительно нужно, это простая команда:

# PowerShell Restart-Service example
Restart-Service «Spooler»

Note 1: Вы можете изменить «Spooler» на имя другой службы.Чтобы просмотреть список служб, см. PowerShell Get-Service

Comprehensive Restart-Service Script

# Командлет PowerShell для перезапуска службы диспетчера очереди печати
Clear-Host
$ SrvName = «Spooler»
$ ServicePrior = Get-Service $ SrvName
«$ srvName is «+ $ servicePrior.status
Set-Service $ SrvName -startuptype manual
Restart-Service $ srvName
$ ServiceAfter = Get-Service $ SrvName
» $ SrvName теперь «+ $ ServiceAfter.status
Set-Service $ SrvName -startuptype automatic

Learning Points

Note 2: Мое самое большое опасение состоит в том, что в производственном скрипте я неправильно напишу имя службы.Таким образом, проверьте успешность, наблюдая за этим системным сообщением:

ПРЕДУПРЕЖДЕНИЕ: Ожидание завершения работы службы «Диспетчер очереди печати (диспетчер очереди печати)»…

Примечание 3: В зависимости от того, какую операционную систему вы используете, будут различия.

Guy рекомендует: Бесплатная пробная версия Network Performance Monitor (NPM) v11.5

SolarWinds Network Performance Monitor поможет вам узнать, что происходит в вашей сети. Эта утилита также поможет вам в устранении неполадок; на приборной панели будет указано, является ли основная причина неисправной ссылкой, неисправным оборудованием или перегрузкой ресурсов.

Что мне больше всего нравится, так это то, как NPM предлагает решения сетевых проблем. Он также имеет возможность отслеживать состояние отдельных виртуальных машин VMware. Если вы заинтересованы в устранении неполадок и создании сетевых карт, я рекомендую вам попробовать NPM прямо сейчас.

Загрузите бесплатную пробную версию монитора производительности сети Solarwinds

Пример 2. Избегайте ловушки имени или DisplayName

Что в имени? Что общего у этих групп услуг?

Group A
Alerter, Messenger, WebClient

Group B
Print Spooler, Telnet, Telephony и Windows Time

Что еще более важно, почему семейство служб PowerShell не взаимодействует с Group B?

Ответ: Некоторые службы имеют «Отображаемое имя», которое отличается от их «Имя службы», например Telnet и Tlnsvr.Как я это узнал? Когда я попытался запустить «Telnet» или «Диспетчер очереди печати», ничего не произошло. Но если бы у меня был ручной обход в сервисном графическом интерфейсе, не было бы проблем. Затем я запустил Get-Service * и посмотрел на два столбца: «Имя» и «Отображаемое имя». В замешательство меня привела группа А, где оба названия совпадают.

Чтобы подчеркнуть, что если вы хотите использовать имя «Диспетчер очереди печати», вам необходимо указать свойство -DisplayName.

# Пример PowerShell Restart-Service с использованием displayName
Restart-Service -displayName «Print Spooler»

Note 4: Вы можете исследовать имена и displayNames с помощью Get-Service.

Пример 3: Как просто запустить службу Windows

В дни Windows Server 2003 я выбираю службу Alerter для тестирования отчасти потому, что это относительно безобидная служба, а отчасти потому, что ее название находится в верхней части списка! Однако, поскольку он был удален из Windows 7 и Server 2008, я выбрал PLA (журналы производительности и предупреждения) для тестирования служебных командлетов PowerShell.

Предварительный скрипт

Давайте проверим статус службы, а также позвольте нам «разогреться» с Get-Service, прежде чем нанимать других членов семейства служб.

# Командлет PowerShell для проверки статуса службы
$ srvName = «PLA»
$ servicePrior = Get-Service $ srvName
$ srvName + «is now» + $ servicePrior.status

Очков обучения

Примечание 5: Я решил ввести переменную $ srvName для хранения значения службы. Надеюсь, это подчеркнет название службы и побудит вас изменить его, если это необходимо для вашего проекта.

Примечание 6: Обратите внимание, как я смешиваю «буквальные фразы» с переменными и свойствами $, чтобы получить значимый результат.

Guy рекомендует: SolarWinds Free Wake-On-LAN Utility

Спящий режим компьютеров, когда они не используются, — отличная идея — пока вы не отойдете от своего рабочего стола и вам понадобится файл на этой удаленной спящей машине!

WOL также используется в бизнесе, например, для пробуждения компьютеров, чтобы к ним можно было применить исправления обновлений. Моя настоящая причина, по которой я рекомендую вам загрузить этот бесплатный инструмент, заключается в том, что отправлять эти «волшебные пакеты» очень весело. Попробуйте WOL — это бесплатно.

Загрузите бесплатную копию SolarWinds Wake-On-LAN

Главное событие — запуск PLA

Windows 7 и Server 2008 (и более поздние версии) не имеют службы предупреждений, поэтому теперь я использую PLA (журналы производительности и Alerts) для тестирования службы запуска PowerShell.

# Командлет PowerShell для запуска именованной службы
$ srvName = «PLA»
$ servicePrior = Get-Service $ srvName
«$ srvName is now» + $ servicePrior.status
Set-Service $ srvName -startuptype manual
Start- Service $ srvName
$ serviceAfter = Get-Service $ srvName
«$ srvName is now» + $ serviceAfter.status

Очков обучения

Примечание 7: Обратите внимание на то, как речевые знаки немного отличаются в этом скрипте по сравнению с предыдущим:
«$ srvName is now» + $ servicePrior.status
по сравнению с
$ srvName + теперь «+ $ servicePrior.status

Мои баллы:
а) Экспериментируйте сами.
б) В некоторой степени эти учебные сценарии оставляют следы моего мыслительного процесса.

Примечание 8: Я подготовил приведенный выше сценарий, чтобы помочь вам оценить факторы, необходимые для управления службой Windows.Это также отражает мой процесс мышления о том, как я узнаю о команде. С другой стороны, для производственного сценария вы можете применить гораздо более безжалостный подход и упростить сценарий следующим образом:

Set-Service PLA -startuptype manual
Start-Service PLA

Мониторинг вашей сети с помощью анализатора трафика в реальном времени

Основная причина для мониторинга вашей сети — убедиться, что все ваши серверы доступны. Если есть проблема с сетью, вы хотите, чтобы интерфейс сразу отображал масштаб проблемы.

Даже когда доступны все серверы и маршрутизаторы, рано или поздно вам будет любопытно узнать, кто или что ограничивает пропускную способность вашей драгоценной сети. Графический интерфейс, показывающий 10 лучших пользователей, делает интересным чтение.

Еще одна причина для мониторинга сетевого трафика — узнать больше о времени отклика вашего сервера и использовании ресурсов. Чтобы облегчить захват кадров и анализ необработанных данных, Гай рекомендует загрузить копию SolarWindsfree Real-time NetFlow Analyzer.

Пример 4: Как остановить службу

В реальной жизни вам может понадобиться сценарий, который гарантирует остановку таких служб, как Telnet, Messenger, а также маршрутизация и удаленный доступ. Просто для тестирования вам может понадобиться сценарий, который меняет start-Service, просто чтобы убедиться, что он действительно работает так, как задумано. В любом случае, вот сценарий, который останавливает службу, определенную $ srvName.

# Командлет PowerShell для остановки службы Plug & Play
$ srvName = «PLA»
$ servicePrior = Get-Service $ srvName
«$ srvName is now» + $ servicePrior.status
stop-Service $ srvName
$ serviceAfter = Get-Service $ srvName
set-Service $ srvName -startuptype disabled
«$ srvName is now» + $ serviceAfter.status

Очков обучения

Примечание 9: Понаблюдайте, как этот сценарий является зеркальным отображением сценария Start-Service. Он даже отключает службу после ее остановки. Если вы помните, когда Пример 1 хотел запустить службу, он должен сначала убедиться, что для -startuptype установлено значение manual.

Семейство «-Service» (каждый член имеет свой глагол)

Clear-Host
Get-Command -Noun Service

Get-Service: полезно для перечисления служб
Set-Service: ключевой параметр -startuptype
Start -Service: глагол «start» говорит само за себя.
Stop-Service: удобно для сценариев, предотвращающих запуск нежелательных служб. E.г. Telnet
Restart-Service: приятный штрих от создателя PowerShell; этот командлет устраняет необходимость явно останавливать, а затем запускать службу.

Guy рекомендует: SolarWinds Engineer’s Toolset v10

Этот Engineer’s Toolset v10 предоставляет комплексную консоль из 50 утилит для устранения проблем с компьютером. Гай говорит, что это помогает мне отслеживать, что происходит в сети, и каждый инструмент учит меня больше о том, как работает основная система.

Есть так много хороших гаджетов; это все равно, что получить полную свободу действий в кондитерской.К счастью, утилиты отображаются логично: мониторинг, обнаружение сети, диагностика и инструменты Cisco. Попробуйте набор инструментов SolarWinds Engineer прямо сейчас!

Загрузите полнофункциональную пробную копию Engineer’s Toolset v10

Удаленное взаимодействие с помощью службы PowerShell

Один из аспектов удаленного взаимодействия в PowerShell v 2.0 — просто добавить -computerName xyz к команде, выполняемой на локальном компьютере. Для дальнейшего исследования попробуйте:

Clear-Host
Get-Command | где {$ _.parameters.keys -Contains «ComputerName»}

Сюрприз! Get-Service входит в число

.

Запуск, остановка и перезапуск удаленных служб с помощью PowerShell | Изучите Powershell

Обычная задача, с которой системный администратор может столкнуться в свое время, — это перезапуск службы в удаленной системе. Хотя это можно сделать с помощью Services.MSC или другого графического интерфейса пользователя, вам необходимо загрузить графический интерфейс, затем подключиться к удаленной системе, найти службу и, наконец, выполнить действие с ней.

Это можно сделать несколькими способами, используя WMI (Win32_Services) и Get-Service вместе с командлетами Stop / Start / Restart-Service.

Использование WMI

Первый метод управления службой, который я рассмотрю, — это использование WMI для выполнения этой задачи. Сначала я подключусь к конкретной службе, которой я хочу управлять, в данном случае к клиентской службе обновления Windows: wuauserv .

 $ service = Get-WmiObject -ComputerName DC1 -Class Win32_Service `
-Фильтр "Name = 'wuauserv'"
$ обслуживание 

Теперь у нас есть объект службы WMI для wuauserv.Давайте посмотрим на все доступные методы для этого объекта.

 $ Сервис | Get-Member -Type Метод 

В этой статье нас больше всего интересуют методы StartService () и StopService () .

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

Обратите внимание на свойство ReturnValue , которое возвращается здесь после вызова метода Stop (). 0 означает, что метод остановки был успешным. Для получения дополнительной информации о других возвращаемых значениях посетите эту страницу msdn.

К сожалению, объект WMI не является динамическим, и у него нет возможности обновить объект, чтобы увидеть, сработал ли Stop. При этом нам нужно снова выполнить запрос.

 $ service = Get-WmiObject -ComputerName DC1 -Class Win32_Service `
-Фильтр "Name = 'wuauserv'"
$ обслуживание 

Как видите, служба остановлена.Так же просто запустить службу с помощью метода StartService () , как показано ниже:

 $ service.StartService ()
$ service = Get-WmiObject -ComputerName DC1 -Class Win32_Service `
-Фильтр "Name = 'wuauserv'"
$ обслуживание 

Опять же, код возврата — 0, значит, мы знаем, что он начался успешно. Более подробную информацию о других кодах возврата для метода Start можно найти здесь.

Другой способ использовать WMI для запуска / остановки служб — это Invoke-WMIMethod.

Invoke-WMIMethod

Командлет Invoke-WMIMethod можно использовать для выполнения того же типа действия, что и с помощью Get-WMIObject и вызова метода объекта службы.

 Invoke-WmiMethod -Path "Win32_Service.Name = 'wuauserv'" `
-Name StopService -Computername DC1 

Обратите внимание, что возвращаемый объект при использовании Invoke-WMIMethod точно такой же, как и метод, который мы использовали ранее.

Использование существующих командлетов: Get-Service, Stop / Start / Restart-Service

Одна из приятных вещей, которые PowerShell может делать как локально, так и удаленно, — это запрашивать службу с помощью командлета Get-Service.

 $ service = get-service -ComputerName dc1 -Name wuauserv
$ обслуживание 

Работает так же, как метод WMI, но возвращает другой объект: System.ServiceProcess.ServiceController

Давайте посмотрим на некоторые методы, доступные из этого объекта:

 $ обслуживание | Get-Member -Type Метод 

Как и объект WMI, у нас есть методы Start () и Stop () , которые мы можем использовать для управления объектом службы. Но если вы присмотритесь, мы также увидим объект Refresh () . Хотя у нас есть та же проблема, когда объект не обновляется автоматически при изменении состояния, он позволяет нам обновить объект и показать нам новое состояние без выполнения другого запроса.

 $ service.Start ()
$ service.Refresh ()
$ обслуживание 

Как вы можете заметить, это работает довольно хорошо, хотя мы не получаем код возврата какого-либо типа, чтобы сообщить нам, сработало это или нет.

Хорошо, я упомянул, что вы также можете использовать Start / Stop / Restart-Service для выполнения тех же действий службы? Но если вы посмотрите на параметры, вы не увидите параметр –Computername, который так часто встречается в командлетах, разрешающих удаленные подключения, например Get-Service.

 Get-Help Get-Service -Parameter Computername
Get-Help Start-Service -Parameter Computername
Get-Help Stop-Service -Parameter Computername
Get-Help Restart-Service -Parameter Computername 

Итак, как мы можем использовать эти командлеты для управления состоянием удаленной службы, если нет параметра –Computername? К счастью, у командлетов есть параметр –InputObject, который позволяет нам предоставить объект службы, даже если это удаленный объект для управления состоянием службы.

 Get-Help Start-Service -Parameter InputObject
Get-Help Stop-Service -Parameter InputObject
Get-Help Restart-Service -Parameter InputObject 

Давайте остановим службу Wuauserv:

 Stop-Service -InputObject $ service -Verbose
$ service.Refresh ()
$ обслуживание 

Сейчас снова запущу:

 Start-Service -InputObject $ service -Verbose
$ service.Refresh ()
$ обслуживание 

Теперь кое-что, что мы вообще не могли сделать с WMI или Системой.Объект ServiceProcess.ServiceController легко выполняет перезапуск службы без вызова метода Stop, а затем Start. Теперь мы можем использовать командлет Restart-Service для выполнения этой задачи.

 Restart-Service -InputObject $ service -Verbose
$ service.Refresh ()
$ обслуживание 

И, конечно же, вы можете легко пропустить их через конвейер без каких-либо усилий.

 Get-Service -ComputerName dc1 -Name wuauserv | Stop-Service -Verbose
Get-Service -ComputerName dc1 -Name wuauserv | Start-Service -Verbose
Get-Service -ComputerName dc1 -Name wuauserv | Restart-Service-Verbose 

Заключение

Итак, как вы видите, есть несколько способов, которыми вы можете управлять состоянием удаленной службы с минимальными усилиями или вообще без них.В этом прелесть PowerShell в том, что существует несколько способов достижения одной и той же цели, и все это можно сделать очень легко!

Нравится:

Нравится Загрузка …

Связанные

.

PowerShell Как я могу перезапустить службу автоматически?

Переполнение стека
  1. Около
  2. Продукты
  3. Для команд
  1. Переполнение стека Общественные вопросы и ответы
  2. Переполнение стека для команд Где разработчики и технологи делятся частными знаниями с коллегами
  3. Вакансии Программирование и связанные с ним технические возможности карьерного роста
  4. Талант Нанимайте технических специалистов и создавайте свой бренд работодателя
  5. Реклама Обратитесь к разработчикам и технологам со всего мира
  6. О компании

Загрузка…

  1. Авторизоваться зарегистрироваться
  2. текущее сообщество

.

Сценарий Powershell для перезапуска службы

Переполнение стека
  1. Около
  2. Продукты
  3. Для команд
  1. Переполнение стека Общественные вопросы и ответы
  2. Переполнение стека для команд Где разработчики и технологи делятся частными знаниями с коллегами
  3. Вакансии Программирование и связанные с ним технические возможности карьерного роста
  4. Талант Нанимайте технических специалистов и создавайте свой бренд работодателя
  5. Реклама Обратитесь к разработчикам и технологам со всего мира
  6. О компании

Загрузка…

.

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

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