Set objWMIService = GetObject("winmgmts:\\" strComputer "\root\cimv2")
Set colProcesses = objWMIService.ExecNotificationQuery _ ("Select * From __InstanceDeletionEvent " _ "Within 1 Where TargetInstance ISA 'Win32_Process'")
Do Until i = 999 Set objProcess = colProcesses.NextEvent If objProcess.TargetInstance.ProcessID = intCalcID Then Exit Do End If Loop
Set colProcesses = objWMIService.ExecQuery _ ("Select * from Win32_Process Where ProcessID = " intNotepadID)
For Each objProcess in colProcesses objProcess.Terminate() Next
Set colProcesses = objWMIService.ExecNotificationQuery _ ("Select * From __InstanceDeletionEvent " _ "Within 1 Where TargetInstance ISA 'Win32_Process'")
這么做的原因何在?每次刪除一個進程,都要生成一個 __InstanceDeletionEvent 類實例。我們要檢查每個實例,看這些實例的進程 ID 是否為目標 ID,也就是分配給 intCalcID 的 ID。如果刪除的進程具有不同的 ID,則它不是“計算器”實例;在這種情況下,腳本將恢復(fù)監(jiān)視。如果刪除的進程具有與 intCalcID 相同的 ID,則它一定是“計算器”實例(因為進程 ID 必須是唯一的)。在這種情況下,我們要停止監(jiān)視,然后關(guān)閉“記事本”。
下面是實際執(zhí)行監(jiān)視的代碼:
Do Until i = 999 Set objProcess = colProcesses.NextEvent If objProcess.TargetInstance.ProcessID = intCalcID Then Exit Do End If Loop
這里我們做的是設(shè)置一個循環(huán),該循環(huán)一直運行到變量 i 等于 999?,F(xiàn)在,事實是變量 i 將始終不等于 999;這只是個小技巧,確保循環(huán)一直運行到“計算器”關(guān)閉。(我們?nèi)绾沃雷兞?nbsp;i 將始終不等于 999?是這樣,我們沒有為 i 賦值;因此,它取默認值 0。因為我們從未對該值進行任何更改,所以 i 始終為 0,因此將始終不等于 999。)
在循環(huán)中,我們使用此行代碼等待下一個刪除的進程:
Set objProcess = colProcesses.NextEvent
每次刪除進程我們都檢查 ProcessID 與分配給“計算器”的進程 ID 是否相符。如果相符,我們則使用 Exit Do 命令斷開循環(huán),繼續(xù)腳本。如果不具有相同的 ID,則我們只需繼續(xù)循環(huán),等待下一個刪除的進程。(正如我們上面所說的,i 將始終不等于 999,但是沒關(guān)系:使用 Exit Do 命令就可以脫離循環(huán)。)
For Each objProcess in colProcesses objProcess.Terminate() Next
順便說一句,此方法既適用于遠程計算機也適用本地計算機;只需將變量 strComputer 的值更改為遠程計算機的名稱。但是,要記住,在 Windows XP 和 Windows Server 2003 中,在遠程計算機上啟動的進程是在不可見的窗口中運行的;它們在屏幕上不可見。這意味著,處理遠程計算機時,對于不需要任何用戶交互的應(yīng)用程序,此方法很有用;而對于確實需要用戶干預(yù)的應(yīng)用程序,此方法遠不及其他方法有用(實際上完全沒用)。