使用 VBScript 設定預設進程安全性層級

腳本可以使用預設 WMI 驗證和模擬設定。 不過,腳本可能需要具有更多安全性的連線,或可能連線到需要加密連線的命名空間。 如需詳細資訊,請參閱 設定 Namepace 安全性描述元需要對命名空間進行加密連線

在最簡單的情況下,腳本可以使用預設驗證和模擬設定。 WMI 通常會在共用服務主機中執行,並且與主機中的其他進程共用相同的驗證。 如果您想要使用不同的驗證層級執行 WMI 程式,請使用 winmgmt 命令搭配 /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 變更預設驗證認證

您可以使用 Moniker 字串和 SWbemLocatorSWbemSecurity 物件來變更腳本中的驗證層級。

驗證層級必須根據您要連線的目標作業系統需求來設定。 如需詳細資訊,請參閱 在不同作業系統之間連線

下列 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

在腳本 Moniker 與 WMI 的連線中,使用下表的 「Moniker name/description」 資料行中顯示的簡短名稱。 例如,在下列腳本中,驗證層級會設定為 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:Impersonate
允許物件使用呼叫端的認證。 這是 WMI 呼叫腳本 API 的建議模擬層級。
wbemImpersonationLevelDelegate
4
Moniker:委派
允許物件許可其他物件使用呼叫端的認證。 此模擬適用于 WMI 呼叫的腳本 API,但可能會構成不必要的安全性風險。

下列範例示範如何在取得 特定 Win32_Process實例時,在 Moniker 字串中設定模擬。

Set object = GetObject("winmgmts:{impersonationLevel=impersonate}!root\cimv2:Win32_Process.Handle='0'")

如需詳細資訊,請參閱 建立 WMI 應用程式或腳本

使用登錄設定預設模擬層級

如果您有登錄的存取權,您也可以設定預設模擬層級登錄機碼。 除非另有指定,否則此金鑰會指定 WMI 腳本 API 使用的模擬層級。 下列路徑會識別登錄路徑。

\ HKEY_LOCAL_MACHINE軟體\微軟\WBEM\腳本\預設模擬層級

根據預設,登錄機碼會設定為 3,指定模擬模擬層級。 某些提供者可能需要較高層級的模擬。

在 VBScript 中存取 SWbemSecurity 物件

另一種方式是透過SWbemSecurity 安全性物件設定模擬層級,其會顯示為SWbemServicesSWbemObjectSWbemObject、SWbemObjectSetSWbemEventSourceSWbemObjectPathSwbemLocator物件的Security_屬性。

WMI 會將父物件的安全性設定傳遞給原始物件的子代。 因此,您可以在登入 WMI 和 API 呼叫之後,設定 SWbemServices 物件的模擬層級,以及使用此物件或從中建立的物件,例如 類型為 SWbemObject的物件。

連線到遠端電腦上的 WMI

保護腳本用戶端