連線到遠端電腦上的 WMI

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

設定遠端連線的電腦

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

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

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

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

Connecting to a Remote Computer

在心中,使用 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#

若為 System.Management) (WMI Managed 介面 v1 版本,請使用 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 呼叫非常類似, 唯一的差異在於您必須指定遠端系統的名稱。 不過,您可以選擇變更其中許多功能:使用不同的認證,或透過協力廠商電腦路由呼叫,或存取不同的網域。