Класс Win32_Process — работа с процессами

Класс Win32_Process — работа с процессами Объектная модель Windows Management Instrumentation

Класс 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 мы указали как параметры, то есть, мы могли указать и другие названия переменных.

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

  1. omegastripes

    То что нужно!

    colItems = new Enumerator(objWMI.ExecQuery("Select * from Win32_Process"));
    for (; !colItems.atEnd(); colItems.moveNext()){ objItem = colItems.item();

    Ответить