Как получить PID источника и назначения для процесса, созданного с помощью WMI?

Процесс может быть порожден с помощью WMI COM, ниже пример порождения calc.exe в VBS. Родителем будет WmiPrvSE.exe, который является COM-сервером WMI, а не wscript.exe. Задача состоит в том, чтобы подключить ниже запрос на создание процесса.

str = "calc.exe"
Set objWMIService = GetObject("winmgmts:\\.\root\cimv2")
Set objStartup = objWMIService.Get("Win32_ProcessStartup")
Set objConfig = objStartup.SpawnInstance_
Set objProcess = GetObject("winmgmts:\\.\root\cimv2:Win32_Process")
objProcess.Create str, Null, objConfig, intProcessID

Создание асинхронного процесса с использованием WMI можно отслеживать с помощью запроса:

"SELECT * FROM MSFT_WmiProvider_ExecMethodAsyncEvent_Post WHERE ObjectPath=\"Win32_Process\" AND MethodName=\"Create\"";

Событие запускается при выполнении вышеупомянутого сценария VBS. Но ManagementEventWatcher получает событие, которое дает полезную информацию только для командной строки:

void OnEventArrived(object sender, System.Management.EventArrivedEventArgs e)
{
string cmdline = e.NewEvent["InputParameters"]["ProcessStartupInformation"]["CommandLine"]
}

и невозможно знать, что VBS возникла из-за нереста calc.exe. Мне нужен исходный и целевой PID, то есть "wscript.exe sample.vbs" PID=666, созданный "calc.exe" PID=667 с помощью WMI. Как это сделать? Кроме того, есть ли возможность предотвратить создание процесса по событию MSFT_WmiProvider_ExecMethodAsyncEvent_Pre?

1 ответ

Попробуйте свойство Process.Id.

Process[] localByName = Process.GetProcessesByName("notepad");
int i = localByName.Length;
while (i > 0)
{
    // You can use the process Id to pass to other applications or to
    // reference that particular instance of the application.
    Console.WriteLine(localByName[i - 1].Id.ToString());
    i -= 1;
}

В противном случае, если вам нужно перечислить, используя другое свойство, проверьте их здесь.

Другие вопросы по тегам