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