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

Получение списка служб средствами командной строки и сервера Windows Script Host Примеры скриптов и макросов для Word и WSH

Всем, привет, в данной статье мы научимся получать список служб 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:workservice.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:workservice.txt”

В свое время, на это я ставил точку и заканчивал статью, но… не на этом блоге.

Давайте сделаем так, что бы в диалоговом окне задать нужные параметры, и получить полный или отфильтрованный список, ясен пень, что в командной строке это не реализовать, то мы будет использовать сценарии сервера WSH и объект WindowSystemObject.

Вот как выглядит будущая форма для сценария:

Скрин части формы для сценария vbscript и jscript

Сперва мы напишем пример на языке vbscript, я в нем все разъясню, что бы было понятно, что к чему, а потом на его основе мы напишем пример на языке jscript.

И так, приступаем!!!

' ***********************************************************' Список служб командная строка' service.vbs' *********************************************************** OptionExplicit dim WSO, WshShell, FSOdim f, t, cur_dir, temp_file, edit1dim type_f, state_f, bufsize_f, ri_fdim Button_Analice, Button_Open, Button_Clearedim data_file '*************создаем ссылки на объекты*************     set WSO = CreateObject("Scripting.WindowSystemObject")     set WshShell = CreateObject("Wscript.Shell")     set FSO = CreateObject("Scripting.FileSystemObject")'*************************************************************************'Задаем начальные размеры и отступыset f = WSO.CreateForm(0,0,0,0)'Задаем через свойства ширину и высотуf.ClientWidth = 600f.ClientHeight = 650'Центрируем формуf.CenterControl()'Заголовок окнаf.Text = "Список служб командная строка"'нельзя менять размерыf.SizeGrip = false'нельзя развернуть формуf.MaximizeBox = false ' Текущий каталог     cur_dir = WshShell.CurrentDirectory' путь к временному файлу     temp_file = WShShell.ExpandEnvironmentStrings("%TEMP%") & "" & FSO.GetTempName 'Поле для вывода данныхset edit1 = f.CreateEdit(0,0,400,650,WSO.Translate("ES_MULTILINE"))edit1.ScrollBars = WSO.Translate("SS_BOTH")edit1.ReadOnly = trueedit1.WordWrap = true '**************************** Тип ********************************************f.TextOut 410,10,"Тип:"'Списокset type_f = f.CreateComboBox(480,10,100,20,WSO.Translate("CBS_DROPDOWNLIST"))      type_f.add("driver")type_f.add("service")type_f.add("all")type_f.ItemIndex=2'***************************************************************************************** '**************************** Статус ********************************************f.TextOut 410,40,"Статус:"'Списокset state_f = f.CreateComboBox(480,40,100,20,WSO.Translate("CBS_DROPDOWNLIST"))      state_f.add("active")state_f.add("inactive")state_f.add("all")state_f.ItemIndex=1'***************************************************************************************** '**************************** Буфер ********************************************f.TextOut 410,70,"Буфер:"'Поле для вводаset bufsize_f = f.CreateEdit(480,70,100,20,WSO.Translate("ES_MULTILINE"))'Задаем тип вводимых данныхbufsize_f.DataType=WSO.Translate("DT_INTEGER")bufsize_f.Text="4096"'***************************************************************************************** '**************************** Номер индекса ********************************************f.TextOut 410,100,"Индекс:"'Поле для вводаset ri_f = f.CreateEdit(480,100,100,20,WSO.Translate("ES_MULTILINE"))'Задаем тип вводимых данныхri_f.DataType=WSO.Translate("DT_INTEGER")ri_f.Text="0"'***************************************************************************************** '*******************************************************************' ' кнопка получения данныхset Button_Analice = f.CreateButton(480,130,100,25,"Анализировать")Button_Analice.OnClick = getref("Analize"' кнопка очистки данныхset Button_Cleare = f.CreateButton(480,160,100,25,"Очистить")Button_Cleare.OnClick = getref("Cleare"'кнопка открытия файла с даннымиset Button_Open = f.CreateButton(480,190,100,25,"Открыть")Button_Open.OnClick = getref("Open"set t = f.CreateHyperLink(450,230,250,25,"www.scriptcoding.ru") f.Show()WSO.Run() 'Очищаем поля вывода информацииfunction Cleare()     edit1.Text=""     data_file=""endfunction 'Отправка запросаfunction Analize()dim type_date, state_date, bufsize_date, ri_datedim get_file_data     Cleare()     type_date = " type= " & type_f.Text     state_date = " state= " & state_f.Text     bufsize_date = " bufsize= " & bufsize_f.Text     ri_date = " ri= " &  ri_f.Text     if type_f.Text = "service"then type_date = ""endif     if state_f.Text = "active"then state_date = ""endif 'запуск командной строки для получения списка служб с выводом данных в файл     WshShell.Run "cmd.exe /c sc query" & type_date & state_date & bufsize_date & ri_date & " > " & temp_file,1,true '***********открываем файл для считывания данных*********************     set get_file_data=FSO.OpenTextFile(temp_file, 1, false)     data_file = get_file_data.ReadAll     get_file_data.Close'***********************************************************************************      edit1.Text = data_fileendfunction functionOpen()' открываем временный файл     WshShell.Run "wordpad.exe " & temp_fileendfunction

И так, в комментариях я некоторые пункты разъяснил, поэтому сконцентрируемся на главном. Фактически, за весь процесс получения списка служб в командной строке отвечает функция Analize(), давайте остановимся на ней подробно:

Переменные type_date, state_date, bufsize_date и ri_date хранять в себе значения, которые прописаны в полях и списках формы, тут мы сразу вставляем имя флага и знак равенства. Далее происходит проверка флагов type и state, дело в том, что если им присвоить значения по умолчанию, то возникнет ошибка в самой командной строке, поэтому, все значения по умолчанию мы заменяем на пустую строку. Далее, используя функцию Run объекта WScript.Shell мы запускаем командную строку с параметрами для получения списка служб, переменная temp_file хранит путь к временному файлу, именно в него будет направлен вывод. Далее происходит открытие временного файла, считывание из него данных, и их запись в поле вывода на форме. При нажатии на кнопку Открыть, происходит вызов функции Open, которая отвечает за открытие временного файла программой wordpad.exe.

Скачать архив с примерами

А вот аналогичный пример, но уже на языке jscript:

// ***********************************************************// Список служб командная строка// service.js// *********************************************************** var WSO, WshShell, FSO;var f, t, cur_dir, temp_file, edit1;var type_f, state_f, bufsize_f, ri_f;var Button_Analice, Button_Open, Button_Cleare;var data_file; //*************создаем ссылки на объекты***********************WshShell = WScript.CreateObject("Wscript.Shell");FSO = WScript.CreateObject("Scripting.FileSystemObject");WSO = WScript.CreateObject("Scripting.WindowSystemObject");//****************************************************************************** //Задаем начальные размеры и отступыf = WSO.CreateForm(0,0,0,0);//Задаем через свойства ширину и высотуf.ClientWidth=600;f.ClientHeight=650;//Центрируем формуf.CenterControl();//Заголовок окнаf.Text="Список служб командная строка";//нельзя менять размерыf.SizeGrip=false;//нельзя развернуть формуf.MaximizeBox=false; // Текущий каталог     cur_dir = WshShell.CurrentDirectory;// путь к временному файлу     temp_file = WshShell.ExpandEnvironmentStrings("%TEMP%")+"\"+ FSO.GetTempName(); //Поле для вывода данныхedit1 = f.CreateEdit(0,0,400,650,WSO.Translate("ES_MULTILINE"));edit1.ScrollBars= WSO.Translate("SS_BOTH");edit1.ReadOnly=true;edit1.WordWrap=true; //**************************** Тип ********************************************f.TextOut(410,10,"Тип:");//Списокtype_f = f.CreateComboBox(480,10,100,20,WSO.Translate("CBS_DROPDOWNLIST"));           type_f.add("driver");type_f.add("service");type_f.add("all");type_f.ItemIndex=2;//***************************************************************************************** //**************************** Статус ********************************************f.TextOut(410,40,"Статус:");//Списокstate_f = f.CreateComboBox(480,40,100,20,WSO.Translate("CBS_DROPDOWNLIST"));          state_f.add("active");state_f.add("inactive");state_f.add("all");state_f.ItemIndex=1;//***************************************************************************************** //**************************** Буфер ********************************************f.TextOut(410,70,"Буфер:");//Поле для вводаbufsize_f = f.CreateEdit(480,70,100,20,WSO.Translate("ES_MULTILINE"));//Задаем тип вводимых данныхbufsize_f.DataType=WSO.Translate("DT_INTEGER");bufsize_f.Text="4096";//***************************************************************************************** //**************************** Номер индекса ********************************************f.TextOut(410,100,"Индекс:");//Поле для вводаri_f = f.CreateEdit(480,100,100,20,WSO.Translate("ES_MULTILINE"));//Задаем тип вводимых данныхri_f.DataType=WSO.Translate("DT_INTEGER");ri_f.Text="0";//***************************************************************************************** //*******************************************************************// // кнопка получения данныхButton_Analice = f.CreateButton(480,130,100,25,"Анализировать");Button_Analice.OnClick= Analize; // кнопка очистки данныхButton_Cleare = f.CreateButton(480,160,100,25,"Очистить");Button_Cleare.OnClick= Cleare; //кнопка открытия файла с даннымиButton_Open = f.CreateButton(480,190,100,25,"Открыть");Button_Open.OnClick= Open; t = f.CreateHyperLink(450,230,250,25,"www.scriptcoding.ru"); f.Show();WSO.Run(); //Очищаем поля вывода информацииfunction Cleare(){     edit1.Text="";     data_file="";} //Отправка запросаfunction Analize(){     Cleare()     var type_date =" type= "+ type_f.Text;     var state_date =" state= "+ state_f.Text;     var bufsize_date =" bufsize= "+ bufsize_f.Text;     var ri_date =" ri= "+  ri_f.Text;      var type_date, state_date, bufsize_date, ri_date, get_file_data      if(type_f.Text=="service"){type_date ="";}     if(state_f.Text=="active"){state_date ="";} //запуск командной строки для получения списка служб с выводом данных в файл     WshShell.Run("cmd.exe /c sc query"+ type_date + state_date + bufsize_date + ri_date +" > "+ temp_file,1,true); //***********открываем файл для считывания данных*********************     get_file_data=FSO.OpenTextFile(temp_file,1,false)     data_file = get_file_data.ReadAll()     get_file_data.Close()//***********************************************************************************      edit1.Text= data_file} function Open(){// открываем временный файл     WshShell.Run("wordpad.exe "+ temp_file);}

В принципе, тут нет ничего сложного, если что, задавайте вопросы в комментариях, буду рад ответить, также буду рад, если подпишитесь на обновление блога. Ну что же, мы рассмотрели примеры получения списка служб средствами командной строки и Windows Script Host.

Оцените статью
Технологии программирования и ведение блога
Добавить комментарий