Establecimiento de la seguridad en IWbemServices y otros servidores proxy

En C++ puede establecer la seguridad en todo el proceso llamando a CoInitializeSecurity antes de conectarse a WMI a través de IWbemLocator::ConnectServer. También puede cambiar el nivel de autenticación, el nivel de suplantación o el servicio de autenticación en una llamada que obtiene un puntero a un proxy WMI, como IWbemServices o IWbemCallResult. Llamar a CoSetProxyBlanket también le permite cambiar el servicio de autenticación (Kerberos, NTLM o Negotiate).

Los scripts y las aplicaciones de Visual Basic solo establecen la seguridad en servidores proxy de manera indirecta a través de llamadas a SWbemServices y otros objetos de automatización. Para más información sobre cómo establecer la autenticación en script, consulte Establecimiento del nivel de seguridad de proceso predeterminado mediante VBScript.

Cambiar los niveles de seguridad o los servicios es principalmente un problema al conectarse a WMI en un equipo remoto que ejecuta un sistema operativo diferente. Para más información, consulte Conexión entre diferentes sistemas operativos.

Una aplicación cliente se conecta a un proxy WMI con una identidad. Una identidad es un objeto de datos que consta de una configuración de nombre de usuario, contraseña y autoridad. Para una aplicación cliente WMI, la llamada a la interfaz IWbemLocator::ConnectServer crea la identidad inicial. El método ConnectServer toma la identidad en un conjunto de tres parámetros, que puede establecer en NULL para indicar el usuario actual. También puede especificar un parámetro distinto de NULL para indicar un usuario y un dominio específicos. Si la llamada se realiza correctamente, ConnectServer devuelve un puntero a través del cual puede acceder a una variedad de procesos remotos, como un servicio WMI o directamente el sistema operativo Windows.

Al igual que ocurre con muchas interfaces COM, ConnectServer devuelve un puntero a un proxy. Un proxy es un objeto de datos que representa un proceso remoto, como WMI o un proveedor remoto. COM usa un proxy para permitir que los desarrolladores accedan a datos remotos como si los datos fueran locales.

Las interfaces WMI siguientes usan servidores proxy:

Después de recibir un puntero a un proceso remoto, puede hacer una de estas dos operaciones. Si sabe lo que hace el proceso, puede elegir establecer la seguridad en el puntero y acceder al proceso normalmente. Este es el caso de la mayoría de los punteros a un servicio WMI. Para más información, consulte Establecimiento de los niveles de seguridad en una conexión WMI. Como alternativa, debe tener acceso a otra interfaz COM en el proxy, como IUnknown::Release, a través de una llamada a la interfaz IUnknown en el proxy.

Valores predeterminados y recomendaciones

La versión distribuida del modelo de objetos componentes (DCOM) negocia el servicio de autenticación predeterminado (Kerberos, NTLM o Negotiate) y no puede especificar el servicio de autenticación predeterminado con CoInitializeSecurity. Especificar RPC_C_AUTHN_DEFAULT en el parámetro de servicio de autenticación de CoSetProxyBlanket permite que DCOM seleccione el servicio adecuado. En el caso de las conexiones remotas, el servicio predeterminado es Negotiate, que es el servicio recomendado para las aplicaciones que funcionan en dominios Kerberos y que no son Kerberos. Para las conexiones locales, el servicio de autenticación predeterminado es NT LAN Manager (NTLM).

En el ejemplo de código siguiente, se muestra el servicio de autenticación predeterminado que se usa.

// 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
     );

El ejemplo de código de este tema requiere estas instrucciones #include y referencias.

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

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

Para los scripts, se recomienda usar los valores predeterminados que DCOM selecciona para las llamadas remotas. En la máquina local, no puede especificar un servicio de autenticación para las llamadas a WMI. Para más información, consulte Establecimiento del servicio de autenticación mediante VBScript y Construcción de una cadena de moniker.