Меню Рубрики

Скрипт для запуска службы windows

Управляем службами Windows с помощью PowerShell. Часть 2


Продолжаем знакомиться с тем, как осуществлять управление службами Windows с использованием PowerShell. В предыдущем посте мы рассмотрели, как получить статус службы на локальном и удаленном компьютере, произвести фильтрацию служб (например, найти только остановленные службы) и определить зависимые службы. В этом посте будут рассмотрены такие достаточно тривиальные вещи, как:

  1. Остановка службы
  2. Запуск службы
  3. Перезапуск службы
  4. Приостановка и возобновление работы
  5. Управление удаленными службами
  6. Настраиваем автозагрузку службы

Мы уделим большее внимание разбору команд в PowerShell для осуществления выше перечисленного на локальном компьютере. В разделе “управление службами удаленных компьютерах” мы рассмотрим, ограничения работы в PowerShell v2 и v3. Подробности под катом.

Так как команда для получения статуса службы называется Get-Service, догадаться о том, как пишутся другие команды не составит труда. На худой конец мы можем спросить у PowerShell обо всех командах, так или иначе относящихся к работе со службами. Обратите внимание, что мы использовали параметр –noun для получения всех команд, связанных со службами.

Взглянем на эти команды внимательнее.

STOP-SERVICE

Чтобы остановить службу, мы должны уточнить ее имя.

Однако в конвейер ничего не будет передано. Некоторые командлеты, такие как Stop-Service, созданы таким образом, что по умолчанию они не записывают объект в конвейер. Мы же заставим это сделать, использовав параметр –Passthru.

Если служба не запущена, то командлет ничего не выведет, равно как и не выдаст никакой ошибки. Поэтому иногда лучше передать объект в Stop-Service (естественно использовав при этом параметр –whatif).

Параметр –WhatIf был добавлен для того, чтобы мы посмотрели, что будет, если командлет будет запущен. Когда я удостоверюсь, что это именно та служба, которая меня интересует, я просто удалю -Whatif и остановлю службу.

Как я уже упомянул выше, если служба уже остановлена, то командлет ничего не сделает. И использование Stop-Service в этом случае никому не навредит. Однако я все же предпочитают более цивилизованный подход, а именно:

Если служба запущена, то объект передается в конвейер и отправляется в Stop-Service. Ниже приведен вариант с остановкой нескольких служб.

Некоторые службы не захотят останавливаться – в силу наличия зависимых служб – что мы и видим на скриншоте ниже.

В таком случае используем параметр –Force. В большинстве случаев это работает, но без “защиты от дурака”. Помните, что команда также остановит зависимые службы.

START-SERVICE

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

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

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

Мы должны явно получить зависимые службы, потому что Start-Service не запустит автоматически их.

RESTART-SERVICE

Вы удивитесь, но перезапуск службы работает также как два предыдущих примера. Используйте –Passthru, если хотите убедиться, что служба запущена.

Так как мы осуществляем остановку службы, нам может понадобиться параметр –Force.

ПРИОСТАНОВКА И ВОЗОБНОВЛЕНИЕ РАБОТЫ

Работа некоторых служб может быть приостановлена на некоторое время, а затем возобновлена, и мы можем это сделать через PowerShell. Однако если служба не удовлетворяет требованиям, мы получим такие ошибки. (на примере показано, что мы пытались приостановить службу bits)

В чем же проблема? Смотрим на объект (используя Get-Service).

Если значение свойства CanPauseAndContinue равно True, значит мы можем приостанавливать и возобновлять работу службы. Найдем такие службы:

Как мы видим, не так много служб удовлетворяют этому требованию.

Готовы возобновить работу службы? Используйте следующее выражение:

Оба командлета также поддерживают –Whatif.

УДАЛЕННЫЕ СЛУЖБЫ

Как вы могли обратить внимание, все примере выше мы демонстрировали на локальном машине. И это неслучайно. К сожалению даже в PowerShell v3, ни у одного из этих командлетов нет параметра, который позволял бы управлять службой на удаленном компьютере. Get-Service, конечно, поддерживает параметр –Computername, но не более. Службу лицезреть вы сможете, а что-либо с ней сделать не получится. Нет, можно, конечно, если удаленный компьютер работает с PS v2 и включен PowerShell Remoting. Тогда мы можете использовать все выше приведенные команды, используя Invoke-Command для удаленного компьютера или PSSession. С другой стороны, проще управлять одной службой на нескольких серверах.

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

УСТАНАВЛИВАЕМ УДАЛЕННЫЙ СТАТУС

Итак, мы выяснили, что у командлета Stop-Service отсутствует такой полезный параметр как –Computername. Мы можете использовать эти команды в удаленной сессии, обратившись к командлету Invoke-Command, что уже само по себе продуктивно, если вы работаете со службой на нескольких компьютерах. Одно можно запускать, останавливать, перезапускать, ставить на паузу и запускать заново, используя Set-Service.

Эта команда поддерживает параметр –WhatIf. Вы также должны использовать –Passthru для передачи объектов в конвейер.

