- Получение списка служб средствами командной строки и сервера Windows Script Host
- Управление системными службами через командную строку
- Команды SC — настройка, запуск и останов системный служб Windows
- Примеры работы с командами SC
- Как управлять службами в Powershell командлетами Service
- Получение списка служб
- Остановка, перезапуск и запуск служб
- Восстановление и приостановка работ служб
- Изменение с Set-Service
- Создание сервисов с New-Service
- Получение с помощью WMI класса
- Изменение с помощью WMI класса
Получение списка служб средствами командной строки и сервера Windows Script Host
Всем, привет, в данной статье мы научимся получать список служб Windows как используя командную строку, так и сценарии Windows Script Host. Но, сначала немного лирики … рядовой пользователь ОС Windows всегда находится в самообмане: если он крякнул антивирусную программу, значит она его защитит перед всеми злодеями, если у него модная Семерка, значит он мастер, а у кого XP, так те – цифровые динозавры.
Любой программный код подвержен ошибкам и багам, так в старых версиях XP была учетная запись Администратор (Administrator), она не отображалась при загрузке, но была активной, естественно, пароль на ней не стоял, и ваш сосед по комнате мог спокойно, в момент вашего отсутствия войти в систему с правами администратора и наколдовать что угодно, для этого достаточно было в окне выбора пользователя ввести заветную комбинацию CTRL + ALT + DEL, далее ввести имя юзера Администратор (Administrator) и нажать вход, и … вуалая, вы в системе. Тоже относится и к сервисам, практически все они работают под системной учеткой, на которой также нет ни пароля, ни ограничений, если они активны, ну… например, telnet, или служба Удаленный реестр, то… тоже можно нашалить.
И поэтому, в этой статье мы попробуем получить список служб используя командную строку и сценарии Windows Script Host, кодить будем на языке vbscript и jscript.
Сам сервер Windows Script Host не предоставляет объекта для работы со службами системы, тут есть два пути или утилиты командной строки, или WMI. В этой статье мы рассмотрим первый способ, и так… усаживайтесь поудобней, берите пиво и тараньку, … начинаем.
Если запустить командную строку и прописать на выполнение строчку sc query , то мы получим список и параметры всех сервисов Windows, при желании, его можно импортировать в текстовый файл:
Sc query> “D:\work\service.txt”
Тут мы указали, что данные должны выводиться не на экран, а в текстовый файл service.txt в папку D:\work\. Лады, давайте взглянем, что нам наколдовала утилита sc query:
Из скрина видно, что информация о службе выводится в отдельном блоке, давайте его проанализируем:
SERVICE_NAME: AudioSrv – тут отображается сокращенный формат названия
DISPLAY_NAME: Windows Audio — описательный формат имени службы
TYPE : 20 WIN32_SHARE_PROCESS — тип службы
STATE : 4 RUNNING(STOPPABLE,NOT_PAUSABLE,IGNORES_SHUTDOWN) – состояние и параметры работы
WIN32_EXIT_CODE : 0 (0x0)
SERVICE_EXIT_CODE : 0 (0x0)
CHECKPOINT : 0x0
WAIT_HINT : 0x0
Последние четыре строки нам пока не представляют интерес.
Ладно, теперь давайте посмотрим, как можно задать параметры фильтрации:
type — определяем тип, например, driver — драйвер, service – сервис (стоит по умолчанию), all – все.
state — определяет статус, например, active – активная (значение по умолчанию), inactive — неактивная, all – все.
bufsize — размер буфера перечисления в байтах, по умолчанию 4096
ri – номер индекса, начиная с которого начинается или возобновляется перечисление, по умолчанию значение 0
group — группа служб для перечисления, по умолчанию стоит all groups.
И так, что бы задать фильтр, мы прописываем команду sc query,пробел, далее пишем имя фильтра, знак равенства, пробел и значение.
Так, что бы получить список неактивных служб, командная строка требует следующий синтаксис:
Sc query state= inactive> “D:\work\service.txt”
В свое время, на это я ставил точку и заканчивал статью, но… не на этом блоге.
Давайте сделаем так, что бы в диалоговом окне задать нужные параметры, и получить полный или отфильтрованный список, ясен пень, что в командной строке это не реализовать, то мы будет использовать сценарии сервера WSH и объект WindowSystemObject.
Вот как выглядит будущая форма для сценария:
Сперва мы напишем пример на языке vbscript, я в нем все разъясню, что бы было понятно, что к чему, а потом на его основе мы напишем пример на языке jscript.
И так, приступаем.
И так, в комментариях я некоторые пункты разъяснил, поэтому сконцентрируемся на главном. Фактически, за весь процесс получения списка служб в командной строке отвечает функция Analize(), давайте остановимся на ней подробно:
Переменные type_date, state_date, bufsize_date и ri_date хранять в себе значения, которые прописаны в полях и списках формы, тут мы сразу вставляем имя флага и знак равенства. Далее происходит проверка флагов type и state, дело в том, что если им присвоить значения по умолчанию, то возникнет ошибка в самой командной строке, поэтому, все значения по умолчанию мы заменяем на пустую строку. Далее, используя функцию Run объекта WScript.Shell мы запускаем командную строку с параметрами для получения списка служб, переменная temp_file хранит путь к временному файлу, именно в него будет направлен вывод. Далее происходит открытие временного файла, считывание из него данных, и их запись в поле вывода на форме. При нажатии на кнопку Открыть, происходит вызов функции Open, которая отвечает за открытие временного файла программой wordpad.exe.
А вот аналогичный пример, но уже на языке jscript:
В принципе, тут нет ничего сложного, если что, задавайте вопросы в комментариях, буду рад ответить, также буду рад, если подпишитесь на обновление блога. Ну что же, мы рассмотрели примеры получения списка служб средствами командной строки и Windows Script Host.
Спасибо за внимание. Автор блога Владимир Баталий
Управление системными службами через командную строку
Службы обеспечивают ключевые функции рабочих станций и серверов. Для управления системными службами на локальных и удаленных системах используется команда контроллера служб (service controller command) SC, имеющая набор подкоманд, здесь описывается лишь их некоторая часть.
Для удобства пользования в командной строке используются сокращенные названия служб Windows (например, Spooler — диспетчер очереди печати, Dhcp — DHCP-клиент, W32Time — Служба времени Windows и т.п., см таблицу по ссылке).
Команды SC — настройка, запуск и останов системный служб Windows
- SC config — настройка учетных записей регистрации и запуска служб;
- SC query — вывод списка всех служб, настроенных на компьютере;
- SC qc отображение конфигурации определенной службы;
- SC start — запуск служб;
- SC stop — останов служб;
- SC pause — приостановка работы служб;
- SC continue — возобновление работы служб;
- SC failure — задание действий, выполняемых при сбое службы;
- SC qfailure — просмотр действий, выполняемых при сбое службы.
Примеры работы с командами SC
Во всех командах можно указывать имя удаленного компьютера, со службами которого вы хотите работать. Для этого вставьте UNC-имя (например, \\Roza) или IP-адрес (например, 192.168.1.1) компьютера перед используемой подкомандой. Вот синтаксис: sc ИмяСервера Подкоманда.
Пример команды sc на компьютере с Windows 10:
- sc \\Roza query Spooler
Чтобы получить список всех служб, настроенных в системе, введите в командной строке команду: sc query type=service state=all или sc ИмяСервера query type=service state=all где ИмяСервера — UNC-имя или IP-адрес удаленного компьютера.
Как управлять службами в Powershell командлетами Service
30 сентября 2019
Для управления службами в Powershell есть восемь команд с помощью которых мы можем контролировать весь процесс работы сервисов и создавать новые. Что бы увидеть весь список команд созданных в PS для работы с сервисами нужно выполнить:
Мы увидим следующие командлеты:
- Get-Service — получение списка служб в Powershell.
- New-Service — создание нового сервиса.
- Restart-Service — перезапуск службы.
- Resume-Service — восстанавливает работу остановленного сервиса.
- Set-Service — изменение настроек.
- Start-Service — запуск службы в Powershell.
- Stop-Service — остановка.
- Suspend-Service — приостановка работы (пауза).
Учитывайте, что в виде команд делается не полное управление сервисами. Например удаление делается через WMI, которое тоже будут рассмотрены.
Навигация по посту
Получение списка служб
Узнать статус всех служб можно так:
Каждый результат выдаваемый командами в PS представляет собою объект. Этот объект содержит разные свойства и методы. Свойства — это например имя или статус. По умолчанию мы видим не все свойства. Что бы узнать какие еще свойства есть у команды нужно выполнить следующее:
Часть свойств реализована в виде ключей. Попробуем вывести сразу все свойства всех сервисов, но в таком случая вывод будет сложно читаемый:
Возможно вывести только имена, статус и тип запуска:
Или выведем информацию по одному сервису:
У сервисов есть короткое имя и отображаемое. Так мы выведем оба:
В именах мы можем использовать маски, а это значит что мы можем не знать полное название и использовать знак * в том месте, где не уверены в названии или написании:
Не желательно указывать отображаемое имя так как язык операционных систем может быть разным и если вы выполняете командлеты удаленно, вероятно будут ошибки:
- Cannot find any service with service name
- Cannot find any service with display name
- Не удается найти службу с отображаемым именем
Кроме этого есть два ключа, которые тоже поддерживают маски:
- Include — включают поиск по какой-то маске или точному соответствию.
- Exclude — исключает упоминание.
Можно сравнить разницу с прошлым примером:
У сервисов несколько статусов:
- Running — запущен.
- Stopped — остановлен.
- Paused — приостановлен (пауза).
По каждому из них мы можем отфильтровать результат:
Кроме этого есть 3 типа запуска:
- Automatic — автоматический запуск вместе с системой.
- AutomaticDelayedStart — запуск после загрузки системы.
- Manual — ручной запуск.
- Disabled — отключенный.
Допустим, что у нас есть какая-то проблема в операционной системе и мы хотим проверить все сервисы, который автоматически запускаются при включении ОС. Для этого нам нужно использовать несколько условий, где статус не равен Running и тип запуска равен Automatic:
Службы могут быть зависимы от других и для проверки этих свойств есть два параметра:
- DependentServices — кто зависит от этого сервиса.
- RequiredServices — от кого зависит этот сервис.
Аналогично параметрам команды выше есть свойства DependentServices и ServicesDependedOn (RequiredServices). Они выводят одно и то же.
Есть несколько свойств, которые не выведены в параметры — это:
- CanPauseAndContinue — можно ли приостановить работу сервиса и возобновить.
- CanShutdown — может ли быть выключен.
- CanStop — может ли быть полностью остановлен.
Эти свойства так же можно увидеть в GUI. В командлете ниже я использую алиас gsv (короткое имя Get-Service):
Каждая команда PS, где присутствует параметр ComuterName, может быть выполнена удаленно. Для удаленного управления в Powershell нужны дополнительные настройки, которые уже описывались в предыдущей статье.
Имена всех компьютеров, с которых мы хотим получить имена сервисов, можно указать через запятую:
Как отослать сообщение через Powershell
Остановка, перезапуск и запуск служб
Чтобы в Powershell запустить службу и остановить достаточно указать только имя. Причем можно указывать как короткое и отображаемое имя:
Можно выполнить получение, остановку и запуск в одну команду:
Во большинстве командлетах PS, которые делают изменения, можно увидеть два параметра. Первый — это WhatIf, который покажет результат выполнения командлета, но не попытается ее выполнить. Такие параметры удобно использовать при выполнении сложных задач типа кластеров. Второй параметр Confirm, который потребует подтверждение перед выполнением. Вместе эти параметры не работают:
В запуске и остановке так же можно использовать параметры фильтрации, которые вы видели при получении статусов выше. Будьте осторожны перед выполнением так как вы можете остановить все службы:
Если с сервисом работает другой сервис, то мы не завершим его работу и нужно указать дополнительный ключ Force:
Если он не стоит появится ошибка:
- Cannot stop service ‘Remote Procedure Call (RPC) (RpcSs)’ because it has dependent services. It can only be stopped if the Force flag is set.
- Не удается получить доступ к зависимым службам «Удаленный вызов процедур (RPC) (RpcSs)».
Как уже было описано выше сервисы могут быть зависимы от других и в таком случае запуск может не получится. На примере ниже я получил все родительские сервисы (от которых зависит Spooler) и запустил их, а затем запустил требуемый:
Перезапуск сервисов работает так же со всеми параметрами:
Удаленный запуск и остановка командлетами не предусмотрена, но это исправляется стандартными методами:
Восстановление и приостановка работ служб
Не каждую службу можно приостановить (Pause) и восстанавливть. Что бы увидеть все службы, у которых есть такая возможность, выполните:
Командой ниже мы получи, нажмем паузу и восстановим работу сервиса Winmgmt:
Ошибки, если мы попытаемся остановить службу у которых нет такой возможности:
- Service ‘Windows Remote Management (WS-Management)’ cannot be suspended because the service does not support beingsuspended or resumed.
- Не удается приостановить службу «Spooler», так как этой службой не поддерживается приостановка или возобновление.
В этих командах так же можно использовать параметры Include и Exclude, с масками.
На скрипте ниже показана проверка возможности приостановки сервиса, если у него есть такая возможность. Если ее нет, то сервис остановит свою работу:
Изменение с Set-Service
Командлетом ниже я изменил тип запуска сервиса с отключенного на автоматический:
В случае изменения сервисов нельзя использовать маски *.
В документации Microsoft говориться про возможность изменения на четыре режима со следующими названиями:
- Automatic
- AutomaticDelayedStart
- Disabled
- Manual
Во первых половина называется иначе и изменение не срабатывает. Возможно изменение не срабатывает из-за багов Windows Server 2019,может из-за зависимостей (в GUI все работает), но скорее всего дело в PS. При работе с WMI все срабатывает. Реальные варианты запуска такие:
Через эту команду можно так же выполнить запуск и остановку:
Все возможные значения:
Можно изменить описание сервиса:
Команды изменения можно выполнять удаленно:
Создание сервисов с New-Service
Для создания сервиса необходимо указать два параметра — это имя и путь до бинарного файла:
В PS 5.1 не предусмотрена команда удаления, она появилась в версии 6.1, которая устанавливается отдельно и может работать иначе. Для удаления сервисов, а так же частичного изменения, используется WMI. Указывайте все возможные параметры, что бы в последующем не лезть в WMI.
Параметры, которые в последующем нельзя будет изменить через PS:
- DisplayName — полное отображаемое имя.
- Credential — учетная запись, под которой будет происходить запуск.
- DependsOn — от кого будет зависеть.
При объявлении переменной $credential у нас запросятся учетные данные (логин/пароль). По умолчанию сервис работает под текущим аккаунтом. Я создавал сервис на доменном компьютере и пока я не ввел FQDN вид user@domain.local я получал ошибку:
- Service ‘Testing Services In Powershell (TestService1)’ cannot be created due to the following error: The account name is invalid or does not exist, or the password is invalid for the account name specified
Кроме этого есть параметры, которые возможно изменить через команды выше:
- Description — описание.
- StartupType — тип запуска.
Получение с помощью WMI класса
За работу со службами в WMI отвечает класс win32_service. Преимущества такого подхода в том, что тут можно посмотреть и изменить все детали работы сервисов. Более подробно WMI в Powershell мы уже рассматривали.
Что бы получить список аналогичный Get-Service выполните:
В классе WMI можно увидеть больше свойств, которые можно использовать:
Одно из преимуществ использования в WMI это то, что мы можем увидеть идентификатор процесса под которым работает сервис. Если сервис остановлен, то его идентификатор 0. Так мы увидим идентификатор процесса с именем WinRM и получим всю информацию по процессу:
О том как работать с процессами в Powershell мы писали в прошлой статье.
С помощью WMI мы можем вернуть имя аккаунта, под которым запущена служба и ее описание. Используя параметр ComputerName это можно сделать удаленно на множестве компьютеров:
Изменение с помощью WMI класса
Для управления в WMI существую методы. Все методы класса можно получить так:
Удалим сервис, который создавался через New-Service:
Для изменения паролей нужно использовать следующую конструкцию. После выполнения команды сервис нужно перезапустить:
$null установлены у всех параметров, которые мы не хотим изменять. В нашем случае нужно изменить только логин и пароль и они указаны в переменных. Увидеть какие параметры не меняются с $null можно так: