Класс Win32_Process служит для работы с процессами Windows. С его помощью можно получить обширный список параметров заданного процесса или целой группы. А также получить имя учетной записи и ее идентификатор, создать новый процесс, завершить заданный, изменить приоритет и многое другое.
Сначала я приведу вам описание класса Win32_Process, а потом покажу примеры с его использованием.
Свойства класса Win32_Process
Caption – Содержит описание процесса (короткая форма).
CommandLine – Содержит полный путь к приложению (если оно существует), которое отвечает за запуск процесса.
CreationClassName – имя класса, который создал процесс, как правило – Win32_Process
CreationDate – хранит в себе значение в формате дата, собственно время начала запуска процесса
CSCreationClassName – как и свойство CreationClassName выводит имя класса.
CSName – данное свойство позволяет получить имя компьютера, на котором запущен процесс.
Description — Содержит описание процесса (полная форма).
ExecutablePath – фактически, как и свойство CommandLine, хранит полный путь к исполняемому файлу процесса.
ExecutionState – это свойство не нашло реализации и всегда возвращает пустое значение (null)
Handle – описатель процесса, фактически содержит такое же значение, как и свойство ProcessID
HandleCount – количественное значение дескрипторов, которые открыты в данный момент текущим процессом.
InstallDate – дата создания объекта, объект может быть создан и без записи значения в это свойство, тогда свойство вернет null
KernelModeTime – время работы в режиме ядра
UserModeTime – время работы в пользовательском режиме, данные свойства, как и KernelModeTime позволяют определить загрузку процессора заданным процессом.
MaximumWorkingSetSize — Максимально возможный размер рабочего набора процесса (рабочий набор процесса — это набор страниц, доступных процессу в физической оперативной памяти)
MinimumWorkingSetSize — Минимально возможный размер рабочего набора процесса
Name – свойство хранит имя процесса и как правило, совпадает со значением свойства Caption.
OSCreationClassName – вернет имя класса.
OSName – содержит имя ОС
OtherOperationCount — Число выполненных операций ввода/вывода, отличных от операции чтения или записи
OtherTransferCount — Размер данных, переданных в процессе выполнения операций, отличных от операции чтения или записи.
PageFaults – количество ошибок, которые возникают при обращении к блоку памяти.
PageFileUsage – определяет размер в байтах части файла подкачки, что используется на данный момент процессом.
ParentProcessID – свойство позволяет получить идентификатор родительского процесса (того, что создал текущий процесс).
PeakPageFileUsage – хранит информацию в байтах части файла подкачки, что использовалась на протяжении работы всего процесса.
PeakVirtualSize — Максимальное значение размера виртуального адресного пространства, что использовалось процессом единовременно.
PeakWorkingSetSize — Максимальное значение размера рабочего набора процесса за все время работы
Priority – данное свойство позволяет узнать приоритет процесса, оно может принимать значение от 0 (минимум) до 31(максимум).
ProcessID – собственно, идентификатор процесса, в большинстве случаев, именно данный параметр служит для определения процесса, так как является всегда уникальным из целого списка.
ReadOperationCount — количество выполненных процессом операций чтения
ReadTransferCount — размер прочитанных данных
ThreadCount — количество активных потоков в процессе
VirtualSize — Текущий размер виртуального адресного пространства в байтах, используемого процессом
WindowsVersion – версия сборки ОС.
WorkingSetSize — Размер памяти в байтах, который нужно для успешного выполнения процесса в ОС, которая использует страничную организацию памяти
WriteOperationCount – количество выполненных процессом операций записи
WriteTransferCount — Размер записанных данных
Методы класса Win32_Process
AttachDebugger() – позволяет запустить отладчик, который установлен в система по умолчанию для отладки системы.
Create(CommandLine, CurrentDirectory, ProcessStartupInformation, ProcessId) – данный метод позволяет создать новый процесс. Метод вернет значение 0 (при успехе) или код ошибки. Как видим методу передаются 4 параметры, первые три являются входящими, а четвертый (ProcessId) – будет хранить идентификатор процесса, присвоенный системой.
CommandLine – путь к файлу, который породит процесс
CurrentDirectory – рабочий каталог, который, используемый созданным процессом, при отсутствии данного параметра, будет приниматься значение из параметра CommandLine.
ProcessStartupInformation — начальная конфигурация процесса (объект класса Win32_ProcessStartup), при отсутствии параметра будет приниматься пустая строка ("").
GetOwner(User, Domain) – данный метод полезен тем, что позволяет получить имя пользователя (User) создавшего процесс и имя домена в котором запущен текущий процесс (Domain). Стоит обратить внимание, что не важно, какие имена переменных передаются методу. Схема вызова метода GetOwner для языка vbscript и jscript разная, как это происходит мы рассмотрим ниже.
GetOwnerSid(Sid) – метод принимает всего один параметр, в котором будет храниться идентификатор безопасности (Security IDentifier, SID) владельца процесса
SetPriority(Priority) – метод позволяет задать приоритет процесса. Параметр Priority принимает следующие значения: 64 (низкий), 16 384 (ниже среднего), 32 (средний), 32 768 (выше среднего), 128 (высокий), 256 (процесс будет выполняться в реальном времени – может подвесить систему)
Terminate(Reason) – позволяет принудительно завершить текущий процесс и все дочерние. Метод, как и все остальные, вернет ноль при успехе или код ошибки при неудачи. Параметр позволяет задать код выхода.
Хорошо, теорию прошли, теперь можно и попрактиковаться.
Получаем имя процесса, SID и имя домена/пользователя (класс Win32_Process, язык JScript)
//---------------------------------------------------- // Получаем имя процесса, SID и имя домена/пользователя // класс Win32_Process // Win32-Process-list.js //---------------------------------------------------- var objWMI, colItems, objItem, output, output_SID; var list = "Список процессов Windows\n\n"; // получаем доступ к пространству имен WMI objWMI = GetObject("winmgmts:\\\\.\\root\\cimv2"); //Формируем коллекцию процессов с помощью класса Win32_Process colItems = new Enumerator(objWMI.ExecQuery("Select * from Win32_Process")); // начинаем перебор коллекции for (; !colItems.atEnd(); colItems.moveNext()){ objItem = colItems.item(); output = objItem.ExecMethod_("GetOwner"); output_SID = objItem.ExecMethod_("GetOwnerSid"); list += objItem.Name + "\t\t" + output_SID.Sid + "\t\t" + output.Domain + "\\" + output.User + "\n"; } ShowInNotepad(list); //Функция для открытия файла с данными класса Win32_Process function ShowInNotepad(StrToFile){ var temp_file, txt_file //Ссылка на объект FileSystemObject var FSO = WScript.CreateObject("Scripting.FileSystemObject"); // //Ссылка на объект WScript.Shell var WshShell = WScript.CreateObject("WScript.Shell"); // Путь к временному файлу temp_file = WshShell.ExpandEnvironmentStrings("%TEMP%") + "\\" + FSO.GetTempName(); //Создаем временный файл txt_file = FSO.CreateTextFile(temp_file); // Записываем данные txt_file.WriteLine(StrToFile); // Закрываем файл txt_file.Close(); // Открываем документ программой wordpad.exe WshShell.Run ("wordpad.exe " + temp_file); } |
Сперва происходит подключение кпространству имен WMI CIMv2 с помощью функции GetObject, результат будет храниться в переменной objWMI. Видим, что для экранизации косой черты, мы ее прописываем дважды. Далее нам нужно обработать коллекцию, которая возвращается после вызова класса Win32_Process. В языке jscript для обработки коллекции служит встроенный объект Enumerator (смотри статью “Урок 17 по JScript: Enumerator — объект для работы с коллекциями”). Далее идет использования цикла for для перебора всех элементов коллекции. В цикле мы вызываем функцию GetOwner (она вернет значение в переменную output, которая хранит код выхода и через которую мы получаем имя домена и пользователя) и GetOwnerSid (она вернет значение в переменную output_SID, которая хранит код выхода и через которую мы получаем значение SID) через метод ExecMethod_. Я не делал проверки, то есть, если переменные output или output_SID возвращают ноль, значит, запрос прошел удачно, иначе, мы получим пустое значение null. Весь список записывается в переменную list. Далее происходит вызов функции ShowInNotepad, в которой данные записываются во временный файл, и который потом открывается с помощью программы wordpad.exe.
Получаем имя процесса, SID и имя домена/пользователя (класс Win32_Process, язык JScript)
'---------------------------------------------------- ' Получаем имя процесса, SID и имя домена/пользователя ' класс Win32_Process ' Win32-Process-list.vbs '---------------------------------------------------- dim objWMI, colItems, objItem, list list = "Список процессов Windows" & vbCrLf ' получаем доступ к пространству имен WMI set objWMI = GetObject("winmgmts:\\.\root\cimv2") 'Формируем колkекцию процессов с помощью класса Win32_Process set colItems = objWMI.ExecQuery("Select * from Win32_Process") ' начинаем перебор колkекции For Each objItem in colItems objItem.GetOwner strUser, strDomain objItem.GetOwnerSid strSID list = list & objItem.Name & vbTab & vbTab & strSID & vbTab & vbTab & strDomain & "\" & strUser & vbCrLf next ShowInNotepad(list) 'Процедура для открытия файла с данными класса Win32_Process Sub ShowInNotepad(StrToFile) dim temp_file, txt_file, FSO, WshShell 'Ссылка на объект FileSystemObject set FSO = WScript.CreateObject("Scripting.FileSystemObject") ' 'Ссылка на объект WScript.Shell set WshShell = WScript.CreateObject("WScript.Shell") temp_file = WshShell.ExpandEnvironmentStrings("%TEMP%") & "\" & FSO.GetTempName Set txt_file = FSO.CreateTextFile(temp_file) txt_file.WriteLine(StrToFile) txt_file.Close WshShell.Run "wordpad.exe " & temp_file End Sub |
Тут стоит обратить внимание на следующую особенность: Вызов методов GetOwner и GetOwnerSid происходит через переменную objItem а не через функцию ExecMethod_ как в примере на jscript. Также видим, что переменные strSID, strDomain и strUser мы указали как параметры, то есть, мы могли указать и другие названия переменных.
То что нужно!
colItems = new Enumerator(objWMI.ExecQuery("Select * from Win32_Process"));
for (; !colItems.atEnd(); colItems.moveNext()){ objItem = colItems.item();