連接到遠端電腦上的 WMI
WMI 可用來管理及存取遠端電腦上的 WMI 數據。 WMI 中的遠端聯機會受到 Windows 防火牆 和 DCOM 設定的影響。 用戶帳戶控制 (UAC) 也可能需要變更某些設定。 不過,一旦您的設定正確,對遠端系統的呼叫與本機 WMI 呼叫非常類似。 不過,您可以選擇使用不同的認證、替代驗證通訊協定和其他安全性功能,使其更加複雜。
設定電腦以供遠端連線
使用 WMI 存取遠端系統之前,您可能需要檢查一些安全性設定,以確認您具有存取權。 具體說來:
Windows 包含一些安全性功能,可能會封鎖對遠端系統上腳本的存取。 因此,您可能需要先修改系統的 Active Directory 和 Windows 防火牆設定,再進行 WMI 呼叫。 如需詳細資訊,請參閱 設定遠端 WMI 連線 和 疑難解答遠端 WMI 連線。
必須啟用正確的 DCOM 設定,遠端連線才能運作。 變更DCOM設定可讓低許可權的使用者存取遠端連線的電腦。 如需詳細資訊,請參閱 保護遠端 WMI 連線。
此外,在某些情況下,您可能想要透過固定埠執行 WMI。 若要這樣做,您也必須變更您的設定。 如需詳細資訊,請參閱 設定 WMI 的固定埠。
連接遠端電腦
其核心是使用 WMI 連線到遠端系統,包括確定您有適當的許可權可存取系統,而且您的連線已正確設定。 當您有這兩個元素之後,連接本身就相當簡單。 例如,如果您使用預設安全性認證,您可以使用下列程式代碼存取遠端系統上的 WMI:
-
使用大多數 WMI Cmdlet 通用的 -ComputerName 參數,例如 Get-WmiObject。
$strComputer = "Computer_B" $colSettings = Get-WmiObject Win32_OperatingSystem -ComputerName $strComputer
-
使用包含遠端系統名稱的 Moniker 來呼叫 GetObject。
strComputer = "Computer_B" Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2") Set colSettings = objWMIService.ExecQuery("Select * from Win32_OperatingSystem")
-
針對目前版本的 WMI Managed 介面 (Microsoft.Management.Infrastructure),請使用 CimSession 對象來表示與遠端主機的連線。
using Microsoft.Management.Infrastructure; ... string Namespace = @"root\cimv2"; string OSQuery = "SELECT * FROM Win32_OperatingSystem"; CimSession mySession = CimSession.Create("Computer_B"); IEnumerable<CimInstance> queryInstance = mySession.QueryInstances(Namespace, "WQL", OSQuery);
-
針對 WMI 管理介面的 v1 版本 (System.Management),請使用 ManagementScope 物件來表示遠端主機的連線。
using System.Management; ... ManagementScope scope = new ManagementScope("\\\\Computer_B\\root\\cimv2"); scope.Connect(); ObjectQuery query = new ObjectQuery("SELECT * FROM Win32_OperatingSystem"); ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, query);
-
使用 IWbemLocator::ConnectServer 方法來指定 strNetworkResource 參數中的遠端電腦名稱。
hres = pLoc->ConnectServer( _bstr_t(L"\\\\COMPUTER_B\\root\\cimv2"), _bstr_t(useToken?NULL:pszName), // User name _bstr_t(useToken?NULL:pszPwd), // User password NULL, // Locale NULL, // Security flags _bstr_t(useNTLM?NULL:pszAuthority),// Authority NULL, // Context object &pSvc // IWbemServices proxy );
先前的程式代碼範例可以說是您可以使用 WMI 執行的最基本遠端連線。 具體來說,範例會假設下列各項:
- 您是遠端電腦上的系統管理員。 由於 用戶帳戶控制,遠端系統上的帳戶必須是 Administrators 群組中的網域帳戶。 如需詳細資訊,請參閱用戶帳戶控制和 WMI。
- 您目前本機電腦上的密碼不是空白。 這基本上是 Windows 安全性需求,您必須使用密碼登入您的系統。
- 您的本機和遠端電腦都在相同的網域內。 如果您需要跨領域界限,您必須提供其他資訊,或使用稍微不同的程序設計模型。
- 您使用自己的帳戶來存取遠端電腦。 如果您嘗試存取不同的帳戶,則需要提供其他認證。 (請注意,不允許嘗試以與您目前帳戶不同的認證在本機存取 WMI。
- 這兩部計算機都在執行 IPv6。 WMI 支援連線到執行 IPv6 的電腦。 不過,您的本機計算機和「Computer_B」都必須執行 IPv6。 任一部計算機也可能執行 IPv4。 如需詳細資訊,請參閱 WMI IPv6 和 IPv4 支援。
- 您的腳本不需要委派 ,也就是說,不需要透過目標遠端計算機存取其他遠端計算機。 如需詳細資訊,請參閱 使用 WMI 委派。
- 您正嘗試進行特定呼叫,而不是建立遠端進程。 如需詳細資訊,請參閱 使用 WMI 遠端建立進程。
考慮到這些限制,遠端 WMI 呼叫與本機 WMI 呼叫非常類似,唯一的差異在於您必須指定遠端系統的名稱。 不過,您可以選擇變更其中許多功能:使用不同的認證,或透過第三方計算機路由呼叫,或存取不同的網域。