Валидными значениям для параметра –Status являются “запущена” (running), “остановлена” (stopped) и “на паузе” (paused). Помните, что у службы есть зависимые службы, мы не сможете изменять ее, что и продемонстрировано на скриншоте ниже.

К сожалению, у Set-Service отсутствует параметр –Force, поэтому придется вернуться к использованию PowerShell remoting и Invoke-Command. Если вы хотите перезапустить удаленную службу, используйте следующую команду:

Не забудьте использовать –Passthru, в противном случае вторая команда Set-Service ничего не осуществит.
Что по мне, так я предпочитаю работать сразу с несколькими службами, которые я не могу удаленно остановить, используя Set-Service, хотя их запуск проблем составляет. Я использую Invoke-Command. Но помните, что используя параметр –Computername PowerShell осуществляет подключение, используя RPC и DCOM, что может привести к проблемам с файрволом. Invoke-Command использует PowerShell remoting, который мы может быть еще не настроили или не включили.

УСТАНАВЛИВАЕМ ТИП АВТОЗАПУСКА СЛУЖБЫ

Set-Service полезнен, когда вы хотите включить или отключить службу, используя параметр –StartupType. Если Вы настроили службу, используя значения Automatic, Manual or Disabled. К сожалению, не существует варианта для Automatic (Delayed).

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

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

Так что если вы хотите выключить и остановить (или включить и запустить) службу, передайте объект в подходящий командлет.

Технически, Set-Service позволяет вам изменить отображаемое имя службы и описание, но лично мне никогда не приходилось использовать в своей работе. Я использую Set-Service для включения и выключения служб. Если необходимо управлять службами удаленно, то я использую Invoke-Command.
Все, что я продемонстрировал в последних статьях, было связано с использованием специфических типов объектов службы, которые, как вы могли заметить, имеют некоторые ограничения. В следующей статье мы рассмотрим другие возможности по управлению службами, которые призваны обойти эти ограничения.

Источник

Пишем менеджер служб Windows средствами командной строки и Windows Script Host

В этой статье мы рассмотрим утилиты для возобновления, запуска, перезапуска и остановки служб Windows из командной строки и средствами WMI с использованием возможностей сервера Windows Script Host. Скажу сразу, статья будет объемная и интересная, так что запаситесь пивом и чипсами. Что именно мы изучим: утилиты командной строки, которые позволяют производить запуск службы через командную строку, возобновления, остановку и перезапуск служб Windows; напишем два примера (один на языке jscript, а другой на языке vbscript) – это будет своеобразный менеджер служб, в нем будет выводиться список всех сервисов в формате колонок (в каждой колонке будут отображаться параметры сервиса, например, имя, тип, тип запуска и так далее). Ссылку на архив с примерами я дам в конце, что бы вы не мучились копируя код. Как он будет выглядеть, вы можете увидеть на картинках ниже:

Ладно, давайте для начала рассмотрим азы, а именно, какие утилиты командной строки применяются для управления службами:

Утилита sc (я ее уже рассматривал частично в статье Получение списка служб средствами командной строки и сервера Windows Script Host), из нее нам понадобятся только некоторые команды, а именно:

Sc start Имя_Службы –запуск службы из командной строки
Sc pause Имя_Службы – приостановка службы Windows из командной строки
Sc continue Имя_Службы – возобновление службы из командной строки
Sc stop Имя_Службы – остановка службы из командной строки

Параметр Имя_Службы определяет имя сервиса. Так же стоит учитывать, что у сервиса могут быть зависимые от него службы.

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

Sc config Имя_Службы start= флаг

Обязательно после знака равенства ставьте пробел, иначе произойдет ошибка. Флаг может принимать три значения:

Auto – автоматический запуск при старте системы
Demand – ручной запуск
Disabled – отключение

Что бы запустить или остановить службу из командной строки, есть еще две утилиты:

net stop Имя_Службы
net start Имя_Службы

Скажу честно, в свое время на старом сайте я уже писал подобную статью, вник во все подробности данной темы, так сказать, но, материалы пришлось удалить, так как тот ресурс я закинул, а по правилам поисковой системы Яндекс не желательно, что бы два сайта одно владельца конкурировали в выдаче. Да и сама тема довольно скучная – так, для любителя. Поэтому, основной акцент данной публикации будет сделан на использование WMI для управления сервисами Windows и компонент WSO для реализации графического интерфейса. Ну а сейчас, еще немного лирики…

Не забывайте, что управлять службами Windows можно из Панели Управления, папка Администрирование, ярлык Службы.

Вообще, данную публикацию я бы физически не смог написать, если бы не два момента:

  1. Как только я начинал вести блог, то для реализации оконного интерфейса использовал программу LangMF, о нее довольно широкие возможности, но, как только я познакомился с компонентом WSO, то она мне больше не понадобилась.
  2. Как то мне взбрело в голову написать файловый менеджер с помощью языка jscript, с последующим переводом кода в область vbscript. Я накинул начальные штрихи, но … что то у меня не получалось, за советом я пошел на форум, и там мне все грамотно пояснили, и я понял … что ничего не понял. После того момента мне пришлось многое переучить и переосмыслить, как результат, я удалил практически все статьи на блоге и написал новые.

