Получение списка служб средствами командной строки и сервера 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
' ***********************************************************
 
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.

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