Перейти на главную страничку сайта (список статей, файлы для скачивания)

ФОРУМ (здесь можно обсудить эту статью, а также любые проблемы программирования на различных макроязыках и в скриптовых средах)

Рецепты WMI: управление процессами

Примеры кода в статье приводятся на языке VBScript для административных сценариев Windows. Приведённые ниже примеры не исчерпывают всех возможностей классов, которые в них упоминаются (используются). Для получения полной информации обращайтесь к MSDN. Как правило, поиск в MSDN названия того или иного класса позволяет быстро получить перечень (описание) всех его свойств и методов.

С помощью сценариев WMI можно запускать процессы как на локальной, так и на удалённой машине (кроме того, на удалённой машине можно запускать процессы под произвольной учётной записью). Стандартный объект WshController, имеющийся в Windows Script Host, также позволяет создавать процессы на удалённой рабочей станции, однако для этого требуется предварительная настройка обоих компьютеров и отсутствует возможность принудительно прервать запущенный процесс. В связи с вышесказанным использование сценариев WMI для запуска процессов предпочтительней.

Класс Win32_Process представляет процессы. Следующий сценарий предоставляет информацию о запущенных процессах на указанной машине, используя некоторые свойства класса Win32_Process. Точка в строке WMI-моникера означает подключение к локальному компьютеру. Заменив точку на нужное имя компьютера, вы можете подключиться к любому компьютеру в локальной сети.

On Error Resume Next
Set objService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\CIMV2")
If Err.Number <> 0 Then
	WScript.Echo Err.Number & ": " & Err.Description
	WScript.Quit
End If
For Each objProc In objService.ExecQuery("SELECT * FROM Win32_Process")
	WScript.Echo objProc.Caption 'краткое описание объекта
	WScript.Echo objProc.CommandLine 'командная строка запуска процесса, если таковая есть
	WScript.Echo objProc.CreationDate 'дата и время начала выполнения процесса
	WScript.Echo objProc.CSName 'имя компьютера
	WScript.Echo objProc.ExecutablePath 'полный путь к исполняемому файлу процесса
	WScript.Echo objProc.OSName 'название операционной системы
	WScript.Echo objProc.ParentProcessId 'PID родительского процесса
	WScript.Echo objProc.ProcessId 'PID процесса
	WScript.Echo objProc.WindowsVersion 'номер версии Windows
	objProc.GetOwner User, Domain
	objProc.GetOwnerSid Sid
	WScript.Echo Domain & "\" & User & " (" & Sid & ")"
	WScript.Echo
Next

Некоторые полезные методы класса Win32_Process:


МетодОписание
Create(string CommandLine, string CurrentDirectory, Win32_ProcessStartup ProcessStartupInformation, uint32 ProcessId) Метод создаёт новый процесс и возвращает 0, если процесс был успешно создан, или код ошибки. Параметры:
  • CommandLine - командная строка для выполнения.
  • CurrentDirectory - рабочая папка. Если значение параметра равно NULL, будет использоваться путь, указанный в CommandLine.
  • ProcessStartupInformation - начальная конфигурация процесса, объект класса Win32_ProcessStartup.
  • ProcessId - выходной параметр, куда система помещает идентификатор процесса. Значение этого свойства актуально с момента создания процесса до окончания его работы.
GetOwner(string User, string Domain) Метод получает учетные данные владельца (имя пользователя и имя домена), под которыми работает процесс, и возвращает 0, если операция была успешной, или код ошибки. Параметры:
  • User - выходной параметр, куда система помещает имя пользователя.
  • Domain - выходной параметр, куда система помещает имя домена или компьютера.
GetOwnerSid(string Sid) Метод получает идентификатор безопасности (SID) владельца процесса и возвращает 0, если операция была успешной, или код ошибки. В выходной параметр Sid система помещает идентификатор безопасности.
Terminate(uint32 Reason) Метод принудительно завершает процесс и все его дочерние процессы и возвращает 0, если операция была успешной, или код ошибки. Параметр Reason указывает код завершения процесса и всех его потоков.

Следующий сценарий демонстрирует простейший запуск процесса (notepad.exe) под текущей учётной записью на локальной машине. Заменив точку в WMI-моникере на нужное имя компьютера, вы можете запустить процесс на любом компьютере в локальной сети.

On Error Resume Next
Set objClass = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\CIMV2:Win32_Process")
If Err.Number <> 0 Then
	WScript.Echo Err.Number & ": " & Err.Description
	WScript.Quit
End If
Res = objClass.Create("notepad.exe", Null, Null, PID)
If Res <> 0 Then
	WScript.Echo "Код ошибки: " & Res
End If