Хорошо, теперь настало время приступить к программированию, я сначала покажу пример на языке jscript. Далее дам его описанию и информативные картинки, ну а потом уже пример на языке vbscript.

В сценарии мы создали два массива def_column и data_array , давайте рассмотрим их:

def_columns – данный массив хранит в себе объекты, которые будут отвечать за обработку каждой колонки. Реализация массива объектов для языка vbscript (прочитайте “Урок 9 по VBScript: Массивы”) и jscript (прочитайте “ Урок 5 по JScript: Работа с массивами ”) разная, поэтому давайте разберем все по отдельности:

Реализация на jscript

def_columns = [<бъект_1>,<объект_2>,…,<объект_n>] – как видим, через запятую в фигурных скобках мы должны указать объекты, но не имена, а весь код. Каждый объект содержит информацию об имени колонки, ее размер, тип данных и функцию, которая отвечает за доступ к выбранному элементу в списке.

Реализация на vbscript

def_columns = Array(объект_1, объект_2, …, объект_n) – на первый взгляд все просто, нам только нужно прописать через переменную имена объектов (классов), но есть одно но. Сперва нам пришлось создать эти классы, и так как колонок пять, то и классов должно быть пять, как создавать классы, почитайте в статье “ Урок 8 по VBScript: Объекты и классы ”. Прямо перед формированием массива мы создали ссылки на классы, иначе никак.

data_array – данный массив как и предыдущий, состоит из объектов каждый объект хранит в себе информацию о выбранной службе (имя, статус, псевдоним и так далее). Каждый раз при попытке запустить службу из командной строки, остановить службу из командной строки, поставить на паузу или возобновить, или при попытке обработать выбранную службу Windows средствами WMI, будет происходить обращение к данному массиву по индексу и получение данных из текущего объекта. В большинстве случаев нам понадобится только одно свойство Name, всего объекты хранят пять свойств (число колонок).

Сам массив является динамическим, в примере на jscript добавление данных происходит с помощью функции push. В vbscript такой возможности нет, поэтому мне пришлось сначала определить длину коллекции со службами, и уже потом с помощью ключевого слова ReDim задать длину массива.

Все функции я затрагивать не буду, так как получиться целая петиция, да и меня самого, если честно такой огромный код отпугивает. Мы рассмотрим только управляющие функции, те, которые производят запуск служб из командной строки, остановка служб через командную строку, возобновление, приостановка, перевод в автоматический режим, перевод в ручной режит и отключение службы Windows.

function ServiceRun – отвечает за запуск. В теле функции сначало происходит проверка, выбрал ли пользователь служб (то есть, нажал на элемент списка), если нет – выводится предупреждающее сообщение, иначе, происходит вызов функции ServiceDialog() , данная функция выводит диалоговое окно, если вы нажнете ОК, то произойдет процесс выполнения заданной операции над служно, если нет – ничего не произойдет. Это необходимо, иначе можно наломать дров нечаянными кликами. Далее происходит процесс работы с WMI (подробней читайте в рубрике “ Windows Management Instrumentation”). Фактически, происходит подключение класса Win32_Service с фильтром по имени выбранной службы и отправка запроса. После происходит вывод кода возврата, если он равен нолю, значит все прошло успешно, иначе, что то не так. Я не стал тут приводить все коды, можете посмотреть их на странице Майкросовт.

function ServiceStop, function ServicePause, ServiceContinue – функции, отвечающие за остановку, приостановку и возобновление сервиса Windows. Код практически тот же, что у предыдущей функции, только меняется имя метода.

А вот сейчас начинается самое забавное..

function ServiceAuto – данная функция отвечает за перевод службы в автоматический режим. Я не стал использовать функционал WMI, а решил прибегнуть к утилитам командной строки. За весь процесс отвечает следующая сточка:

WshShell.Run «cmd.exe /c sc config » & cur_service_name & » start= Auto» & » > » + temp_file,1,true

Тут происходит запуск командной строки с параметром “/c”, то есть, она автоматически завершится после выполнения команды sc config. Однако, данные будут записываться во временный файл. После выполнения команды происходит открытие файла, что бы пользователь увидел, успешной была команда или нет.

ServiceManual() и ServiceDisable() – функции перевода службы Windows в ручной режим и ее отключения, код практически тот же, меняется только команда.

Ладно, вот код на vbscript:

Смотрите, если у вас возникнут вопросы по коду, то обязательно напишите в комментариях. Я сами примеры тестировал на системе Windows XP Sp3, и как они себя поведут на другой платформе не знаю. Не забывайте, что за создание оконного интерфейса отвечает компонент WindowSystemObject. При желании вы можете поэкспериментировать над кодом так, что бы можно было не средствами WMI, а через командную строку запустить, остановить, приостановить и возобновить службы Windows. И еще, а конечно не мастер, так что возможно с точки зрения профессионала код написан коряво.

Спасибо за внимание. Автор блога Владимир Баталий

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

  • Скрипт для активации windows 7
  • Скрипт для windows media player
  • Скрипт windows 10 отключение слежения
  • Скрипит звук на компьютере windows 7
  • Скриншоты windows 10 mobile