在 IWbemServices 和其他代理上设置安全性
在 C++ 中,可以在通过 IWbemLocator::ConnectServer 连接到 WMI 之前,调用 CoInitializeSecurity 来设置整个进程的安全性。 还可以在获取指向 WMI 代理的指针的调用(例如 IWbemServices 或 IWbemCallResult)中更改身份验证级别、模拟级别或身份验证服务。 调用 CoSetProxyBlanket 也可以更改身份验证服务(Kerberos、NTLM 或 negotiate)。
脚本和 Visual Basic 应用程序只会通过调用 SWbemServices 和其他自动化对象来间接设置代理的安全性。 有关在脚本中设置和更改身份验证与模拟的详细信息,请参阅使用 VBScript 设置默认进程安全级别。
在运行不同操作系统的远程计算机上连接到 WMI 时,如何更改安全级别或服务是一个主要考虑因素。 有关详细信息,请参阅在不同操作系统之间进行连接。
客户端应用程序使用标识连接到 WMI 代理。 标识是由用户名、密码和授权设置组成的数据对象。 对于 WMI 客户端应用程序,调用 IWbemLocator::ConnectServer 接口会创建初始标识。 ConnectServer 方法采用由三个参数组成的标识,可将其设置为 NULL 以指示当前用户。 还可以指定一个非 NULL 参数来指示特定的用户和域。 如果调用成功,ConnectServer 会返回一个指针,你可以通过该指针直接访问各种远程进程,例如 WMI 服务或 Windows 操作系统。
与许多 COM 接口一样,ConnectServer 返回指向代理的指针。 代理是代表远程进程(例如 WMI 或远程提供程序)的数据对象。 COM 使用代理来允许开发人员访问远程数据,就像访问本地数据一样。
以下 WMI 接口使用代理:
IWbemServices(SWbemServices 脚本对象)
IWbemRefresher(SWbemRefresher 脚本对象)
WMI 刷新器是一种特殊情况,因为需要为它传递 IWbemServices 指针,必须正确设置该指针的安全设置。 有关使用刷新器对象的详细信息,请参阅在 C++ 中访问性能数据。
在收到指向远程进程的指针后,可以执行以下两项操作之一。 如果你知道进程的作用,可以选择在指针上设置安全性并照常访问该进程。 大多数指向 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 设置身份验证服务和构造名字对象字符串。