可以监视通过WMI启动的另一个进程的过程吗?

时间:2020-03-06 14:28:19  来源:igfitidea点击:

我有一个安装可执行文件,我需要安装。当我运行它时,它将启动msi进行实际安装,然后立即死亡。这样做的副作用是,它将在安装完成之前将控制权返回给我们从中调用的任何控制台。根据我在哪台计算机上运行,​​它可能需要三到十分钟的时间,因此使调用脚本进入睡眠状态是不可取的。我将直接启动msi,但它抱怨缺少组件。

我有一个WSH脚本,该脚本使用WMI启动进程,然后观察直到它的pid不再运行。有什么方法可以确定初始可执行文件正在执行的MSI的pid,然后使用WMI监视该pid是否结束?启动过程信息甚至与过程相关联吗?

解决方案

将初始设置作为父流程的流程进行WMI查找会成功吗?例如,如果我从进程提示符为4000的命令提示符启动MSI,则可以执行以下命令行来查找有关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

我希望这有帮助。

如果我们使用的是.NET语言(可以在Win32中完成,但是在.NET中则更加容易),则可以枚举系统中的所有进程(在对Setup.exe的初始调用完成后),并找到所有父的PID等于Setup.exe的PID,然后监视所有这些进程。他们何时将完成设置就完成了。确保它们也不会产生更多的子进程。

这应该做。

$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()方法,因此我们必须反复进行。

向Jeffrey Snover(始终)提供支持。