問:
您好,指令碼專家!如何知道 Internet Explorer 中是否啟用了 ActiveX?
-- JV
答:
您好,JV。您一定要問這個問題,是嗎?實際上,這並不是一個特別難回答的問題,只是有點複雜。不過,那與配置 Internet Explorer 的方式緊密相關,而與通過編寫一個指令碼來檢索此資訊關係不大。
首先,Internet Explorer 沒有管理物件模型;相反,我們能夠通過編程的方式檢索 Internet Explorer 設定和屬性值的唯一方法就是通過編寫一個指令碼來從註冊表中擷取此資訊。這相當容易;我們經常在本專欄中使用註冊表讀取的指令碼。最為棘手的部分就是搞清楚需要讀取哪個註冊表值,並知道如何解釋返回的資料。
注意:另一個棘手的部分在於知道您對哪個 ActiveX 設定感興趣;不論好壞,Internet Explorer 有與 ActiveX 控制項相關的多個設定。在今天的專欄中,我們假定您要讀取此設定的值:運行 ActiveX 控制項和外掛程式。 |
讓我們先從搞清楚需要修改哪些註冊表值開始。實際上,Internet Explorer 安全設定沒有全域設定;相反,這些設定由 Internet Explorer 地區進行管理。有四個這樣的安全區域;地區名及其值如下表所示:
地區名 |
地區值 |
Intranet 網站 |
1 |
受信任的網站 |
2 |
網際網路網站 |
3 |
受限制的網站 |
4 |
可在註冊表的 HKEY_CURRENT_USER\ Software\Microsoft\Windows\CurrentVersion\Internet Settings\Zones\ 部分中找到 Internet Explorer 安全區域的設定;要訪問某個特定地區,您需要訪問與該地區對應的子項。要確定相應的子項,只需將地區值追加到前面的註冊表路徑即可。例如,要擷取 網際網路網站地區(值 3)的設定,您需要訪問以下註冊表子項:
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\Zones\3
您能看到 3 被追加到了末尾處。要訪問 Intranet 網站地區(值 1)的設定?沒問題:
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\Zones\1
找到正確的註冊表子項後,您需要知道要讀取哪個註冊表值。遺憾的是(至少對於指令碼編寫者來說),這些註冊表值的名稱有點含糊;例如,我們感興趣的名稱為 1200。(為什麼是這樣呢?我們不知道。)如果您對使用指令碼來讀取/管理 Internet Explorer 設定感興趣,那麼,您可能希望閱讀一下 Managing Internet Explorer Enhanced Security Configuration whitepaper(英文)。僅一部分文檔會涉及指令碼編寫,但是,該部分的確將這些含糊的註冊表值對應到了使用者介面中的相應屬性。當然,許多這樣的設定都可在 Tweakomatic 中找到。(Tweakomatic 與白皮書不同,它會真正地為您編寫指令碼。)
那麼,我們已準備最終編寫一個指令碼並真的在此執行一些操作嗎?幾乎是這樣。您需要知道的另一件事就是配置資訊作為雙位元組(數字)值被儲存在註冊表中。如果您知道 ActiveX 控制項被配置為 3 而不是 65536,這會有所協助嗎?可能沒有。不過,下表可能有所協助:
註冊表值 |
使用者介面值 |
0 |
Enabled |
1 |
Prompt |
3 |
Disabled |
65536 |
Administrator Approved |
不,最後一個值並非印刷錯誤,它的確為 65536。自己去想吧。
那好,現在我們就準備編寫一個指令碼。下面的這個樣本指令碼可檢索 Intranet 網站地區(地區值 1)的設定資訊:
HKEY_CURRENT_USER = &H80000001strComputer = "."Set objReg = GetObject("winmgmts:\\" & strComputer & "\root\default:StdRegProv")strKeyPath = "Software\Microsoft\Windows\CurrentVersion\Internet Settings\Zones\1"ValueName = "1200"objReg.GetDWORDValue HKEY_CURRENT_USER, strKeyPath, ValueName, dwValueWscript.Echo "Run ActiveX Controls and Plug-ins"If IsNull(dwValue) Then Wscript.Echo "Intranet sites: The value is either Null or could not be found in the registry."ElseIf dwValue = 0 Then Wscript.Echo "Intranet sites: Enabled"ElseIf dwValue = 1 Then Wscript.Echo "Intranet sites: Prompt"ElseIf dwValue = 3 Then Wscript.Echo "Intranet sites: Disabled"ElseIf dwValue = 65536 Then Wscript.Echo "Intranet sites: Administrator Approved"End If
我們首先定義一個名為 HKEY_CURRENT_USER 的常量並將其值設定為 &H80000001;這將告訴指令碼我們要使用哪個註冊表登錄區。然後我們串連到 WMI 服務;請注意,StdRegProv(標準註冊表提供者)類位於 root\default 命名空間中。(許多指令碼編寫者都認為該類與大多數 WMI 類別一樣,都位於 root\cimv2 中。事實並非如此。)
接下來我們將為一對變數賦值:
strKeyPath = "Software\Microsoft\Windows\CurrentVersion\Internet Settings\Zones\1"ValueName = "1200"
正如您所看到的,變數 strKeyPath 包含 HKEY_CURRENT_USER 中的註冊表路徑(請勿在該路徑中包含 HKEY_CURRENT_USER,否則,指令碼將失敗)。同時,將變數 ValueName 設定為 1200,該值恰好為我們要讀取的註冊表值。
然後我們調用 GetDWORDValue 方法,這樣我們可讀取註冊表中的雙位元組值:
objReg.GetDWORDValue HKEY_CURRENT_USER, strKeyPath, ValueName, dwValue
請注意,我們需要向 GetDWORDValue 傳遞幾個參數:
• |
HKEY_CURRENT_USER,告訴指令碼要使用哪個註冊表登錄區的常量。 |
• |
strKeyPath,包含註冊表路徑的變數。 |
• |
ValueName,表示我們要讀取的註冊表值的變數。 |
• |
dwValue,將結束儲存從註冊表中讀取的值的“輸出參數”。如果您正在想,“請稍等,我們沒有為 dwValue 賦值,”您說對了。我們就是這樣設計的:我們不為輸出參數賦值。相反,GetDWORDValue 將讀取恰好儲存在所討論的註冊表值 (1200) 中的任何值,然後該方法會將該值賦給 dwValue。 |
這確實很不錯,不是嗎?
此時,我們可只回顯從註冊表中檢索的值。不過,正如我們所指出的那樣,該檢索值將為諸如 1、3 或 65536 這樣的值。因此,我們建立一個簡單小巧的 If Then ElseIf 塊以檢查傳回值,並回顯一個更有意義的訊息:
If IsNull(dwValue) Then Wscript.Echo "Intranet sites: The value is either Null or could not be found in the registry."ElseIf dwValue = 0 Then Wscript.Echo "Intranet sites: Enabled"ElseIf dwValue = 1 Then Wscript.Echo "Intranet sites: Prompt"ElseIf dwValue = 3 Then Wscript.Echo "Intranet sites: Disabled"ElseIf dwValue = 65536 Then Wscript.Echo "Intranet sites: Administrator Approved"End If
您說對了:一旦您知道值儲存在註冊表中的什麼位置以及如何將值儲存在註冊表中,這就相當容易了。
僅僅為了省去鍵入(和/或複製與粘貼)之苦,下面的指令碼可返回所有四個安全區域的資訊:
HKEY_CURRENT_USER = &H80000001strComputer = "."Set objReg = GetObject("winmgmts:\\" & strComputer & "\root\default:StdRegProv")strKeyPath = "Software\Microsoft\Windows\CurrentVersion\Internet Settings\Zones\1"ValueName = "1200"objReg.GetDWORDValue HKEY_CURRENT_USER, strKeyPath, ValueName, dwValueWscript.Echo "Run ActiveX Controls and Plugins"If IsNull(dwValue) Then Wscript.Echo "Intranet sites: The value is either Null or could not be found in the registry."ElseIf dwValue = 0 Then Wscript.Echo "Intranet sites: Enabled"ElseIf dwValue = 1 Then Wscript.Echo "Intranet sites: Prompt"ElseIf dwValue = 3 Then Wscript.Echo "Intranet sites: Disabled"ElseIf dwValue = 65536 Then Wscript.Echo "Intranet sites: Administrator Approved"End IfstrKeyPath = "Software\Microsoft\Windows\CurrentVersion\Internet Settings\Zones\2"ValueName = "1200"objReg.GetDWORDValue HKEY_CURRENT_USER, strKeyPath, ValueName, dwValueIf IsNull(dwValue) Then Wscript.Echo "Trusted sites: The value is either Null or could not be found in the registry."ElseIf dwValue = 0 Then Wscript.Echo "Trusted sites: Enabled"ElseIf dwValue = 1 Then Wscript.Echo "Trusted sites: Prompt"ElseIf dwValue = 3 Then Wscript.Echo "Trusted sites: Disabled"ElseIf dwValue = 65536 Then Wscript.Echo "Trusted sites: Administrator Approved"End IfstrKeyPath = "Software\Microsoft\Windows\CurrentVersion\Internet Settings\Zones\3"ValueName = "1200"objReg.GetDWORDValue HKEY_CURRENT_USER, strKeyPath, ValueName, dwValueIf IsNull(dwValue) Then Wscript.Echo "Internet sites: The value is either Null or could not be found in the registry."ElseIf dwValue = 0 Then Wscript.Echo "Internet sites: Enabled"ElseIf dwValue = 1 Then Wscript.Echo "Internet sites: Prompt"ElseIf dwValue = 3 Then Wscript.Echo "Internet sites: Disabled"ElseIf dwValue = 65536 Then Wscript.Echo "Internet sites: Administrator Approved"End IfstrKeyPath = "Software\Microsoft\Windows\CurrentVersion\Internet Settings\Zones\4"ValueName = "1200"objReg.GetDWORDValue HKEY_CURRENT_USER, strKeyPath, ValueName, dwValueIf IsNull(dwValue) Then Wscript.Echo "Restricted sites: The value is either Null or could not be found in the registry."ElseIf dwValue = 0 Then Wscript.Echo "Restricted sites: Enabled"ElseIf dwValue = 1 Then Wscript.Echo "Restricted sites: Prompt"ElseIf dwValue = 3 Then Wscript.Echo "Restricted sites: Disabled"ElseIf dwValue = 65536 Then Wscript.Echo "Restricted sites: Administrator Approved"End If
運行指令碼,將返回類似下面內容的輸出:
Run ActiveX Controls and PluginsIntranet sites: EnabledTrusted sites: EnabledInternet sites: EnabledRestricted sites: Disabled
在此我們還能再做些什麼嗎?或許可以;畢竟我們還可配置此註冊表值。但那是改天要討論的內容了。