Управління службами Windows за допомогою PowerShell

У Windows ви можете управляти службами не тільки з графічної консолі services.msc або утиліти командного рядка Sc.exe (первоначальна включалася в пакет ресурсів Resource Kit), але і за допомогою PowerShell. У цій статті ми дивимося різні сценарії управління службами Windows за допомогою PowerShell.

зміст:

  • Основні командлети PowerShell для керування службами Windows
  • Зупинка, запуск, припинення і перезапуск служб з PowerShell
  • Set-Service - зміна налаштувань служби Windows
  • Створення та видалення служб Windows c допомогою PowerShell
  • Зміна облікового запису для запуску служби

Основні командлети PowerShell для керування службами Windows

Існує вісім основних командлетів Service, призначених для перегляду стану і управління службами Windows.

Щоб отримати весь список командлетів Service, введіть команду:

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:

Get-Help Start-Service

Get-Service: отримуємо список служб і їх стан

Отримати список і стан (Running / Stopped) служби на локальному або віддаленому комп'ютері можна за допомогою командлета Get-Service. Параметр -Name дозволяє робити відбір на ім'я служби. Ім'я служби можна задати з використанням групових символів *.

Якщо ви не знаєте точне ім'я служби, є можливість знайти служби по псевдонімом за допомогою параметра -DisplayName. Можна використовувати список значень і символи узагальнення.

.

командлет Get-Service можна використовувати для отримання стану служб на віддалених комп'ютерах, вказавши параметр -ComputerName. Можна опитати статус служби відразу на безлічі віддалених комп'ютерів, їх імена потрібно перерахувати через кому. Наприклад, наведена нижче команда отримує стан служби Spooler на віддалених комп'ютерах RM1 і RM2.

Get-Service spooler -ComputerName RM1, RM2

Status Name DisplayName ------ ---- ----------- Running spooler Print Spooler Stopped spooler Print Spooler

Вивести всі властивості служби дозволить командлет Select-Object:

Get-Service spooler | Select-Object *

командлет Select-Object дозволить вивести певні властивості служби. Наприклад, нам потрібно вивести ім'я, статус і доступні можливості служби Spooler:

Get-Service Spooler | Select DisplayName, Status, ServiceName, Can *

командлет Get-Service має два параметри, які дозволяють одержати залежності служб:

  • параметр -DependentServices дозволяє вивести служби, які залежать від даної служби;
  • параметр -RequiredServices дозволяє вивести служби, від яких залежить ця служба.

Наведена нижче команда виводить служби, необхідні для запуску службі Spooler:

Get-Service -Name Spooler -RequiredServices

Наступна команда виводить служби, які залежать від служби Spooler:

Get-Service -Name Spooler -DependentServices

При необхідності знайти служби з певним станом або параметрами, використовуйте командлет Where-Object. Наприклад, отримаємо список запущених служб зі статусом Running:

Get-Service | Where-Object $ _. Status -eq 'running'

Для виведення служб з типом запуску Manual, виконайте команду

Get-Service | Where-Object $ _. Starttype -eq 'Manual'

Перевірити, що в системі є зазначена служба:

if (Get-Service "ServiceTest" -ErrorAction SilentlyContinue)

Write-host "ServiceTest exists"

Зупинка, запуск, припинення і перезапуск служб з PowerShell

Зупинити службу можна за допомогою командлета Stop-Service. Щоб зупинити службу друку, виконайте команду:

Stop-Service -Name spooler

Командлет Stop-Service не виводить ніяких даних після виконання. Щоб побачити результат виконання команди, використовуйте параметр -PassThru.

Зверніть увагу, що не кожного службу можна зупинити. Якщо є залежні служби, то отримаєте помилку

Can not stop service because it has dependent services. It can only be stopped if force flag set.

Для примусової зупинки використовуйте параметр -Force. Ви повинні пам'ятати, що зупиняться також всі залежні служби:

Stop-Service samss -Force -Passthru

Наступна команда зупинить перераховані служби (bits, spooler) зі статусом "Running":

get-service bits, spooler | where $ _. status -eq 'running' | stop-service -passthru

Іноді служби зависають у статусі Stopping і їх процеси доводиться завершувати примусово.

командлет Start-Service запускає зупинені служби:

Start-Service -Name spooler -PassThru

Служба не запуститься, якщо є зупинені залежні служби. Щоб їх знайти і включити:

get-service samss | Foreach start-service $ _. Name -passthru; start-service $ _. DependentServices -passthru

командлет Suspend-Service може призупиняти служби, що допускають тимчасове припинення і відновлення. Для отримання відомостей про можливість тимчасового припинення конкретної служби використовуйте командлет Get-Service з властивістю «CanPauseAndContinue«.

Get-Service samss | Format-List name, canpauseandcontinue

Щоб відобразити список усіх служб, робота яких може бути припинена, введіть команду:

Get-Service | Where-Object $ _. Canpauseandcontinue -eq "True"

Призупинимо службу SQLBrowser:

Suspend-Service -Name SQLBrowser

Для відновлення роботи призупиненої служби служить командлет Resume-service:

Resume-Service -Name SQLBrowser

Наступна команда відновлює роботу всіх припинених служб:

get-service | where-object $ _. Status -eq "Paused" | resume-service

командлет Restart-Service перезапускає службу:

Restart-Service -Name spooler

Ця команда запускає все зупинені мережеві служби комп'ютера:

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 на автоматичний:

Set-Service spooler -startuptype automatic -passthru

Можна перевести службу на ручний (manual) запуск:

Set-Service spooler -startuptype manual -passthru

Створення та видалення служб Windows c допомогою PowerShell

New-Service - командлет для створення нової служби в Windows. Для нової служби потрібно вказати ім'я та виконуваний файл (ви можете запустити PowerShell скрипт як службу Windows).

У прикладі створимо нову службу з ім'ям TestService.

new-service -name TestService -binaryPathName "C: \ WINDOWS \ System32 \ svchost.exe -k netsvcs"

За допомогою параметра Get-WmiObject отримаємо інформацію про режим запуску і опис служби

get-wmiobject win32_service -filter "name = 'testservice'"

Змінити параметри нової служби можна командою

Set-Service -Name TestService -Description 'My Service' -StartupType Manual

Щоб видалити службу використовуйте команду

(Get-WmiObject win32_service -Filter "name = 'TestService'"). Delete ()

Зміна облікового запису для запуску служби

Ви можете змінити обліковий запис, з-під якої запускається служба. Отримаємо ім'я облікового запису, яка використовується для запуску служби TestService

get-wmiobject win32_service -filter "name = 'TestService'" | Select name, startname

Для зміни імені та пароля облікового запису виконуємо команди.

$ Svc = get-wmiobject win32_service -filter "name = 'TestService'"
$ Svc.GetMethodParameters ( "change")

В результаті отримуємо список параметрів методу Change (). Вважаємо на якому місці знаходяться параметри StartName і StartPassword - 20 і 21 місце відповідно.

$ 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. Можна створювати, зупиняти, запускати і відновлювати служби, міняти їх властивості. Більшість командлетів дозволяють управляти службами на віддалених комп'ютерах.