В Windows вы можете управлять службами не только из графической консоли services.msc или утилиты командной строки Sc.exe (первоначальна включалась в пакет ресурсов Resource Kit), но и с помощью PowerShell. В этой статье мы смотрим различные сценарии управления службами Windows с помощью PowerShell.
Содержание[Скрыть]
Основные командлеты PowerShell для управления службами Windows
Существует восемь основных командлетов Service, предназначенных для просмотра состояния и управления службами Windows.
Чтобы получить весь список командлетов Service, введите команду:
1 |
Get-Help *-Service |
- Get-Service — позволяет получить службы на локальном или удаленном компьютере, как запущенные, так и остановленные;
- New-Service – создать службу. Создает в реестре и базе данных служб новую запись для службы Windows;
- Restart-Service – перезапустить службу. Передает сообщение об перезапуске службы через Windows Service Controller
- Resume-Service – возобновить службы. Отсылает сообщение о возобновлении работы диспетчеру служб Windows;
- Set-Service — изменить параметры локальной или удаленной службы, включая состояние, описание, отображаемое имя и режим запуска. Этот командлет также можно использовать для запуска, остановки или приостановки службы;
- Start-Service – запустить службу;
- Stop-Service – остановить службу (отсылает сообщение об остановке диспетчеру служб Windows);
- Suspend-Service приостановить службу. Приостановленная служба по-прежнему выполняется, однако ее работа прекращается до возобновления работы службы, например с помощью командлета Resume-Service.
Получить подробное описание и примеры использования конкретного командлета можно через Get-help:
1 |
Get-Help Start-Service |
Get-Service: получаем список служб и их состояние
Получить список и состояние (Running/Stopped) службы на локальном или удаленном компьютере можно с помощью командлета Get-Service. Параметр -Name позволяет делать отбор по имени службы. Имя службы можно задать с использованием подстановочного символа *.
Если вы не знаете точное имя службы, есть возможность найти службы по отображаемому имени с помощью параметра –DisplayName. Можно использовать список значений и подстановочные знаки.
Командлет Get-Service можно использовать для получения состояния служб на удаленных компьютерах, указав параметр -ComputerName. Можно опросить статус службы сразу на множестве удаленных компьютеров, их имена нужно перечислить через запятую. Например, приведенная ниже команда получает состояние службы Spooler на удаленных компьютерах RM1 и RM2.
1 |
Get-Service spooler –ComputerName RM1,RM2 |
1 2 3 4 |
Status Name DisplayName ------ ---- ----------- Running spooler Print Spooler Stopped spooler Print Spooler |
Вывести все свойства службы позволит командлет Select-Object:
1 |
Get-Service spooler | Select-Object * |
Командлет Select-Object позволит вывести определенные свойства службы. Например, нам нужно вывести имя, статус и доступные возможности службы Spooler:
1 |
Get-Service Spooler | Select DisplayName,Status,ServiceName,Can* |
Командлет Get-Service имеет два параметра, которые позволяют получить зависимости служб:
- Параметр -DependentServices позволяет вывести службы, которые зависят от данной службы;
- Параметр -RequiredServices позволяет вывести службы, от которых зависит данная служба.
Приведенная ниже команда выводит службы, необходимые для запуска службе Spooler:
1 |
Get-Service –Name Spooler -RequiredServices |
Следующая команда выводит службы, которые зависят от службы Spooler:
1 |
Get-Service –Name Spooler -DependentServices |
При необходимости найти службы с определенным состоянием или параметрами, используйте командлет Where-Object. Например, получим список запущенных служб со статусом Running:
1 |
Get-Service | Where-Object {$_.status -eq 'running'} |
Для вывода служб с типом запуска Manual, выполните команду
1 |
Get-Service | Where-Object {$_.starttype -eq 'Manual'} |
Проверить, что в системе имеется указанная служба:
1 2 3 4 |
if (Get-Service "ServiceTest" -ErrorAction SilentlyContinue) { Write-host "ServiceTest exists" } |
Остановка, запуск, приостановка и перезапуск служб из PowerShell
Остановить службу можно с помощью командлета Stop-Service. Чтобы остановить службу печати, выполните команду:
1 |
Stop-Service -Name spooler |
Командлет Stop-Service не выводит никаких данных после выполнения. Чтобы увидеть результат выполнения команды, используйте параметр -PassThru.
Обратите внимание, что не каждую службу можно остановить. Если есть зависимые службы, то получите ошибку
1 |
Cannot stop service because it has dependent services. It can only be stopped if force flag set. |
Для принудительной остановки используйте параметр –Force. Вы должны помнить, что остановятся также все зависимые службы:
1 |
Stop-Service samss –Force -Passthru |
Следующая команда остановит перечисленные службы (bits,spooler) со статусом ”Running”:
1 |
get-service bits,spooler | where {$_.status -eq 'running'} | stop-service –passthru |
Иногда службы зависают в статусе Stopping и их процессы приходится завершать принудительно.
Командлет Start-Service запускает остановленные службы:
1 |
Start-Service -Name spooler -PassThru |
Служба не запустится, если есть остановленные зависимые службы. Чтобы их найти и включить:
1 |
get-service samss | Foreach { start-service $_.name -passthru; start-service $_.DependentServices -passthru} |
Командлет Suspend-Service может приостанавливать службы, допускающие временную приостановку и возобновление. Для получения сведений о возможности временной приостановки конкретной службы используйте командлет Get-Service со свойством «CanPauseAndContinue«.
1 |
Get-Service samss | Format-List name, canpauseandcontinue |
Чтобы отобразить список всех служб, работа которых может быть приостановлена, введите команду:
1 |
Get-Service | Where-Object {$_.canpauseandcontinue -eq "True"} |
Приостановим службу SQLBrowser:
1 |
Suspend-Service -Name SQLBrowser |
Для возобновления работы приостановленной службы служит командлет Resume-service:
1 |
Resume-Service -Name SQLBrowser |
Следующая команда возобновляет работу всех приостановленных служб:
1 |
get-service | where-object {$_.Status -eq "Paused"} | resume-service |
Командлет Restart-Service перезапускает службу:
1 |
Restart-Service -Name spooler |
Эта команда запускает все остановленные сетевые службы компьютера:
1 |
get-service net* | where-object {$_.Status -eq "Stopped"} | restart-service |
Параметр —ComputerName у этих командлетов отсутствует, но их можно выполнить на удаленном компьютере с помощью командлета Invoke-Command или через пайп:
Например, чтобы перезапустите очередь печати на удаленном компьютере RM1, выполните команду: «Get-Service Spooler -ComputerName RM1 | Start-Service»По умолчанию только администраторы могут запускать/останавливать службы в Windows, но вы можете предоставить права на перезапуск конкретной службы и обычным пользователям.
Set-Service – изменение настроек службы Windows
Командлет Set-Service позволяет изменить параметры или настройки служб на локальном или удаленном компьютере. Так как состояние службы является свойством, этот командлет можно использовать для запуска, остановки и приостановки службы. Командлет Set-Service имеет параметр -StartupType, позволяющий изменять тип запуска службы.
Изменим тип запуска службы spooler на автоматический:
1 |
Set-Service spooler –startuptype automatic –passthru |
Можно перевести службу на ручной (manual) запуск:
1 |
Set-Service spooler –startuptype manual –passthru |
Создание и удаление служб Windows c помощью PowerShell
New-Service – командлет для создания новой службы в Windows. Для новой службы требуется указать имя и исполняемый файл (вы можете запустить PowerShell скрипт как службу Windows).
В примере создадим новую службу с именем TestService.
1 |
new-service -name TestService -binaryPathName "C:WINDOWSSystem32svchost.exe -k netsvcs" |
С помощью параметра Get-WmiObject получим информацию о режиме запуска и описание службы
1 |
get-wmiobject win32_service -filter "name='testservice'" |
Изменить параметры новой службы можно командой
1 |
Set-Service -Name TestService -Description ‘My Service’ -StartupType Manual |
Чтобы удалить службу используйте команду
1 |
(Get-WmiObject win32_service -Filter ″name=′TestService′″).delete() |
Изменение учетной записи для запуска службы
Вы можете изменить учетную запись, из-под которой запускается служба. Получим имя учетной записи, которая используется для запуска службы TestService
1 |
get-wmiobject win32_service -filter "name='TestService'" | Select name,startname |
Для изменения имени и пароля учетной записи выполняем команды.
1 2 |
$svc = get-wmiobject win32_service -filter "name='TestService'" $svc.GetMethodParameters("change") |
В результате получаем список параметров метода Change(). Считаем на каком месте находятся параметры StartName и StartPassword – 20 и 21 место соответственно.
1 |
$svc | Invoke-WmiMethod -Name Change –ArgumentList @ ($null,$null,$null,$null,$null,$null,$null, $null,$null,$null,$null,$null,$null,$null,$null,$null, $null,$null,$null,"Administrator","P@ssw0rd") |
Либо вы можете указать имя gMSA аккаунта. Пароль при этом не указывается.
Как видите, PowerShell позволяет легко управлять службами Windows. Можно создавать, останавливать, запускать и возобновлять службы, менять их свойства. Большинство командлетов позволяют управлять службами на удаленных компьютерах.
Ваш комментарий будет первым