Продолжая тему предыдущей статьи, мы рассмотрим, как получить список служб Windows средствами инструментария Windows. Вообще, инструментарий Windows (о нем чуть позже) – это практически неограниченные возможности, так как он позволяет получить доступ практически ко всем элементам системы, и является идеальным инструментом для администрирования. Конечно, графический интерфейс с ним не построишь, но это не проблема, так как всегда можно использовать халявые библиотеки для формирования диалоговых окон с различным набором компонентов.
И так, приступим, как я уже сказал, наша задача – получение списка служб Windows, используя как математический инструмент – WMI, как графический инструмент – объект WindowSystemObject. Связующим звеном будет сервер Windows Script Host. Давайте сделаем так, сначала я покажу код на языке vbscript, после него укажу основные моменты, на которые стоит обратить внимание, далее – будет синтаксис языка jscript, тут я тоже укажу на ключевые моменты.
И так, приступим!!!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 |
' *********************************************************** ' Список служб Windows средствами WMI ' spisok-sluzb-windows.vbs ' *********************************************************** Option Explicit dim WSO, WshShell, FSO, objWMIService dim f, t, TempPath, ListBox dim status_f, list dim Button_Analice, Button_Open, Button_Cleare '*************создаем ссылки на объекты*********************** set WshShell = WScript.CreateObject("Wscript.Shell") set FSO = WScript.CreateObject("Scripting.FileSystemObject") set WSO = WScript.CreateObject("Scripting.WindowSystemObject") ' получаем доступ к инструментарию Windows set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2") '****************************************************************************** 'Задаем начальные размеры и отступы set 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 'Список с выводимыми данными 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,"scriptcoding.ru") f.Show() WSO.Run() 'Очищаем поля вывода информации function Cleare() ListBox.Clear() list="" end function 'Отправка запроса function Analize() dim sts, colItems sts = status_f.ItemIndex Cleare() 'определяем выбраное значение select case 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) case else set colItems = objWMIService.ExecQuery("Select * From Win32_Service Where AcceptPause = True") ServiceBasicList(colItems) end select end function ' получение базового списка служб Windows function ServiceBasicList(strcoll) dim objitem 'перебираем все элементы коллекции For Each objItem in strcoll 'добавляем значение в список поля ListBox.Add(objItem.DisplayName & " " & objItem.State) ' формируем базовый список list = list & objItem.DisplayName & vbTab & objItem.State & vbCrLf Next TempFile(list) end function ' получение расширеного списка служб Windows function ServiceFullList(strcoll) dim objitem For Each 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) end function 'Функция создания временного файла с данными function TempFile(StrToFile) dim TxtFile set TxtFile = FSO.CreateTextFile(TempPath) TxtFile.WriteLine(StrToFile) TxtFile.Close end function ' Функция открытия временного файла function Open() WshShell.Run "wordpad.exe " & TempPath end function |
Не стоит пугаться, тут все просто! Всем процессом управляют шесть функций, давайте их рассмотрим:
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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 |
// *********************************************************** // Список служб 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"); // получаем доступ к инструментарию Windows objWMIService = 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,"scriptcoding.ru"); f.Show(); WSO.Run(); //Очищаем поля вывода информации function Cleare(){ ListBox.Clear(); list=""; } //Отправка запроса function Analize(){ var sts = status_f.ItemIndex, colItems; Cleare() //определяем выбраное значение switch (sts){ case 0: colItems = new Enumerator(objWMIService.ExecQuery("Select * From Win32_Service")); ServiceBasicList(colItems); break; case 1: colItems = new Enumerator(objWMIService.ExecQuery("Select * From Win32_Service Where State <> 'Stopped'")); ServiceBasicList(colItems); break; case 2: colItems = new Enumerator(objWMIService.ExecQuery("Select * From Win32_Service Where State <> 'Running'")); ServiceBasicList(colItems); break; case 3: colItems = new Enumerator(objWMIService.ExecQuery("Select * From Win32_Service")); ServiceFullList(colItems); break; case 4: 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); } } // получение базового списка служб Windows function ServiceBasicList(strcoll){ //перебираем все элементы коллекции for (; !strcoll.atEnd(); strcoll.moveNext()){ objItem = strcoll.item(); //добавляем значение в список поля ListBox.Add(objItem.DisplayName + " " + objItem.State); // формируем базовый список list += objItem.DisplayName + "\t\t" + objItem.State + "\n"; } TempFile(list); } // получение расширеного списка служб Windows function ServiceFullList(strcoll){ for (; !strcoll.atEnd(); strcoll.moveNext()){ objItem = strcoll.item(); list += "Имя\t\t" + objItem.Name + "\n"; ListBox.Add("Имя " + objItem.Name); list += "Тип\t\t" + objItem.ServiceType + "\n"; ListBox.Add("Тип " + objItem.ServiceType); list += "Состояние\t\t" + objItem.State + "\n"; ListBox.Add("Состояние " + objItem.State); list += "Код выхода\t\t" + objItem.ExitCode + "\n"; ListBox.Add("Код выхода " + objItem.ExitCode); list += "ID процесса\t\t" + objItem.ProcessID + "\n"; ListBox.Add("ID процесса " + objItem.ProcessID); list += "Взможнсть Паузы\t\t" + objItem.AcceptPause + "\n"; ListBox.Add("Взможнсть Паузы " + objItem.AcceptPause); list += "Возможность Отстановки\t\t" + objItem.AcceptStop + "\n"; ListBox.Add("Возможность Отстановки " + objItem.AcceptStop); list += "Опции\t\t" + objItem.Caption + "\n"; ListBox.Add("Опции " + objItem.Caption); list += "Описание\t\t" + objItem.Description + "\n"; ListBox.Add("Описание " + objItem.Description); list += "DesktopInteract\t\t" + objItem.DesktopInteract + "\n"; ListBox.Add("DesktopInteract " + objItem.DesktopInteract); list += "Отбажаемое имя\t\t" + objItem.DisplayName + "\n"; ListBox.Add("Отбажаемое имя " + objItem.DisplayName); list += "Обработка ошибок\t\t" + objItem.ErrorControl + "\n"; ListBox.Add("Обработка ошибок " + objItem.ErrorControl); list += "Путь\t\t" + objItem.PathName + "\n"; ListBox.Add("Путь " + objItem.PathName); list += "Запуск\t\t" + objItem.Started + "\n"; ListBox.Add("Запуск " + objItem.Started); list += "Стартовый режим\t\t" + objItem.StartMode + "\n"; ListBox.Add("Стартовый режим " + objItem.StartMode); list += "Стартовое имя\t\t" + objItem.StartName + "\n\n"; 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 с примером из предыдущей статьи.