共用方式為


連接到遠端電腦上的 WMI

WMI 可用來管理及存取遠端電腦上的 WMI 數據。 WMI 中的遠端聯機會受到 Windows 防火牆 和 DCOM 設定的影響。 用戶帳戶控制 (UAC) 也可能需要變更某些設定。 不過,一旦您的設定正確,對遠端系統的呼叫與本機 WMI 呼叫非常類似。 不過,您可以選擇使用不同的認證、替代驗證通訊協定和其他安全性功能,使其更加複雜。

設定電腦以供遠端連線

使用 WMI 存取遠端系統之前,您可能需要檢查一些安全性設定,以確認您具有存取權。 具體說來:

  • Windows 包含一些安全性功能,可能會封鎖對遠端系統上腳本的存取。 因此,您可能需要先修改系統的 Active Directory 和 Windows 防火牆設定,再進行 WMI 呼叫。 如需詳細資訊,請參閱 設定遠端 WMI 連線疑難解答遠端 WMI 連線

  • 必須啟用正確的 DCOM 設定,遠端連線才能運作。 變更DCOM設定可讓低許可權的使用者存取遠端連線的電腦。 如需詳細資訊,請參閱 保護遠端 WMI 連線

此外,在某些情況下,您可能想要透過固定埠執行 WMI。 若要這樣做,您也必須變更您的設定。 如需詳細資訊,請參閱 設定 WMI 的固定埠

連接遠端電腦

其核心是使用 WMI 連線到遠端系統,包括確定您有適當的許可權可存取系統,而且您的連線已正確設定。 當您有這兩個元素之後,連接本身就相當簡單。 例如,如果您使用預設安全性認證,您可以使用下列程式代碼存取遠端系統上的 WMI:

透過 PowerShell 遠端連接至 WMI

使用大多數 WMI Cmdlet 通用的 -ComputerName 參數,例如 Get-WmiObject

$strComputer = "Computer_B"
$colSettings = Get-WmiObject Win32_OperatingSystem -ComputerName $strComputer

使用 VBScript 遠端連線到 WMI

使用包含遠端系統名稱的 Moniker 來呼叫 GetObject

strComputer = "Computer_B"
Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colSettings = objWMIService.ExecQuery("Select * from Win32_OperatingSystem")

使用 C# 遠端連線到 WMI

針對目前版本的 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);

使用 C# 遠端連線到 WMI

針對 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);

範例:從遠端計算機取得 WMI 資料 (C++)

使用 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 呼叫非常類似,唯一的差異在於您必須指定遠端系統的名稱。 不過,您可以選擇變更其中許多功能:使用不同的認證,或透過第三方計算機路由呼叫,或存取不同的網域。