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