Всем, привет, в данной статье мы научимся получать список служб 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.
И так, приступаем!!!
' *********************************************************** ' Список служб командная строка ' service.vbs ' *********************************************************** Option Explicit dim WSO, WshShell, FSO dim f, t, cur_dir, temp_file, edit1 dim type_f, state_f, bufsize_f, ri_f dim Button_Analice, Button_Open, Button_Cleare dim 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 = 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 'Поле для вывода данных set 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,"Тип:" 'Список 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,"scriptcoding.ru") f.Show() WSO.Run() 'Очищаем поля вывода информации function Cleare() edit1.Text="" data_file="" end function 'Отправка запроса function Analize() dim type_date, state_date, bufsize_date, ri_date dim 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 = "" end if if state_f.Text = "active" then state_date = "" end if 'запуск командной строки для получения списка служб с выводом данных в файл 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_file end function function Open() ' открываем временный файл WshShell.Run "wordpad.exe " & temp_file end function |
И так, в комментариях я некоторые пункты разъяснил, поэтому сконцентрируемся на главном. Фактически, за весь процесс получения списка служб в командной строке отвечает функция 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,"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.