Можно ли отслеживать процессы, которые другой процесс запускает через WMI? - PullRequest
1 голос
/ 20 сентября 2008

У меня есть исполняемый файл установки, который мне нужно установить. Когда я запускаю его, он запускает MSI для фактической установки, а затем сразу же умирает. Побочным эффектом этого является то, что он вернет управление обратно любой консоли, с которой вы вызываете его, до завершения установки. В зависимости от того, на какой машине я его запускаю, это может занять от трех до десяти минут, поэтому нежелательно спать в вызывающем скрипте. Я бы запустил MSI напрямую, но он жалуется на отсутствующие компоненты.

У меня есть сценарий WSH, который использует WMI для запуска процесса, а затем следит за тем, чтобы его pid больше не выполнялся. Есть ли какой-нибудь способ определить pid MSI, который выполняет исходный исполняемый файл, и затем наблюдать, как этот pid заканчивается с помощью WMI? Информация о процессе запуска даже связана с процессом?

Ответы [ 3 ]

1 голос
/ 20 сентября 2008

Подойдет ли поиск WMI процессов, которые имеют начальную настройку в качестве родительского процесса? Например, если я запускаю MSI из командной строки с идентификатором процесса 4000, я могу выполнить следующую командную строку, чтобы найти информацию о процессе msiexec:

c:\>wmic PROCESS WHERE ParentProcessId=4000 GET CommandLine, ProcessId 
CommandLine                                                 ProcessId
"C:\Windows\System32\msiexec.exe" /i "C:\blahblahblah.msi"  2752

Это может быть один из способов найти нужную вам информацию. Вот демонстрация поиска этой информации в VBS:

Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")
Set colProcesses = objWMIService.ExecQuery("select * from Win32_Process where ParentProcessId = 4000")
For Each objProcess in colProcesses
    Wscript.Echo "Process ID: " & objProcess.ProcessId
Next

Надеюсь, это поможет.

0 голосов
/ 20 сентября 2008

Это должно сделать это.

$p1 = [diagnostics.process]::start($pathToExecutable) # this way we know the PID of the initial exe
$p2 = get-wmiobject win32_process -filter "ParentProcessId = $($p1.Id)" # using Jim Olsen's tip
(get-process -id $p2.ProcessId).WaitForExit() # voila--no messy sleeping

К сожалению, у объекта .NET нет свойства ParentProcessId, а у объекта WMI нет метода WaitForExit (), поэтому мы должны идти туда и обратно.

Реквизиты Джеффри Сноверу (всегда) для этой статьи .

0 голосов
/ 20 сентября 2008

Если вы используете язык .NET (вы можете сделать это в Win32, но проще в .NET), вы можете перечислить все процессы в системе (после завершения первоначального вызова Setup.exe) и найти процессы, родительский PID которых равен PID файла Setup.exe, а затем контролируют все эти процессы. Когда они будут завершены - настройка завершена. Убедитесь, что они больше не порождают дочерние процессы.

...