在 IWbemServices 和其他代理上设置安全性

在 C++ 中,可以在通过 IWbemLocator::ConnectServer 连接到 WMI 之前,调用 CoInitializeSecurity 来设置整个进程的安全性。 还可以在获取指向 WMI 代理的指针的调用(例如 IWbemServicesIWbemCallResult)中更改身份验证级别、模拟级别或身份验证服务。 调用 CoSetProxyBlanket 也可以更改身份验证服务(Kerberos、NTLM 或 negotiate)。

脚本和 Visual Basic 应用程序只会通过调用 SWbemServices 和其他自动化对象来间接设置代理的安全性。 有关在脚本中设置和更改身份验证与模拟的详细信息,请参阅使用 VBScript 设置默认进程安全级别

在运行不同操作系统的远程计算机上连接到 WMI 时,如何更改安全级别或服务是一个主要考虑因素。 有关详细信息,请参阅在不同操作系统之间进行连接

客户端应用程序使用标识连接到 WMI 代理。 标识是由用户名、密码和授权设置组成的数据对象。 对于 WMI 客户端应用程序,调用 IWbemLocator::ConnectServer 接口会创建初始标识。 ConnectServer 方法采用由三个参数组成的标识,可将其设置为 NULL 以指示当前用户。 还可以指定一个非 NULL 参数来指示特定的用户和域。 如果调用成功,ConnectServer 会返回一个指针,你可以通过该指针直接访问各种远程进程,例如 WMI 服务或 Windows 操作系统。

与许多 COM 接口一样,ConnectServer 返回指向代理的指针。 代理是代表远程进程(例如 WMI 或远程提供程序)的数据对象。 COM 使用代理来允许开发人员访问远程数据,就像访问本地数据一样。

以下 WMI 接口使用代理:

在收到指向远程进程的指针后,可以执行以下两项操作之一。 如果你知道进程的作用,可以选择在指针上设置安全性并照常访问该进程。 大多数指向 WMI 服务的指针都是这种情况。 有关详细信息,请参阅在 WMI 连接上设置安全级别。 或者,需要通过在代理上调用 IUnknown 接口来访问代理上的不同 COM 接口,例如 IUnknown::Release

默认值和建议

组件对象模型 (DCOM) 的分布式版本协商默认身份验证服务(Kerberos、NTLM 或 Negotiate),你无法使用 CoInitializeSecurity 指定默认身份验证服务。 在 CoSetProxyBlanket 的身份验证服务参数中指定 RPC_C_AUTHN_DEFAULT 将允许 DCOM 选择适当的服务。 对于远程连接,默认服务是 Negotiate,这是使应用程序能够在 Kerberos 和非 Kerberos 域中正常运行而建议使用的服务。 对于本地连接,默认身份验证服务是 NT LAN Manager (NTLM)。

以下代码示例演示了使用的默认身份验证服务。

// The pWbemServices variable is of type IWbemServices*

HRESULT hr = CoSetProxyBlanket(
     pWbemServices,                //Proxy
     RPC_C_AUTHN_DEFAULT,          //Authentication service 
     RPC_C_AUTHZ_DEFAULT,          //Authorization service 
     COLE_DEFAULT_PRINCIPAL,       //Server principal name used 
                                       // by authentication service
     RPC_C_AUTHN_LEVEL_DEFAULT,    //Authentication level
     RPC_C_IMP_LEVEL_IMPERSONATE,  //Impersonation level
     COLE_DEFAULT_AUTHINFO,       //Client identity
     EOAC_DEFAULT                  //Capability flags
     );

本主题中的代码示例需要以下引用和 #include 语句。

#define _WIN32_DCOM
#include <wbemidl.h>
#include <comdef.h>

#pragma comment(lib, "wbemuuid.lib")

对于脚本,建议使用 DCOM 为远程调用选择的默认值。 在本地计算机上,不能为 WMI 调用指定身份验证服务。 有关详细信息,请参阅使用 VBScript 设置身份验证服务构造名字对象字符串