- PowerShell: Как остановить, запустить и перезапустить службу
- Как управлять службами в Powershell командлетами Service
- Получение списка служб
- Остановка, перезапуск и запуск служб
- Восстановление и приостановка работ служб
- Изменение с Set-Service
- Создание сервисов с New-Service
- Получение с помощью WMI класса
- Изменение с помощью WMI класса
- Управление службами Managing Services
- Получение служб Getting Services
- Получение необходимых и зависимых служб Getting Required and Dependent Services
- Остановка, запуск, приостановка и перезапуск служб Stopping, Starting, Suspending, and Restarting Services
- Задание свойств служб Setting Service Properties
PowerShell: Как остановить, запустить и перезапустить службу
Большинство пользователей боятся консоли и команд, отдавая предпочтение в сторону графического интерфейса, но я не такой, я люблю автоматизацию .\
Регулярно приходится приходится что-то автоматизировать и что-то перезапускать. Так что без PowerShell я как без рук.
Сегодня хочу поговорить о службах Windows, остановка запуск и перезапуск будет выполняться средствами PowerShell.
И так на сегодня наш комендлет «Get-Service».
И так первым делом отобразим список всех служб Windows, для этого достаточно выполнить:
Данный командлет выведет список всех служб их статус и имя
Дальше усложняем задачу, выведем все службы, которые запущенны:
Будет как-то так
С командлетом «Get-Service», пока все, а дальше будем Запускать останавливать и перезапускать используя Start-Service, Stop-Service, Restart-Service. Какой для чего думаю не стоит объяснять .
Давайте попробуем остановить службу по имени BITS или отображаемому имени «Background Intelligent Transfer Service»
В Windows есть имя и Экранное имя, первое короткое и занимает мало букв, второе это отображаемый синоним, т.е. полное наименование, лично я предпочитаю пользоваться коротким именем сервиса.
Запустить и перезупустсть можно антологичным способом
Отобразить текущий статус службы можно так:
Как управлять службами в Powershell командлетами Service
30 сентября 2019
Для управления службами в Powershell есть восемь команд с помощью которых мы можем контролировать весь процесс работы сервисов и создавать новые. Что бы увидеть весь список команд созданных в PS для работы с сервисами нужно выполнить:
Мы увидим следующие командлеты:
- Get-Service — получение списка служб в Powershell.
- New-Service — создание нового сервиса.
- Restart-Service — перезапуск службы.
- Resume-Service — восстанавливает работу остановленного сервиса.
- Set-Service — изменение настроек.
- Start-Service — запуск службы в Powershell.
- Stop-Service — остановка.
- Suspend-Service — приостановка работы (пауза).
Учитывайте, что в виде команд делается не полное управление сервисами. Например удаление делается через WMI, которое тоже будут рассмотрены.
Навигация по посту
Получение списка служб
Узнать статус всех служб можно так:
Каждый результат выдаваемый командами в PS представляет собою объект. Этот объект содержит разные свойства и методы. Свойства — это например имя или статус. По умолчанию мы видим не все свойства. Что бы узнать какие еще свойства есть у команды нужно выполнить следующее:
Часть свойств реализована в виде ключей. Попробуем вывести сразу все свойства всех сервисов, но в таком случая вывод будет сложно читаемый:
Возможно вывести только имена, статус и тип запуска:
Или выведем информацию по одному сервису:
У сервисов есть короткое имя и отображаемое. Так мы выведем оба:
В именах мы можем использовать маски, а это значит что мы можем не знать полное название и использовать знак * в том месте, где не уверены в названии или написании:
Не желательно указывать отображаемое имя так как язык операционных систем может быть разным и если вы выполняете командлеты удаленно, вероятно будут ошибки:
- Cannot find any service with service name
- Cannot find any service with display name
- Не удается найти службу с отображаемым именем
Кроме этого есть два ключа, которые тоже поддерживают маски:
- Include — включают поиск по какой-то маске или точному соответствию.
- Exclude — исключает упоминание.
Можно сравнить разницу с прошлым примером:
У сервисов несколько статусов:
- Running — запущен.
- Stopped — остановлен.
- Paused — приостановлен (пауза).
По каждому из них мы можем отфильтровать результат:
Кроме этого есть 3 типа запуска:
- Automatic — автоматический запуск вместе с системой.
- AutomaticDelayedStart — запуск после загрузки системы.
- Manual — ручной запуск.
- Disabled — отключенный.
Допустим, что у нас есть какая-то проблема в операционной системе и мы хотим проверить все сервисы, который автоматически запускаются при включении ОС. Для этого нам нужно использовать несколько условий, где статус не равен Running и тип запуска равен Automatic:
Службы могут быть зависимы от других и для проверки этих свойств есть два параметра:
- DependentServices — кто зависит от этого сервиса.
- RequiredServices — от кого зависит этот сервис.
Аналогично параметрам команды выше есть свойства DependentServices и ServicesDependedOn (RequiredServices). Они выводят одно и то же.
Есть несколько свойств, которые не выведены в параметры — это:
- CanPauseAndContinue — можно ли приостановить работу сервиса и возобновить.
- CanShutdown — может ли быть выключен.
- CanStop — может ли быть полностью остановлен.
Эти свойства так же можно увидеть в GUI. В командлете ниже я использую алиас gsv (короткое имя Get-Service):
Каждая команда PS, где присутствует параметр ComuterName, может быть выполнена удаленно. Для удаленного управления в Powershell нужны дополнительные настройки, которые уже описывались в предыдущей статье.
Имена всех компьютеров, с которых мы хотим получить имена сервисов, можно указать через запятую:
Как отослать сообщение через Powershell
Остановка, перезапуск и запуск служб
Чтобы в Powershell запустить службу и остановить достаточно указать только имя. Причем можно указывать как короткое и отображаемое имя:
Можно выполнить получение, остановку и запуск в одну команду:
Во большинстве командлетах PS, которые делают изменения, можно увидеть два параметра. Первый — это WhatIf, который покажет результат выполнения командлета, но не попытается ее выполнить. Такие параметры удобно использовать при выполнении сложных задач типа кластеров. Второй параметр Confirm, который потребует подтверждение перед выполнением. Вместе эти параметры не работают:
В запуске и остановке так же можно использовать параметры фильтрации, которые вы видели при получении статусов выше. Будьте осторожны перед выполнением так как вы можете остановить все службы:
Если с сервисом работает другой сервис, то мы не завершим его работу и нужно указать дополнительный ключ 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) и запустил их, а затем запустил требуемый:
Перезапуск сервисов работает так же со всеми параметрами:
Удаленный запуск и остановка командлетами не предусмотрена, но это исправляется стандартными методами:
Восстановление и приостановка работ служб
Не каждую службу можно приостановить (Pause) и восстанавливть. Что бы увидеть все службы, у которых есть такая возможность, выполните:
Командой ниже мы получи, нажмем паузу и восстановим работу сервиса Winmgmt:
Ошибки, если мы попытаемся остановить службу у которых нет такой возможности:
- Service ‘Windows Remote Management (WS-Management)’ cannot be suspended because the service does not support beingsuspended or resumed.
- Не удается приостановить службу «Spooler», так как этой службой не поддерживается приостановка или возобновление.
В этих командах так же можно использовать параметры Include и Exclude, с масками.
На скрипте ниже показана проверка возможности приостановки сервиса, если у него есть такая возможность. Если ее нет, то сервис остановит свою работу:
Изменение с Set-Service
Командлетом ниже я изменил тип запуска сервиса с отключенного на автоматический:
В случае изменения сервисов нельзя использовать маски *.
В документации Microsoft говориться про возможность изменения на четыре режима со следующими названиями:
- Automatic
- AutomaticDelayedStart
- Disabled
- Manual
Во первых половина называется иначе и изменение не срабатывает. Возможно изменение не срабатывает из-за багов Windows Server 2019,может из-за зависимостей (в GUI все работает), но скорее всего дело в PS. При работе с WMI все срабатывает. Реальные варианты запуска такие:
Через эту команду можно так же выполнить запуск и остановку:
Все возможные значения:
Можно изменить описание сервиса:
Команды изменения можно выполнять удаленно:
Создание сервисов с New-Service
Для создания сервиса необходимо указать два параметра — это имя и путь до бинарного файла:
В PS 5.1 не предусмотрена команда удаления, она появилась в версии 6.1, которая устанавливается отдельно и может работать иначе. Для удаления сервисов, а так же частичного изменения, используется WMI. Указывайте все возможные параметры, что бы в последующем не лезть в WMI.
Параметры, которые в последующем нельзя будет изменить через PS:
- DisplayName — полное отображаемое имя.
- Credential — учетная запись, под которой будет происходить запуск.
- DependsOn — от кого будет зависеть.
При объявлении переменной $credential у нас запросятся учетные данные (логин/пароль). По умолчанию сервис работает под текущим аккаунтом. Я создавал сервис на доменном компьютере и пока я не ввел FQDN вид user@domain.local я получал ошибку:
- 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 — тип запуска.
Получение с помощью WMI класса
За работу со службами в WMI отвечает класс win32_service. Преимущества такого подхода в том, что тут можно посмотреть и изменить все детали работы сервисов. Более подробно WMI в Powershell мы уже рассматривали.
Что бы получить список аналогичный Get-Service выполните:
В классе WMI можно увидеть больше свойств, которые можно использовать:
Одно из преимуществ использования в WMI это то, что мы можем увидеть идентификатор процесса под которым работает сервис. Если сервис остановлен, то его идентификатор 0. Так мы увидим идентификатор процесса с именем WinRM и получим всю информацию по процессу:
О том как работать с процессами в Powershell мы писали в прошлой статье.
С помощью WMI мы можем вернуть имя аккаунта, под которым запущена служба и ее описание. Используя параметр ComputerName это можно сделать удаленно на множестве компьютеров:
Изменение с помощью WMI класса
Для управления в WMI существую методы. Все методы класса можно получить так:
Удалим сервис, который создавался через New-Service:
Для изменения паролей нужно использовать следующую конструкцию. После выполнения команды сервис нужно перезапустить:
$null установлены у всех параметров, которые мы не хотим изменять. В нашем случае нужно изменить только логин и пароль и они указаны в переменных. Увидеть какие параметры не меняются с $null можно так:
Управление службами Managing Services
Существует восемь основных командлетов Service, предназначенных для широкого спектра задач обслуживания. There are eight core Service cmdlets, designed for a wide range of service tasks . Мы рассмотрим только вывод списка служб и изменение состояния их выполнения, но вы можете получить весь список командлетов Service с помощью Get-Help \*-Service , а сведения о каждом из них можно просмотреть с помощью командлета Get-Help , например Get-Help New-Service . We will look only at listing and changing running state for services, but you can get a list of Service cmdlets by using Get-Help \*-Service , and you can find information about each Service cmdlet by using Get-Help , such as Get-Help New-Service .
Получение служб Getting Services
Получить службы на локальном или удаленном компьютере можно с помощью командлета Get-Service . You can get the services on a local or remote computer by using the Get-Service cmdlet. Как и в случае с Get-Process , использование команды Get-Service без параметров возвращает все службы. As with Get-Process , using the Get-Service command without parameters returns all services. Можно фильтровать по имени, даже используя звездочку как подстановочный знак: You can filter by name, even using an asterisk as a wildcard:
Так как реальное имя службы не всегда очевидно, может потребоваться найти службы по отображаемому имени. Because it is not always obvious what the real name for the service is, you may find you need to find services by display name. Это можно сделать с использованием определенного имени, подстановочных знаков или списка отображаемых имен: You can do this by specific name, using wildcards, or using a list of display names:
Параметр ComputerName командлета Get-Service можно использовать для получения служб на удаленных компьютерах. You can use the ComputerName parameter of the Get-Service cmdlet to get the services on remote computers. Параметр ComputerName принимает несколько значений и подстановочные знаки, что позволяет получить службы на нескольких компьютерах с помощью одной команды. The ComputerName parameter accepts multiple values and wildcard characters, so you can get the services on multiple computers with a single command. Например, приведенная ниже команда получает службы на удаленном компьютере Server01. For example, the following command gets the services on the Server01 remote computer.
Получение необходимых и зависимых служб Getting Required and Dependent Services
Командлет Get-Service имеет два параметра, которые удобно использовать при администрировании служб. The Get-Service cmdlet has two parameters that are very useful in service administration. Параметр DependentServices получает службы, которые зависят от данной службы. The DependentServices parameter gets services that depend on the service. Параметр RequiredServices получает службы, от которых зависит данная служба. The RequiredServices parameter gets services upon which this service depends.
Эти параметры просто отображают значения свойств DependentServices и ServicesDependedOn (псевдоним RequiredServices) объекта System.ServiceProcess.ServiceController, возвращаемого Get-Service, но они упрощают работу с командами и получение этой информации. These parameters just display the values of the DependentServices and ServicesDependedOn (alias=RequiredServices) properties of the System.ServiceProcess.ServiceController object that Get-Service returns, but they simplify commands and make getting this information much simpler.
Приведенная ниже команда получает службы, необходимые службе LanmanWorkstation. The following command gets the services that the LanmanWorkstation service requires.
Приведенная ниже команда получает службы, которым требуется служба LanmanWorkstation. The following command gets the services that require the LanmanWorkstation service.
Вы даже можете получить все службы, имеющие зависимости. You can even get all services that have dependencies. Следующая команда делает именно это, а затем она использует командлет Format-Table для отображения свойств Status, Name, RequiredServices и DependentServices для служб на компьютере. The following command does just that, and then it uses the Format-Table cmdlet to display the Status, Name, RequiredServices and DependentServices properties of the services on the computer.
Остановка, запуск, приостановка и перезапуск служб Stopping, Starting, Suspending, and Restarting Services
Все командлеты Service имеют схожую общую форму. The Service cmdlets all have the same general form. Службы можно указать по общему имени или отображаемому имени, они также принимают списки и подстановочные знаки в качестве значений. Services can be specified by common name or display name, and take lists and wildcards as values. Для остановки очереди печати принтера используйте: To stop the print spooler, use:
Для запуска очереди печати принтера после ее остановки используйте: To start the print spooler after it is stopped, use:
Для приостановки очереди печати принтера используйте: To suspend the print spooler, use:
Командлет Restart-Service работает так же, как другие командлеты Service, но для него будет приведено несколько более сложных примеров. The Restart-Service cmdlet works in the same manner as the other Service cmdlets, but we will show some more complex examples for it. В самом простом случае указывается имя службы: In the simplest use, you specify the name of the service:
Вы получите повторяющееся предупреждение о запуске очереди печати принтера. You will notice that you get a repeated warning message about the Print Spooler starting up. При выполнении операции службы, занимающей некоторое время, Windows PowerShell сообщит, что по-прежнему пытается выполнить задачу. When you perform a service operation that takes some time, Windows PowerShell will notify you that it is still attempting to perform the task.
Если требуется перезапустить несколько служб, можно получить список служб, отфильтровать его и выполнить перезапуск: If you want to restart multiple services, you can get a list of services, filter them, and then perform the restart:
У этих командлетов Service нет параметра ComputerName, но их можно выполнить на удаленном компьютере с помощью командлета Invoke-Command. These Service cmdlets do not have a ComputerName parameter, but you can run them on a remote computer by using the Invoke-Command cmdlet. Например, приведенная ниже команда перезапускает службу очередь печати принтера на удаленном компьютере Server01. For example, the following command restarts the Spooler service on the Server01 remote computer.
Задание свойств служб Setting Service Properties
Командлет Set-Service изменяет свойства службы на локальном или удаленном компьютере. The Set-Service cmdlet changes the properties of a service on a local or remote computer. Так как состояние службы является свойством, этот командлет можно использовать для запуска, остановки и приостановки службы. Because the service status is a property, you can use this cmdlet to start, stop, and suspend a service. Командлет Set-Service также имеет параметр StartupType, позволяющий изменять тип запуска службы. The Set-Service cmdlet also has a StartupType parameter that lets you change the service startup type.
Чтобы использовать командлет Set-Service в Windows Vista и более поздних версиях Windows, откройте среду Windows PowerShell, используя параметр «Запуск от имени администратора». To use Set-Service on Windows Vista and later versions of Windows, open Windows PowerShell with the «Run as administrator» option.
Дополнительные сведения см. в статье о Set-Service. For more information, see Set-Service