Definindo a segurança no IWbemServices e outros proxies
No C++ você pode definir a segurança no processo todo chamando CoInitializeSecurity antes de se conectar ao WMI por meio de IWbemLocator::ConnectServer. Você também pode alterar o nível de autenticação, o nível de representação ou o serviço de autenticação em uma chamada que obtém um ponteiro para um proxy WMI, como IWbemServices ou IWbemCallResult. Chamar CoSetProxyBlanket também permite que você altere o serviço de autenticação (Kerberos, NTLM ou negotiate).
Scripts e aplicativos do Visual Basic só definem a segurança em proxies indiretamente por meio de chamadas para SWbemServices e outros objetos de automação. Para obter mais informações sobre como definir e alterar a autenticação e a representação no script, consulte Definir o nível de segurança do processo padrão usando VBScript.
A alteração dos níveis de segurança ou serviços é uma preocupação principalmente ao conectar-se ao WMI em um computador remoto que esteja executando um sistema operacional diferente. Para obter mais informações, consulte Conexão entre sistemas operacionais diferentes.
Um aplicativo cliente se conecta a um proxy WMI usando uma identidade. Uma identidade é um objeto de dados que consiste em um nome de usuário, uma senha e configurações de autoridade. Para um aplicativo cliente WMI, a chamada para a interface IWbemLocator::ConnectServer cria a identidade inicial. O método ConnectServer usa a identidade em um conjunto de três parâmetros, que você pode definir como NULL para indicar o usuário atual. Você também pode especificar um parâmetro não NULL para indicar um usuário e um domínio específicos. Se a chamada for bem-sucedida, o ConnectServer retornará um ponteiro por meio do qual você pode acessar uma variedade de processos remotos, como um serviço WMI ou o sistema operacional Windows diretamente.
Como muitas interfaces COM, o ConnectServer retorna um ponteiro para um proxy. Um proxy é um objeto de dados que representa um processo remoto, como o WMI ou um provedor remoto. O COM usa um proxy para permitir que os desenvolvedores acessem dados remotos como eles fossem locais.
As seguintes interfaces WMI usam proxies:
IWbemServices (objeto de script SWbemServices)
IWbemRefresher (objeto de script SWbemRefresher)
O Atualizador WMI é um caso especial pois recebe um ponteiro IWbemServices, cujas configurações de segurança devem ser adequadamente definidas. Para obter mais informações sobre como usar objetos de atualização, consulte Acessar dados de desempenho no C++.
Depois de receber um ponteiro para um processo remoto, você pode fazer uma das duas coisas. Se você souber o que o processo faz, poderá optar por definir a segurança no ponteiro e acessar o processo normalmente. Esse é o caso com a maioria dos ponteiros para um serviço WMI. Para obter mais informações, consulte Definir níveis de segurança em uma conexão WMI. Como alternativa, você precisa acessar uma interface COM diferente no proxy, como IUnknown::Release, por meio de uma chamada para a interface IUnknown no proxy.
Padrões e recomendações
A versão distribuída do DCOM (Component Object Model) negocia o serviço de autenticação padrão (Kerberos, NTLM ou Negotiate) e você não pode especificar o serviço de autenticação padrão usando CoInitializeSecurity. Especificar RPC_C_AUTHN_DEFAULT no parâmetro de serviço de autenticação de CoSetProxyBlanket permite que o DCOM selecione o serviço apropriado. Para conexões remotas, o serviço padrão é Negotiate, que é o serviço recomendado para aplicativos que funcionam em domínios Kerberos e não Kerberos. Para conexões locais, o serviço de autenticação padrão é NT LAN Manager (NTLM).
O exemplo de código a seguir mostra o serviço de autenticação padrão sendo usado.
// 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
);
O exemplo de código neste tópico requer as seguintes referências e instruções #include.
#define _WIN32_DCOM
#include <wbemidl.h>
#include <comdef.h>
#pragma comment(lib, "wbemuuid.lib")
Para scripts, é recomendável que você use os padrões que o DCOM seleciona para chamadas remotas. No computador local, você não pode especificar um serviço de autenticação para chamadas ao WMI. Para obter mais informações, consulte Configurar o serviço de autenticação usando VBScript e Construir uma cadeia de caracteres de moniker.