Получаем список служб Windows средствами WMI и WSH

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

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

И так, приступим, как я уже сказал, наша задача – получение списка служб Windows, используя как математический инструмент – WMI, как графический инструмент – объект WindowSystemObject. Связующим звеном будет сервер Windows Script Host. Давайте сделаем так, сначала я покажу код на языке vbscript, после него укажу основные моменты, на которые стоит обратить внимание, далее – будет синтаксис языка jscript, тут я тоже укажу на ключевые моменты.

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

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
' ***********************************************************' Список служб Windows средствами WMI' spisok-sluzb-windows.vbs' ***********************************************************OptionExplicit dim WSO, WshShell, FSO, objWMIServicedim f, t, TempPath, ListBoxdim status_f, listdim Button_Analice, Button_Open, Button_Cleare '*************создаем ссылки на объекты***********************set WshShell = WScript.CreateObject("Wscript.Shell")set FSO = WScript.CreateObject("Scripting.FileSystemObject")set WSO = WScript.CreateObject("Scripting.WindowSystemObject")' получаем доступ к инструментарию Windowsset objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\.rootcimv2")'****************************************************************************** 'Задаем начальные размеры и отступыset f = WSO.CreateForm(0,0,0,0)'Задаем через свойства ширину и высотуf.ClientWidth = 600f.ClientHeight = 650'Центрируем формуf.CenterControl()'Заголовок окнаf.Text = "Список служб Windows"'нельзя менять размерыf.SizeGrip = false'нельзя развернуть формуf.MaximizeBox = false ' путь к временному файлуTempPath = WshShell.ExpandEnvironmentStrings("%TEMP%") & "" & FSO.GetTempName 'Список с выводимыми даннымиset ListBox = f.CreateListBox(0,0,400,645)'прокруткаListBox.ScrollBars = WSO.Translate("SS_BOTH"'**************************** Статус ********************************************set status_f = f.CreateComboBox(400,10,200,20,WSO.Translate("CBS_DROPDOWNLIST"))    status_f.add("Статус")status_f.add("Активные")status_f.add("Остановленные")status_f.add("Свойства")status_f.add("Можно остановить")status_f.add("Можно приостановить")status_f.ItemIndex=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()     ListBox.Clear()     list=""endfunction 'Отправка запросаfunction Analize()dim sts, colItems     sts = status_f.ItemIndex     Cleare()     'определяем выбраное значение     selectcase sts                 case 0                            set colItems = objWMIService.ExecQuery("Select * From Win32_Service")                            ServiceBasicList(colItems)                 case 1                            set colItems = objWMIService.ExecQuery("Select * From Win32_Service Where State <> 'Stopped'")                            ServiceBasicList(colItems)                 case 2                            set colItems = objWMIService.ExecQuery("Select * From Win32_Service Where State <> 'Running'")                            ServiceBasicList(colItems)                 case 3                            set colItems = objWMIService.ExecQuery("Select * From Win32_Service")                            ServiceFullList(colItems)                 case 4                            set colItems = objWMIService.ExecQuery("Select * From Win32_Service Where AcceptStop = True")                            ServiceBasicList(colItems)                 caseelse                            set colItems = objWMIService.ExecQuery("Select * From Win32_Service Where AcceptPause = True")                            ServiceBasicList(colItems)     endselectendfunction ' получение базового списка служб Windowsfunction ServiceBasicList(strcoll)dim objitem     'перебираем все элементы коллекции     ForEach objItem in strcoll                 'добавляем значение в список поля                 ListBox.Add(objItem.DisplayName & "                    " & objItem.State)                 ' формируем базовый список                 list = list & objItem.DisplayName & vbTab & objItem.State & vbCrLf     Next     TempFile(list)endfunction ' получение расширеного списка служб Windowsfunction ServiceFullList(strcoll)dim objitem     ForEach objItem in strcoll                  list = list & "Имя" & vbTab & objItem.Name & vbCrLf                 ListBox.Add("Имя         " & objItem.Name)                  list = list & "Тип" & vbTab & objItem.ServiceType & vbCrLf                 ListBox.Add("Тип        " & objItem.ServiceType)                  list = list & "Состояние" & vbTab & objItem.State & vbCrLf                 ListBox.Add("Состояние                " & objItem.State)                  list = list & "Код выхода" & vbTab & objItem.ExitCode & vbCrLf                 ListBox.Add("Код выхода              " & objItem.ExitCode)                  list = list & "ID процесса" & vbTab & objItem.ProcessID & vbCrLf                 ListBox.Add("ID процесса                " & objItem.ProcessID)                  list = list & "Взможнсть Паузы" & vbTab & objItem.AcceptPause & vbCrLf                 ListBox.Add("Взможнсть Паузы              " & objItem.AcceptPause)                  list = list & "Возможность Отстановки" & vbTab & objItem.AcceptStop & vbCrLf                 ListBox.Add("Возможность Отстановки            " & objItem.AcceptStop)                  list = list & "Опции" & vbTab & objItem.Caption & vbCrLf                 ListBox.Add("Опции             " & objItem.Caption)                  list = list & "Описание" & vbTab & objItem.Description & vbCrLf                 ListBox.Add("Описание             " & objItem.Description)                  list = list & "DesktopInteract" & vbTab & objItem.DesktopInteract & vbCrLf                 ListBox.Add("DesktopInteract           " & objItem.DesktopInteract)                  list = list & "Отбажаемое имя" & vbTab & objItem.DisplayName & vbCrLf                 ListBox.Add("Отбажаемое имя             " & objItem.DisplayName)                  list = list & "Обработка ошибок" & vbTab & objItem.ErrorControl & vbCrLf                 ListBox.Add("Обработка ошибок              " & objItem.ErrorControl)                  list = list & "Путь" & vbTab & objItem.PathName & vbCrLf                 ListBox.Add("Путь           " & objItem.PathName)                  list = list & "Запуск" & vbTab & objItem.Started & vbCrLf                 ListBox.Add("Запуск        " & objItem.Started)                  list = list & "Стартовый режим" & vbTab & objItem.StartMode & vbCrLf                 ListBox.Add("Стартовый режим       " & objItem.StartMode)                  list = list & "Стартовое имя" & vbTab & objItem.StartName & vbCrLf & vbCrLf                 ListBox.Add("Стартовое имя            " & objItem.StartName)                 ListBox.Add("")                 ListBox.Add("")     Next     TempFile(list)endfunction 'Функция создания временного файла с даннымиfunction TempFile(StrToFile)dim TxtFile    set TxtFile = FSO.CreateTextFile(TempPath)    TxtFile.WriteLine(StrToFile)    TxtFile.Closeendfunction ' Функция открытия временного файлаfunctionOpen()     WshShell.Run "wordpad.exe " & TempPathendfunction

