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

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

Продолжая тему предыдущей статьи, мы рассмотрим, как получить список служб 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 с примером из предыдущей статьи.

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