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

Зависимые службы

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

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

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

Как проверить наличие службы и если её нет – запустить батник?

Приветствую. Есть некий exe-шник, который я хотел бы запускать на всех компах в домене при включении. В данный момент я смог это реализовать только как логон-скрипт через GPO таким образом: первый батник лежит в авторане и запускает vbs, который, в свою очередь уже создает свой скрытый шелл и там запускает exe-шник с аргументами. Чтобы было понятно – вот скрипт:

Set WshShell = CreateObject(“WScript.Shell”)
WshShell.Run “cmd.exe /c %path_to_folder%start.bat”, 0, false

Вручную при помощи nssm служба создается и запускается. Автоматизация этого процесса мне видится примерно таким образом –
1) Через GPO распространить нужные файлы
2) Запихнуть в авторан скрипт, проверяющий наличие службы, и, в случае её отсутствия, запускающий nssm с параметрами установки. Вопрос – как это сделать? В PowerShelle и VBS не силен, к сожалению

Осуществляем фильтрацию (используя where-object)

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

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

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

:/>  Memtest86 – программа для проверки оперативной памяти компьютера, как протестировать ОЗУ и пользоваться memory test, инструкция

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

Получаем статус службы

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

PS C:> get-service

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

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

PS C:> get-service | get-member

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

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

Получаем статус службы на удаленных компьютерах

До этого нас интересовало получение информации о статусе служб на локальном компьютере. Однако управление службами осуществляется на удаленных компьютерах. Если посмотреть справку по 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, то можно легко выбрать одну службу на множестве компьютеров.

:/>  Хакинтош: разворачиваем macOS Sierra на Intel-PC подробно и понятно / Хабр

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

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 нет.

Управление работой служб с помощью консоли управления.

Для управления службами в Windows существует графическая утилита – службы (services.msc), для ее запуска необходимо перейти:

Управление службами из командной строки.

Службами window можно управлять не только используя графическую утилиту, но и из командной строки windows cmd. Для запуска переходим в пункт меню: Пуск –> Выполнить –> В строку вводим команду cmd.exe. Ниже приведу команды для управления службами.

Остановка службы.

sc stop [имя_службы]

Запуск службы.

sc start [имя_службы]

Удаление службы.

sc delete [имя_службы]

Установка режима запуска службы:

sc config [имя_службы] start= [параметр_запуска]
	параметр_запуска:
		auto - автоматически.
		demand - вручную.
		disabled - отключена.
Примечание: После start= должен идти обязательно пробел.

Запрос данных конфигурации для службы.

sc qc [имя_службы]

Просмотр всех служб:

sc query

Для удобства чтения выводимой информации используем утилиту more.

sc query | more

Для копирования вывода в буфер используем утилиту clip.

sc query | clip

Вывод справки по команде sc.

sc ?

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

sc delete “Events Utility”

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

:/>  CHCP – просмотр или изменение кодовой страницы.

Список всех служб расположен в ветке реестра:

HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServices

На этом заканчиваем знакомство со службами windows. Надеюсь статья была полезная.

Оставьте комментарий