保护远程 WMI 连接

若要使用 WMI 连接到远程计算机,请确保为连接启用正确的 DCOM 设置和 WMI 命名空间安全设置。

WMI 具有远程连接中目标计算机所需的默认模拟、身份验证和身份验证服务(NTLM 或 Kerberos)设置。 你的本地计算机可能使用了目标系统不接受的其他默认值。 可以在连接调用中更改这些设置。

本主题包括以下部分:

WMI 的 DCOM 模拟和身份验证设置

WMI 具有远程系统所需的默认 DCOM 模拟、身份验证和身份验证服务(NTLM 或 Kerberos)设置。 你的本地系统可能使用了目标远程系统不接受的其他默认值。 可以在连接调用中更改这些设置。 有关详细信息,请参阅设置客户端应用程序进程安全性。 但是,对于身份验证服务,建议指定 RPC_C_AUTHN_DEFAULT 并允许 DCOM 为目标计算机选择适当的服务

可以在 C++ 中的 CoInitializeSecurityCoSetProxyBlanket 调用参数中提供设置。 在脚本中,可以在 SWbemLocator.ConnectServer 调用、SWbemSecurity 对象或脚本名字对象字符串中建立安全设置

有关所有 C++ 模拟常量的列表,请参阅使用 C++ 设置默认进程安全级别。 有关用于使用名字对象连接的 Visual Basic 常量和脚本字符串,请参阅使用 VBScript 设置默认进程安全级别

下表列出了远程连接中目标计算机(计算机 B)所需的默认 DCOM 模拟、身份验证和身份验证服务设置。 有关详细信息,请参阅“保护远程 WMI 连接”。

计算机 B 操作系统 模拟级别脚本字符串 身份验证级别脚本字符串 身份验证服务
Windows Vista 或更高版本 Impersonate Pkt Kerberos

 

WMI 远程连接受用户帐户控制 (UAC)Windows 防火墙的影响。 有关详细信息,请参阅从 Vista 开始可以远程连接到 WMI通过 Windows 防火墙进行连接

请注意,连接到本地计算机上的 WMI 将使用默认身份验证级别 PktPrivacy

将 DCOM 安全性设置为允许用户远程访问计算机

WMI 中的安全性与连接到 WMI 命名空间相关。 WMI 使用 DCOM 来处理远程调用。 无法连接到远程计算机的一个原因是出现 DCOM 故障(错误“DCOM 访问被拒绝”十进制代码 -2147024891 或十六进制代码 0x80070005)。 有关 C++ 应用程序的 WMI 中 DCOM 安全性的详细信息,请参阅设置客户端应用程序进程安全性

可以使用“控制面板”上“管理工具”中的 DCOM 配置实用工具 (DCOMCnfg.exe) 来配置 WMI 的 DCOM 设置。 此实用工具公开了使某些用户能够通过 DCOM 远程连接到计算机的设置。 默认允许管理员组的成员远程连接到计算机。 使用此实用工具可以设置启动、访问和配置 WMI 服务时的安全性。

以下过程说明如何为某些用户和组授予 DCOM 远程启动和激活权限。 如果计算机 A 远程连接到计算机 B,则你可以在计算机 B 上设置这些权限,以允许不属于计算机 B 上管理员组的用户或组在计算机 B 上执行 DCOM 启动和激活调用。

为用户或组授予 DCOM 远程启动和激活权限

  1. 依次单击“开始”、“运行”,键入 DCOMCNFG,然后单击“确定”

  2. 在“组件服务”对话框中,依次展开“组件服务”、“计算机”,右键单击“我的电脑”,然后单击“属性”

  3. 在“我的电脑属性”对话框中,单击“COM 安全性”选项卡

  4. 在“启动和激活权限”下,单击“编辑限制”

  5. 在“启动权限”对话框中,如果你的用户名或组未出现在“组或用户名”列表中,请执行以下步骤

    1. 在“启动权限”对话框中,单击“添加”
    2. 在“选择用户、计算机或组”对话框的“输入对象名称来选择”框中,添加你的用户名和组,然后单击“确定”
  6. 在“启动权限”对话框的“组或用户名”框中,选择你的用户名和组。 在“用户权限”下的“允许”列中,选择“远程启动”和“远程激活”,然后单击“确定”

以下过程说明如何为某些用户和组授予 DCOM 远程访问权限。 如果计算机 A 远程连接到计算机 B,则你可以在计算机 B 上设置这些权限,以允许不属于计算机 B 上管理员组的用户或组连接到计算机 B。

授予 DCOM 远程访问权限

  1. 依次单击“开始”、“运行”,键入 DCOMCNFG,然后单击“确定”
  2. 在“组件服务”对话框中,依次展开“组件服务”、“计算机”,右键单击“我的电脑”,然后单击“属性”
  3. 在“我的电脑属性”对话框中,单击“COM 安全性”选项卡
  4. 在“访问权限”下,单击“编辑限制”
  5. 在“访问权限”对话框中,选择“组或用户名”框中的“匿名登录”名称。 在“用户权限”下的“允许”列中,选择“远程访问”,然后单击“确定”

允许用户访问特定的 WMI 命名空间

通过在命名空间的 WMI 控件中设置“远程启用”权限,可以允许或禁止用户访问特定的 WMI 命名空间。 如果用户尝试连接到他们无权访问的命名空间,则会收到错误 0x80041003。 默认情况下,仅为管理员启用此权限。 管理员可为非管理员用户启用对特定 WMI 命名空间的远程访问权限。

以下过程为非管理员用户设置远程启用权限。

设置远程启用权限

  1. 使用 WMI 控件连接到远程计算机。

    有关 WMI 控件的详细信息,请参阅使用 WMI 控件设置命名空间安全性

  2. 在“安全性”选项卡中,选择命名空间并单击“安全性”

  3. 找到相应的帐户,并在“权限”列表中选中“远程启用”

将命名空间安全性设置为要求对远程连接进行数据加密

管理员或 MOF 文件可以配置 WMI 命名空间,以便不会返回任何数据,除非在与该命名空间的连接中使用数据包隐私性(RPC_C_AUTHN_LEVEL_PKT_PRIVACY 或 PktPrivacy 作为脚本中的名字对象)。 这可以确保数据在通过网络传输时经过加密。 如果你尝试设置更低的身份验证级别,将收到拒绝访问消息。 有关详细信息,请参阅要求与命名空间建立加密连接

以下 VBScript 代码示例演示如何使用“pktPrivacy”连接到已加密的命名空间。

strComputer = "RemoteComputer"
Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate,authenticationLevel=pktPrivacy}!\\" _
                              & strComputer & "\root\EncryptedNamespace")

使用 WMI 进行委托

使用 WMI 远程创建进程

保护 C++ 客户端和提供程序

保护脚本客户端