使用 VBScript 設定預設進程安全性層級
腳本可以使用預設的 WMI 驗證和模擬設定。 不過,腳本可能需要具有更多安全性的連線,或可能連線到需要加密連線的命名空間。 如需詳細資訊,請參閱 設定 Namepace 安全性描述元 和 要求對命名空間進行加密連線。
在最簡單的情況下,腳本可以使用預設驗證和模擬設定。 WMI 通常會在共用服務主機中執行,並且與主機中的其他進程共用相同的驗證。 如果您想要使用不同的驗證層級執行 WMI 進程,請使用 winmgmt 命令執行 WMI,並使用 /standalonehost 參數執行 WMI,並一般設定 WMI 的驗證層級。 如需詳細資訊,請參閱 維護 WMI 安全性。
下列腳本會使用模擬和驗證層級的預設設定。
strComputer = "."
Set objServices = GetObject("winmgmts:\\" _
& strComputer & "\root\CIMV2")
set objProcessSet = objServices.ExecQuery _
("SELECT Name FROM Win32_Process",,48)
For Each Process in objProcessSet
WScript.Echo Process.Name
Next
您也可以在呼叫 GetObject方法時使用 Moniker,並設定預設安全性設定,如下列範例所示。
strComputer = "."
Set objServices = GetObject( _
"winmgmts:{impersonationLevel=impersonate," _
& "authenticationLevel=pktPrivacy}!root/cimv2")
set objProcessSet = objServices.ExecQuery _
("SELECT Name FROM Win32_Process",,48)
For Each Process in objProcessSet
WScript.Echo Process.Name
Next
如需在腳本中設定不同模擬或驗證層級的詳細資訊,或設定計算機的預設值,請參閱下列主題:
- 使用 VBScript 變更默認驗證認證
- 使用 VBScript 變更預設模擬設定
- 使用註冊表設定預設偽裝層級
- 在 VBScript 中存取 SWbemSecurity 物件
- SWbemSecurity
使用 VBScript 變更預設驗證認證
您可以使用 Moniker 字串串,以及 SWbemLocator 和 SWbemSecurity 物件來變更腳本中的驗證層級。
驗證層級必須根據您要連線的目標作系統需求來設定。 如需更多資訊,請參閱 在不同作業系統之間的連接。
下列 VBScript 程式代碼範例示範如何在腳本中變更驗證層級,以從名為 “Server1” 的遠端計算機取得可用空間數據。
strComputer = "Server1"
Set objWMIService = GetObject("winmgmts:{authenticationLevel=Pkt}!\\" _
& strComputer & "\root\cimv2")
Set colDisks = objWMIService.ExecQuery ("Select * from Win32_LogicalDisk")
For each objDisk in colDisks
Wscript.Echo "DeviceID: " & vbTab & objDisk.DeviceID & vbNewLine & _
"FreeSpace: " & vbTab & objDisk.FreeSpace
NextstrComputer = "."
Set objServices = GetObject( "winmgmts:{impersonationLevel=impersonate," _
& "authenticationLevel=pktPrivacy}!root/cimv2")
Set objProcessSet = objServices.ExecQuery("SELECT Name FROM Win32_Process",,48)
For Each Process in objProcessSet
WScript.Echo Process.Name
Next
Next
在腳本與 WMI 進行 moniker 連線時,請使用下表中「Moniker 名稱/描述」欄中顯示的簡短名稱。 例如,在下列腳本中,驗證層級會設定為 WbemAuthenticationLevelPktIntegrity。
SetobjWMIService = GetObject( _
"winmgmts:{authenticationLevel=pktPrivacy}!root\cimv2")
下表列出您可以設定的驗證層級。 這些層級定義於列舉 WbemAuthenticationLevelEnum中的 Wbemdisp.tlb 中。
名稱/值 | 描述 |
---|---|
WbemAuthenticationLevelDefault 0 |
Moniker:預設值 WMI 會使用預設的 Windows 驗證設定。 這是建議的設定,使 WMI 能協商到伺服器傳回資料所需的層級。 不過,如果命名空間需要加密,請使用 WbemAuthenticationLevelPktPrivacy。 |
WbemAuthenticationLevelNone 1 |
Moniker:無 不使用驗證。 |
WbemAuthenticationLevelConnect 2 |
Moniker:Connect 只有在用戶端與伺服器建立關聯性時,才會驗證客戶端的認證。 |
WbemAuthenticationLevelCall 3 |
呼叫 只有在伺服器收到要求時,才會在每個呼叫開始時進行驗證。 |
WbemAuthenticationLevelPkt 4 |
Moniker: Pkt 驗證接收的所有數據都是來自預期的用戶端。 |
WbemAuthenticationLevelPktIntegrity 5 |
Moniker:PktIntegrity 驗證並驗證客戶端與伺服器之間傳輸的數據均未經過修改。 |
WbemAuthenticationLevelPktPrivacy 6 |
Moniker: PktPrivacy 驗證所有先前的模擬層級,並加密每個遠端過程調用的自變數值。 如果您要連線的命名空間需要加密連線,請使用此設定。 |
若要判斷成功的呼叫,請在變更驗證層級之後檢查傳回值。
例如,由於本機連線一律具有 wbemAuthenticationLevelPktPrivacy的驗證層級,因此下列範例無法設定驗證層級,因為它會連線到本機計算機。
strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate," _
& "authenticationLevel=pktPrivacy}!" _
& "\\" & strComputer & "\root\cimv2")
提供者可以在命名空間上設定安全性,因此除非您在該命名空間的連線中使用封包隱私權 (PktPrivacy),否則不會傳回任何數據。 這可確保數據在透過網路時加密。 如果您嘗試設定較低的驗證層級,您將會收到拒絕存取的訊息。 如需詳細資訊,請參閱 保護 WMI 命名空間。
使用 VBScript 變更預設模擬層級
當您呼叫 WMI 的腳本 API 時,建議您使用 WMI 針對模擬層級提供的預設值。 某些具有多個網路躍點的提供者和遠端呼叫所需的模擬層級比 WMI 使用的還要高。 如果模擬層級不足,提供者可能會拒絕請求,或者提供不完整的資訊。
如果您未在 Moniker 中設定模擬層級,或在可保護的對象上設定 SWbemSecurity.ImpersonationLevel,請設定作業系統的預設 DCOM 模擬層級。 模擬層級必須根據您要連線的目標作業系統的需求來設定。 如需詳細資訊,請參閱 連接不同作業系統。
下列 VBScript 代碼範例演示如何變更之前顯示的腳本中的模擬層級。
strComputer = "Server1"
Set objWMIService = GetObject("winmgmts:{impersonationLevel=Impersonate}!\\" _
& strComputer & "\root\cimv2")
Set colDisks = objWMIService.ExecQuery("Select * from Win32_LogicalDisk")
For each objDisk in colDisks
Wscript.Echo "DeviceID: " & vbTab & objDisk.DeviceID & vbNewLine & _
"FreeSpace: " & vbTab & objDisk.FreeSpace
Next
下表列出使用 WbemImpersonationLevelEnum 中的驗證層級。
名稱/值 | 描述 |
---|---|
wbemImpersonationLevelAnonymous 1 |
Moniker:匿名 隱藏呼叫端的認證。 對 WMI 的呼叫可能會因為這個模擬層級而失敗。 |
wbemImpersonationLevelIdentify 2 |
Moniker:識別 允許物件查詢呼叫端的認證。 對 WMI 的呼叫可能會因為這個模擬層級而失敗。 |
wbemImpersonationLevelImpersonate 3 |
Moniker:冒充 允許物件使用呼叫端的認證。 這是針對 WMI 呼叫編寫 API 腳本的建議模擬層級。 |
wbemImpersonationLevelDelegate 4 |
Moniker:代表 允許物件將呼叫者的認證交由其他物件使用。 此身份模擬可用於腳本 API 進行 WMI 呼叫,但可能構成不必要的安全風險。 |
下列範例示範如何在取得特定實例 Win32_Process時,於 Moniker 字串中設定模擬。
Set object = GetObject("winmgmts:{impersonationLevel=impersonate}!root\cimv2:Win32_Process.Handle='0'")
如需詳細資訊,請參閱 建立 WMI 應用程式或文稿。
使用註冊表設定預設模擬層級
如果您有存取登錄的權限,您也可以設定預設模擬層級的登錄檔機碼。 此金鑰會指定 WMI 文稿 API 所使用的模擬層級,除非另有指定。 下列路徑指出了註冊表路徑。
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WBEM\腳本\預設模擬級別
根據預設,登錄機碼會設定為 3,並指定模擬模擬層級。 某些提供者可能需要較高層級的模擬。
存取 VBScript 中的 SWbemSecurity 物件
您可以設定模擬層級的另一種方式,是從 SWbemSecurity 安全性物件的 Security_ 屬性中進行設置,此屬性在 SWbemServices、SWbemObject、SWbemObjectSet、SWbemEventSource、SWbemObjectPath,以及 SwbemLocator 物件中都會出現。
WMI 會將父對象的安全性設定傳遞至原始物件的子系。 因此,您可以在使用此物件或由其創建的物件(例如類型為 SWbemObject的物件)進行 WMI 登入和 API 呼叫後,設定 SWbemServices 物件的模擬層級。