連線到遠端電腦上的 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:
-
使用大部分 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);
-
若為 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);
-
使用 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 呼叫非常類似, 唯一的差異在於您必須指定遠端系統的名稱。 不過,您可以選擇變更其中許多功能:使用不同的認證,或透過協力廠商電腦路由呼叫,或存取不同的網域。