连接到远程计算机上的 WMI

WMI 可用于管理和访问远程计算机上的 WMI 数据。 Windows 防火墙和 DCOM 设置会影响 WMI 中的远程连接。 (UAC) 的用户帐户控制 也可能需要更改某些设置。 但是,一旦你的设置正确,对远程系统的调用与本地 WMI 调用非常类似。 您可以选择使用不同的凭据、备用身份验证协议和其他安全功能,使其更复杂。

为远程连接配置计算机

你可能需要检查某些安全设置,以确认你具有访问权限,然后才能使用 WMI 访问远程系统。 具体而言:

  • Windows 包含许多安全功能,这些功能可能会阻止对远程系统上的脚本的访问。 因此,你可能需要在进行 WMI 调用之前修改系统的 Active Directory 和 Windows 防火墙设置。 有关详细信息,请参阅 设置远程 Wmi 连接对远程 Wmi 连接进行故障排除

  • 要使远程连接正常工作,必须启用正确的 DCOM 设置。 更改 DCOM 设置可以允许低权限用户访问计算机进行远程连接。 有关详细信息,请参阅 保护远程 WMI 连接

此外,在某些情况下,你可能希望在某些情况下通过固定端口运行 WMI。 为此,您还需要更改您的设置。 有关详细信息,请参阅为 WMI 设置固定端口

Connecting to a Remote Computer

在本质上,使用 WMI 连接到远程系统包括确保你具有访问系统的相应权限,并且已正确配置连接。 一旦有这两个元素,连接就会相对简单。 例如,如果您使用的是默认的安全凭据,则可以使用以下代码访问远程系统上的 WMI:

通过 PowerShell 远程连接到 WMI

使用大多数 WMI cmdlet (如 get-wmiobject)的 -ComputerName 参数。

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

通过 VBScript 远程连接到 WMI

使用一个名字对象,该名字对象包含调用 GetObject的远程系统的名称。

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

用 C 远程连接到 WMI#

对于 (的 WMI 托管接口的当前版本) ,请使用 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.web) 的 WMI 托管接口的 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 执行的最基本的远程连接。 具体而言,这些示例假定以下内容:

  • 你是远程计算机上的管理员。 由于 用户帐户控制,远程系统上的帐户必须是管理员组中的域帐户。 有关详细信息,请参阅用户帐户控制和 WMI。
  • 当前本地计算机上的密码不为空。 这实质上是您必须使用密码登录到系统的 Windows 安全要求。
  • 本地计算机和远程计算机都位于同一域中。 如果需要跨域边界,则需要提供其他信息或使用略微不同的编程模型。
  • 你使用自己的帐户来访问远程计算机。 如果尝试访问其他帐户,则需要提供其他凭据。 (请注意,不允许尝试使用不同于当前帐户的凭据在本地访问 WMI。 )
  • 两台计算机都在运行 IPv6。 WMI 支持连接到运行 IPv6 的计算机。 但是,本地计算机和 "计算机 _ B" 必须运行 IPv6。 这两台计算机还可能运行 IPv4。 有关详细信息,请参阅 WMI 中的 IPv6 和 IPv4 支持
  • 脚本不需要委托-也就是说,它不需要通过目标远程计算机访问其他远程计算机。 有关详细信息,请参阅 与 WMI 委托
  • 你正在尝试进行特定的调用,而不是创建远程进程。 有关详细信息,请参阅 使用 WMI 远程创建进程

考虑到这些限制,远程 WMI 调用非常类似于本地 WMI 调用-唯一的区别在于必须指定远程系统的名称。 但是,你可以选择更改其中的许多功能:使用不同的凭据,或通过第三方计算机或访问其他域来路由呼叫。