Не стоит пугаться, тут все просто! Всем процессом управляют шесть функций, давайте их рассмотрим:

Cleare() – тут всего две строки, ListBox.Clear() – очищает поле со списком служб системы Windoows и list="" – обнуляем значение переменной, данная переменная хранит список всех служб и с нее считываются данные и записываются во временный файл.

Analize() – в целом, тут у нас используется только оператор выбора select case, он обрабатывает переменную sts, которая хранит в себе числовое значение (на форме есть выпадающий список, при выборе того или иного элемента, возвращается порядковый номер). В зависимости от числового значения. Нужно выполнить ту или иную операцию, давайте посмотрим, за что должно отвечать каждое число:

0 – значение “Статус”, будет выводиться список всех Windows служб в формате “ИМЯ    СТАТУС”, под словом статус предполагается строка Активная (Работает) или Пассивная (Отключена).

1 и 2 – состветственно, список активных и остановленных служб

3 – это самый интересный выбор, так как тут нужно показать полное описание для каждой службы.

4 и 5 – список тех Windows служб, которые можно остановить и приостановить соответственно.

Обратите внимание, что в зависимости от значения, переменная colItems (она является ссылкой на коллекцию служб) меняет свое значение:

objWMIService.ExecQuery("Select * From Win32_Service")

