可以监视通过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(始终)提供支持。