Зависимые службы
Мы можем сделать то же самое с зависимыми службами. Если таковых не имеется, в конвейер ничего передано не будет.
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 отображает те объекты, которые остались в конвейере.Результаты приведены ниже.
Теперь давайте попробуем найти одну службу на нескольких машинах. Вывод отформатируем в таблицу.
Получаем статус службы
Давайте начнем с того, что просто получим статус всех служб, запущенных на локальном компьютере. Используем для этого командлет 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, то можно легко выбрать одну службу на множестве компьютеров.
Требуемые службы
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 – обладающего полными правами в системе.
Список всех служб расположен в ветке реестра:
HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServices
На этом заканчиваем знакомство со службами windows. Надеюсь статья была полезная.