問:
您好,指令碼專家!如何列出註冊表中 Run 項中的所有項目?
-- JW
答:
您好,JW。如何列出註冊表中 Run 項中的所有項目?坦白地講,我們不打算告訴您。真的很抱歉。不是因為我們不喜歡您,而是因為我們認為我們有一個更好的答案給您。(如果我們錯了,那好,我們只能說這不會是第一次。)
由於您對 Run 項感興趣,因此我們假定您真正想知道的是如何找出哪些程式被配置為在每次 Windows 啟動時自動運行。您一定可以從 Run 項中讀取到該資訊,不要對此產生懷疑。實際上,您可以從 Run 項中讀取到該資訊,查看一下是否 HKEY_CURRENT_USER 和 HKEY_LOCAL_MACHINE 中都具有 Run 項。它們中都具有 RunOnce 項。接下來是 Startup 檔案夾、All Users Startup 檔案夾等等。
您已經找到問題的答案了。試圖找出哪些程式被配置為在每次 Windows 啟動時自動啟動並執行問題時所牽涉到的問題就是該資訊可能儲存在數量眾多的不同位置中的任一位置中。我們可以編寫一個指令碼來檢查這些為數眾多的位置中的每個位置嗎?肯定可以這樣做。但我們認為以下這段指令碼更好:
複製代碼 代碼如下:strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set colStartupCommands = objWMIService.ExecQuery _
("Select * from Win32_StartupCommand")
For Each objStartupCommand in colStartupCommands
Wscript.Echo "Command: " & objStartupCommand.Command
Wscript.Echo "Description: " & objStartupCommand.Description
Wscript.Echo "Location: " & objStartupCommand.Location
Wscript.Echo "Name: " & objStartupCommand.Name
Wscript.Echo "User: " & objStartupCommand.User
Wscript.Echo
Next
不是四處尋找並視圖找到 Windows 用來儲存自動運行程式資訊的位置,我們已決定讓 WMI 為我們完成所有此項工作。WMI 類別 Win32_StartupCommand 用於尋找自動運行程式的資訊,而不管該資訊是儲存在註冊表中、Startup 檔案夾中還是其他某個位置中。例如,運行此指令碼時,將返回類似於下面內容的資訊:
Command: Microsoft Office OneNote 2003 Quick Launch.lnk
Description: Microsoft Office OneNote 2003 Quick Launch
Location: Startup
Name: Microsoft Office OneNote 2003 Quick Launch
User: FABRIKAM\kenmyer
Command: C:\WINDOWS\System32\ctfmon.exe
Description: ctfmon.exe
Location: HKU\S-1-5-21-1987391165-1004336648-1605550848-8553\SOFTWARE\Microsoft\
Windows\CurrentVersion\Run
Name: ctfmon.exe
User: FABRIKAM\kenmyer
正如您所見,存在兩個不同的自動運行程式:一個程式在 Startup 檔案夾中有捷徑,另一個程式是註冊表的 HKEY_USERS 部分中的 Run 中所列出的應用程式。(還有另一個可能儲存了自動運行資訊的電腦上的位置。)我們的一個簡單的小指令碼可以在數秒鐘內調用並檢索到有關這兩個程式以及任何其他自動運行應用程式的資訊。這就是我們為何認為使用 Win32_StartupCommand 的指令碼更好的原因。
那麼,該指令碼本身是如何工作的?是這樣,它幾乎同曾經要編寫的 WMI 指令碼一樣簡單。我們首先串連到本機電腦上的 WMI 服務。不用說,我們也可以使用此指令碼串連到遠端電腦上的 WMI 服務(這將返回已配置為在該電腦上自動啟動並執行程式的列表)。然後我們調用 ExecQuery 方法並發出以下查詢,此查詢可調用並擷取它所能找到的所有自動運行程式的集合:
Set colStartupCommands = objWMIService.ExecQuery _
("Select * from Win32_StartupCommand")
現在,剩下要做的事情就是建立一個 For Each 迴圈來遍曆程式的集合,並回顯諸如應用程式名稱和位置(可在其中找到自動運行資訊)這樣的資料。該方法簡單快捷,最大的優勢在於,其返回的資訊遠遠多於只通過讀取單個登錄機碼下所填充的值所能擷取的資訊。很不錯吧?
我們希望其會對您有所協助,JW。如果其未奏效,當您真地確實需要唯讀取 Run 項並通過使用它來搞定一切時,請告訴我們,這樣我們可以知道我們能夠為您做些什麼。還有問題嗎?我們知道最後一塊蛋糕(就是您為您自己保留的那塊蛋糕)被誰吃了嗎?是這樣,我們能夠回答這個問題,JW。但我們不打算這樣做。