objWMIService.ExecQuery("Select * From Win32_Service Where State <> 'Stopped'")
objWMIService.ExecQuery ("Select * From Win32_Service Where State <> 'Running'")
objWMIService.ExecQuery("Select * From Win32_Service Where AcceptStop = True")
objWMIService.ExecQuery("Select * From Win32_Service Where AcceptPause = True")

Как видите, отличие заключается только в фильтрах(Where), если вы работали с SQL запросами, то код с легкостью поймете.

Обратите внимание, что для всех значений происходит вызов функции ServiceBasicList(colItems) и только для одного ServiceFullList(colItems), если честно, то можно прописать ServiceFullList(colItems) для всех вариантов переменной colItems.

ServiceBasicList(colItems) – данная функция при выводе списка Windows служб, показывает только их статус.

ServiceFullList(colItems) – а тут происходит более расширенный вывод данных

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

TempFile(list) – данная функция нужна для того, что бы записать весть список полученных значений во временный файл, открыть его мы сможем нажав на кнопку открыть.

Ладно, не буду вникать во все подробности, а то и так, кочаете архив с примером, а спасибо не скажите за проделанную работу….

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

Ну и пример на языке jscript:

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
// ***********************************************************// Список служб Windows средствами WMI// spisok-sluzb-windows.js// *********************************************************** var WSO, WshShell, FSO, objWMIService;var f, t, TempPath, ListBox;var status_f, list;var Button_Analice, Button_Open, Button_Cleare; //*************создаем ссылки на объекты***********************WshShell = WScript.CreateObject("Wscript.Shell");FSO = WScript.CreateObject("Scripting.FileSystemObject");WSO = WScript.CreateObject("Scripting.WindowSystemObject");// получаем доступ к инструментарию WindowsobjWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2");//****************************************************************************** //Задаем начальные размеры и отступыf = WSO.CreateForm(0,0,0,0);//Задаем через свойства ширину и высотуf.ClientWidth=600;f.ClientHeight=650;//Центрируем формуf.CenterControl();//Заголовок окнаf.Text=" Список служб Windows";//нельзя менять размерыf.SizeGrip=false;//нельзя развернуть формуf.MaximizeBox=false; // путь к временному файлуTempPath = WshShell.ExpandEnvironmentStrings("%TEMP%")+"\"+ FSO.GetTempName(); //Список с выводимыми даннымиListBox = f.CreateListBox(0,0,400,645);//прокруткаListBox.ScrollBars= WSO.Translate("SS_BOTH"); //**************************** Статус ********************************************status_f = f.CreateComboBox(400,10,200,20,WSO.Translate("CBS_DROPDOWNLIST"));         status_f.add("Статус");status_f.add("Активные");status_f.add("Остановленные");status_f.add("Свойства");status_f.add("Можно остановить");status_f.add("Можно приостановить");status_f.ItemIndex=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(){     ListBox.Clear();     list="";} //Отправка запросаfunction Analize(){var sts = status_f.ItemIndex, colItems;     Cleare()     //определяем выбраное значение     switch(sts){                 case0:                            colItems =new Enumerator(objWMIService.ExecQuery("Select * From Win32_Service"));                            ServiceBasicList(colItems);                            break;                 case1:                            colItems =new Enumerator(objWMIService.ExecQuery("Select * From Win32_Service Where State <> 'Stopped'"));                            ServiceBasicList(colItems);                            break;                 case2:                            colItems =new Enumerator(objWMIService.ExecQuery("Select * From Win32_Service Where State <> 'Running'"));                            ServiceBasicList(colItems);                            break;                 case3:                            colItems =new Enumerator(objWMIService.ExecQuery("Select * From Win32_Service"));                            ServiceFullList(colItems);                            break;                 case4:                            colItems =new Enumerator(objWMIService.ExecQuery("Select * From Win32_Service Where AcceptStop = True"));                            ServiceBasicList(colItems);                            break;                 default:                            colItems =new Enumerator(objWMIService.ExecQuery("Select * From Win32_Service Where AcceptPause = True"));                            ServiceBasicList(colItems);     }} // получение базового списка служб Windowsfunction ServiceBasicList(strcoll){     //перебираем все элементы коллекции     for(;!strcoll.atEnd(); strcoll.moveNext()){                 objItem = strcoll.item();                 //добавляем значение в список поля                 ListBox.Add(objItem.DisplayName+"                    "+ objItem.State);                 // формируем базовый список                 list += objItem.DisplayName+"tt"+ objItem.State+"n";     }     TempFile(list);} // получение расширеного списка служб Windowsfunction ServiceFullList(strcoll){     for(;!strcoll.atEnd(); strcoll.moveNext()){                 objItem = strcoll.item();                  list +="Имяtt"+ objItem.Name+"n";                 ListBox.Add("Имя         "+ objItem.Name);                  list +="Типtt"+ objItem.ServiceType+"n";                 ListBox.Add("Тип        "+ objItem.ServiceType);                  list +="Состояниеtt"+ objItem.State+"n";                 ListBox.Add("Состояние                "+ objItem.State);                  list +="Код выходаtt"+ objItem.ExitCode+"n";                 ListBox.Add("Код выхода              "+ objItem.ExitCode);                  list +="ID процессаtt"+ objItem.ProcessID+"n";                 ListBox.Add("ID процесса                "+ objItem.ProcessID);                  list +="Взможнсть Паузыtt"+ objItem.AcceptPause+"n";                 ListBox.Add("Взможнсть Паузы              "+ objItem.AcceptPause);                  list +="Возможность Отстановкиtt"+ objItem.AcceptStop+"n";                 ListBox.Add("Возможность Отстановки            "+ objItem.AcceptStop);                  list +="Опцииtt"+ objItem.Caption+"n";                 ListBox.Add("Опции             "+ objItem.Caption);                  list +="Описаниеtt"+ objItem.Description+"n";                 ListBox.Add("Описание             "+ objItem.Description);                  list +="DesktopInteracttt"+ objItem.DesktopInteract+"n";                 ListBox.Add("DesktopInteract           "+ objItem.DesktopInteract);                  list +="Отбажаемое имяtt"+ objItem.DisplayName+"n";                 ListBox.Add("Отбажаемое имя             "+ objItem.DisplayName);                  list +="Обработка ошибокtt"+ objItem.ErrorControl+"n";                 ListBox.Add("Обработка ошибок              "+ objItem.ErrorControl);                  list +="Путьtt"+ objItem.PathName+"n";                 ListBox.Add("Путь           "+ objItem.PathName);                  list +="Запускtt"+ objItem.Started+"n";                 ListBox.Add("Запуск        "+ objItem.Started);                  list +="Стартовый режимtt"+ objItem.StartMode+"n";                 ListBox.Add("Стартовый режим       "+ objItem.StartMode);                  list +="Стартовое имяtt"+ objItem.StartName+"nn";                 ListBox.Add("Стартовое имя            "+ objItem.StartName);                 ListBox.Add("");                 ListBox.Add("");     }     TempFile(list);} //Функция создания временного файла с даннымиfunction TempFile(StrToFile){var TxtFile;    TxtFile = FSO.CreateTextFile(TempPath);    TxtFile.WriteLine(StrToFile);    TxtFile.Close();}   // Функция открытия временного файлаfunction Open(){     WshShell.Run("wordpad.exe "+ TempPath);}

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

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