Partilhar via


Definindo a segurança em IWbemServices e outros proxies

Enquanto estiver em C++, você pode definir a segurança em todo o processo chamando CoInitializeSecurity antes de se conectar ao WMI por meio 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 numa chamada que obtenha um ponteiro para um proxy WMI, como IWbemServices ou IWbemCallResult . Chamar CoSetProxyBlanket também permite alterar o serviço de autenticação (Kerberos, NTLM ou negociar).

Scripts e aplicativos 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 Definindo o nível de segurança do processo padrão usando o VBScript.

Alterar os níveis de segurança ou serviços é principalmente uma preocupação ao se conectar ao WMI em um computador remoto que esteja executando um sistema operacional diferente. Para obter mais informações, consulte Conectando entre diferentes sistemas operacionais.

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, senha e configurações de autoridade. Para um aplicativo cliente WMI, a chamada para a interfaceIWbemLocator::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 deNULL não para indicar um usuário e domínio específicos. Se a chamada for bem-sucedida, ConnectServer retornará um ponteiro através 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, ConnectServer retorna um ponteiro para um proxy. Um proxy é um objeto de dados que representa um processo remoto, como WMI ou um provedor remoto. O COM usa um proxy para permitir que os desenvolvedores acessem dados remotos como se os dados fossem locais.

As seguintes interfaces WMI usam proxies:

Depois de receber um ponteiro para um processo remoto, você pode fazer uma das duas coisas. Se você sabe o que o processo faz, você pode optar por definir a segurança no ponteiro e acessar o processo normalmente. Aplica-se à maioria dos ponteiros para um serviço WMI. Para obter mais informações, consulte Definindo os níveis de segurança em uma conexão WMI. Como alternativa, é necessário aceder a uma interface COM diferente no proxy, como IUnknown::Release, através de uma chamada à interface IUnknown no proxy.

Incumprimentos 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 é Negociar, 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 que está 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 instruções de referência e #include.

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

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

Para scripting, é recomendável usar as definições padrão que o DCOM seleciona para chamadas remotas. Na máquina local, não é possível especificar um serviço de autenticação para chamadas para WMI. Para obter mais informações, consulte Definindo o serviço de autenticação usando o VBScript e Construindo uma cadeia de caracteres de moniker.