2008-12-05 98 views
1

使用WMI VB腳本,我想創建/附加多個子進程到父進程,如資源管理器進程。我可以使用WMI VB腳本創建子進程嗎?

當一個應用程序可以通過點擊它開始,它成爲Explorer進程的子進程。 Windows啓動時加載的所有應用程序也是如此。

如果您在任務管理器中使用「結束進程樹」上下文菜單選項終止資源管理器進程,它也會終止資源管理器進程的所有子進程(一種快速,蠻力的方式來清理內存而無需重新啓動) 。

我有兩個腳本 - 一個殺死了一堆的具體流程,另一個重新啓動這些進程。

大部分進程的/在我的腳本應用程序在啓動時因此它們explorer進程的孩子被加載。如前所述,當我終止瀏覽器進程樹時,所有這些進程都會死亡。

當我使用腳本重新啓動這些應用程序時,它們不再是資源管理器進程的子項。當我殺死瀏覽器進程樹時,腳本啓動的應用程序不會死亡。

現在,我知道我可以使用腳本分別殺死每個進程。但是,只需要在腳本中終止瀏覽器進程樹,而不必指定要殺死的單個應用程序即可。

所以,如果我有一個腳本,該腳本可以開始我的應用程序作爲資源管理過程中的孩子,我的其他腳本只是要殺死Explorer進程樹。

我有一個腳本可以做到這一點。它循環並殺死探測器進程的所有子進程。但它只適用於啓動時加載或點擊的應用程序。

此外,通過阻止這些應用程序在啓動時加載,Windows加載速度更快。稍後,我點擊我的腳本圖標以在需要時加載我的應用程序。

這就是爲什麼我想創建一個腳本,可以啓動應用程序作爲資源管理器進程的子項。

一個有趣的邊注:我不得不推遲殺死任何命令/控制檯程序,否則腳本可能獲取過程的其餘部分之前殺死自己。

任何想法如何做到這一點?

下面是我的代碼失敗。

Option Explicit 
dim wmi, rootProcessName, rootProcess, objStartup, objConfig, objProcess, strComputer, dropbox, itunes, skype 
strComputer = "." 

dropbox="C:\Program Files\Dropbox\Dropbox.exe" 
itunes="C:\Program Files\iTunes\iTunes.exe" 
skype="C:\Program Files\Skype\Phone\Skype.exe" 

Const NORMAL = 32 
Set wmi = GetObject("winmgmts:\\" & strComputer & "\root\cimv2") 
Set objStartup = wmi.Get("Win32_ProcessStartup") 
Set objConfig = objStartup.SpawnInstance_ 
objConfig.PriorityClass = NORMAL 

rootProcessName = "'explorer.exe'" 
set rootProcess = wmi.ExecQuery("Select * from Win32_Process Where Name = " & rootProcessName) 
For Each objProcess in rootProcess 
    objProcess.Create dropbox, null, objConfig 
    objProcess.Create itunes, null, objConfig 
    objProcess.Create skype, null, objConfig 
Next 

WScript.Quit 
+1

它是如何失敗?有錯誤訊息? – ssorrrell 2009-07-30 14:29:50

回答

1

窗口的進程跟蹤誰創建它的進程ID,這就是關係如何被管理。爲了得到你想要的,你必須改變存儲在子進程中的父PID,或者將代碼注入到你想成爲父進程的進程中,並讓它創建新的子進程。這些都不是真的可行的。

真正的解決方案是使用Job Objects,這樣你可以終止其與工作都在同一時間相關聯的所有進程。但是你必須遷移出VBScript。

相關問題