WMI를 통해 다른 프로세스가 실행되는 프로세스를 모니터링할 수 있습니까?

StackOverflow https://stackoverflow.com/questions/106476

  •  01-07-2019
  •  | 
  •  

문제

설치해야 하는 설치 실행 파일이 있습니다.실행하면 실제 설치를 수행하기 위해 msi가 시작된 다음 즉시 종료됩니다.이것의 부작용은 설치가 완료되기 전에 호출한 모든 콘솔에 제어권을 다시 반환한다는 것입니다.어떤 컴퓨터에서 실행하는지에 따라 3~10분 정도 걸릴 수 있으므로 호출 스크립트를 절전 모드로 전환하는 것은 바람직하지 않습니다.msi를 직접 실행하려고 하는데 구성 요소 누락에 대한 불만이 표시됩니다.

WMI를 사용하여 프로세스를 시작한 다음 pid가 더 이상 실행되지 않을 때까지 감시하는 WSH 스크립트가 있습니다.초기 실행 파일이 실행 중인 MSI의 pid를 확인한 다음 WMI를 사용하여 해당 pid가 끝나는지 확인할 수 있는 방법이 있습니까?실행 프로세스 정보가 프로세스와 연관되어 있습니까?

도움이 되었습니까?

해결책

상위 프로세스로 초기 설정이 있는 프로세스에 대한 WMI 조회를 수행하면 문제가 해결됩니까?예를 들어 프로세스 ID가 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에 대한 소품(항상) 이 기사.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top