Share via


嗨,Scripting Guy!

嗨,Scripting Guy!

歡迎使用 TechNet 專欄,Microsoft Scripting Guys 會在此為您解答有關系統管理指令碼的常見問題。您有關於系統管理指令碼方面的問題嗎?請將電子郵件傳送到 scripter@microsoft.com。我們無法保證能夠逐一回答每個問題,不過我們會盡力而為。

還有,別忘了瞧瞧全新經過改良的嗨,Scripting Guy!過往文件

今天的問題:要怎麼判斷 Internet Explorer 已經啟用了 ActiveX 呢?


要怎麼判斷 Internet Explorer 已經啟用了 ActiveX 呢?

嗨,Scripting Guy!要怎麼判斷 Internet Explorer 已經啟用了 ActiveX 呢?

-- JV

JV,您好。您是非知道不可,對吧?這也不難解決,只是有點複雜。這和 Internet Explorer 的設定比較有關係,到不一定需要撰寫指令碼來擷取資訊。

這麼說好了,Internet Explorer 本身並沒有管理物件模型,要透過程式撰寫擷取 Internet Explorer 的設定與屬性值,唯一的辦法就是寫一個指令碼從登錄擷取這些資訊。這並不難,反正本專欄經常寫指令碼讀取登錄中的內容,難的是要判斷該讀取哪些登錄值,還有如何詮釋取得的資料。

附註:另一個比較頭痛的部分是弄清楚您關心的是哪個 ActiveX 設定,因為 Internet Explorer 裡面有好幾個牽涉到 ActiveX 控制項的設定。今天的專欄中假設您是想要讀取這個設定:執行 ActiveX 控制項與外掛程式


咱們先弄清楚到底要修改哪一個登錄值。我們發現 Internet Explorer 並沒有適用全域的安全設定,這些設定必須在 Internet Explorer 區域內設定。這種安全性區域有四種,區域名稱與值如下表所示:


區域名稱 區域值
內部網路網站 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 嗎?如果您想存取內部網路網站區域 (值為 1) 呢?沒問題:

HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\Zones\1

找到正確的子機碼後,下一步是學會看懂登錄值背後的意義。不巧這些登錄值的名字都挺玄的 (至少指令碼撰寫人員都這麼想),例如我們要查詢的就叫做 1200 (原因何在?我們也不知道)。如果您就是熱衷於使用指令碼讀取/管理 Internet Explorer 的設定,推薦您閱讀《管理 Internet Explorer 加強安全性設定白皮書》。這份白皮書內只有一部份討論指令碼,但是確實討論如何將這些難解的登錄值對應到使用者介面的屬性。還有,別忘了這些值也可以在 Tweakomatic 裡面找到喔 (Tweakomatic 會自動替您撰寫指令碼,跟只能讀的白皮書不一樣)。

準備好要要撰寫真的會做點事的指令碼了嗎?還差一點,讀者還別忘了設定資訊是以 DWORD (數值型態) 值儲存在登錄內。順便告訴您,ActiveX 控制項的設定為 3,而不是 65536,這樣有幫助嗎?大概沒有,不過下表就好多了:

 

登錄值 使用者介面值
0 啟用
1 提示
3 停用
65536 管理員批准


最後一個值不是筆誤,真的是 65536。自己去琢磨吧!

現在終於要開始寫指令碼囉。下面是一個範例指令碼,可以從內部網路網站區域擷取設定資訊 (區域值為 1):

HKEY_CURRENT_USER = &H80000001
strComputer = "."
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, dwValue
Wscript.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,以便告知指令碼要我們要使用哪一個登錄 Hive。連接到 WMI 類別時,請注意 StdRegProv (Standard Registry Provider) 類別可在 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 方法,以便能讀取登錄中的 DWORD 值:

objReg.GetDWORDValue HKEY_CURRENT_USER, strKeyPath, ValueName, dwValue

請注意,這裡必須把 GetDWORDValue 傳給幾個參數:

  • HKEY_CURRENT_USER,這是一個常數,告訴指令碼該使用哪個登錄 Hive。
  • 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 = &H80000001
strComputer = "."
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, dwValue
Wscript.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 If
strKeyPath = "Software\Microsoft\Windows\CurrentVersion\Internet Settings\Zones\2"
ValueName = "1200"
objReg.GetDWORDValue HKEY_CURRENT_USER, strKeyPath, ValueName, dwValue
If 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 If
strKeyPath = "Software\Microsoft\Windows\CurrentVersion\Internet Settings\Zones\3"
ValueName = "1200"
objReg.GetDWORDValue HKEY_CURRENT_USER, strKeyPath, ValueName, dwValue
If 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 If
strKeyPath = "Software\Microsoft\Windows\CurrentVersion\Internet Settings\Zones\4"
ValueName = "1200"
objReg.GetDWORDValue HKEY_CURRENT_USER, strKeyPath, ValueName, dwValue
If 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 Plugins
Intranet sites: Enabled
Trusted sites: Enabled
Internet sites: Enabled
Restricted sites: Disabled

還有什麼能為您服務的嗎?沒錯,也可以趁機設定這個登錄的值,不過還是留待改天在說囉。


如需詳細資訊

查看嗨,Scripting Guy!- 過往文件

 

回到頁首 回到頁首