Следующий сценарий демонстрирует запуск процесса (notepad.exe) под указанной учётной записью на указанной машине:

On Error Resume Next
Set objSWbemLocator = CreateObject("WbemScripting.SWbemLocator")
CompName = "CompName" 'имя компьютера
UserName = "Domain\User" 'имя пользователя
Pass = "Pass" 'пароль пользователя
Set objServices = objSWbemLocator.ConnectServer(CompName, "root\CIMV2", UserName, Pass, Null, Null, 0)
If Err.Number <> 0 Then
	WScript.Echo Err.Number & ": " & Err.Description
	WScript.Quit
End If
Set objClass = objServices.Get("Win32_Process")
Res = objClass.Create("notepad.exe", Null, Null, PID)
If Res <> 0 Then
	WScript.Echo "Код ошибки: " & Res
End If

Класс Win32_ProcessStartup позволяет указать начальные параметры запуска нового процесса (например, состояние окна, приоритет и т.д.). Следующий сценарий демонстрирует запуск процесса (notepad.exe) в максимизированном окне:

On Error Resume Next
Set objClass = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\CIMV2:Win32_Process")
If Err.Number <> 0 Then
	WScript.Echo Err.Number & ": " & Err.Description
	WScript.Quit
End If
Set objService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\CIMV2")
If Err.Number <> 0 Then
	WScript.Echo Err.Number & ": " & Err.Description
	WScript.Quit
End If
Set objStartup = objService.Get("Win32_ProcessStartup")
Set objConfig = objStartup.SpawnInstance_
objConfig.ShowWindow = 3 'максимизированное окно
Res = objClass.Create("notepad.exe", Null, objConfig, PID)
If Res <> 0 Then
	WScript.Echo "Код ошибки: " & Res
End If

Следует заметить, что при запуске процесса вышеописанными способами (с помощью класса Win32_Process) на удалённом компьютере исключается возможность интерактивного взаимодействия пользователя с запущенной программой. Если программа открывает на удалённом компьютере визуальное окно, это окно никогда не будет доступно (окно будет всегда невидимым). Таким образом, на удалённом компьютере данный способ имеет смысл использовать лишь для пакетного запуска программ.

Чтобы запустить на исполнение vb- или js-скрипт на удалённом компьютере, при вызове метода Create() используйте командную строку типа "wscript.exe c:\filename.vbs", при этом запускаемый файл сценария должен быть расположен на локальном диске удалённого компьютера.

Следующий сценарий демонстрирует возможность принудительного завершения процессов с использованием метода Terminate(). Заменив точку в WMI-моникере на нужное имя компьютера, вы можете принудительного завершать процессы на любом компьютере в локальной сети. Сценарий завершает все процессы notepad.exe, если таковые имеются:

On Error Resume Next
Set objService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\CIMV2")
If Err.Number <> 0 Then
	WScript.Echo Err.Number & ": " & Err.Description
	WScript.Quit
End If
For Each objProc In objService.ExecQuery("SELECT * FROM Win32_Process WHERE Name = 'notepad.exe'")
	objProc.Terminate
Next

Класс Win32_ScheduledJob позволяет запускать процессы, делая возможным при этом интерактивное взаимодействие с пользователем (в т.ч. на удалённом компьютере). Например, следующий сценарий приведёт к запуску calc.exe на указанном (в данном случае - локальном) компьютере через минуту после текущего времени, создав разовое задание, которое будет выполнено под пользователем SYSTEM. Окно запускаемой программы при этом будет доступно для интерактивного взаимодействия с текущим пользователем, который работает на указанном компьютере в данный момент.

On Error Resume Next
Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\CIMV2")
If Err.Number <> 0 Then
   WScript.Echo Err.Number & ": " & Err.Description
   WScript.Quit
End If
Set objScheduledJob = objWMIService.Get("Win32_ScheduledJob")
CurrTimePlusOneMin = Replace(Left(Right(DateAdd("n", 1, Now()), 8), 5), ":", "")
'RunTime = "********" & CurrTimePlusOneMin & "00.000000+240" 'для Москвы - летнее время
RunTime = "********" & CurrTimePlusOneMin & "00.000000+180" 'для Москвы
Res = objScheduledJob.Create("calc.exe", RunTime, False, 2^(Weekday(Now(), 2)-1), 0, True, intJobID)
If Res <> 0 Then
   WScript.Echo "Код ошибки: " & Res
End If

Для более подробного знакомства с классом Win32_ScheduledJob обращайтесь к MSDN.

Людоговский Александр

Перейти на главную страничку сайта (список статей, файлы для скачивания)

© 2007 http://www.script-coding.com При любом использовании материалов сайта обязательна ссылка на него как на источник информации, а также сохранение целостности и авторства материалов.