Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Quando um aplicativo cliente faz logon no WMI (Instrumentação de Gerenciamento do Windows) pela primeira vez, ele deve definir o nível de segurança do processo padrão com uma chamada para CoInitializeSecurity. COM usa as informações na chamada para determinar quanta segurança outro processo deve ter para acessar o processo de aplicativo cliente.
As seguintes seções são discutidas neste tópico:
- Alterando as credenciais de autenticação padrão usando C++
- Alterando os níveis de representação padrão usando C++
Para a maioria dos aplicativos cliente, os argumentos mostrados no exemplo a seguir definem a segurança padrão para WMI.
HRESULT hr = NULL;
hr = CoInitializeSecurity(
NULL, // security descriptor
-1, // use this simple setting
NULL, // use this simple setting
NULL, // reserved
RPC_C_AUTHN_LEVEL_DEFAULT, // authentication level
RPC_C_IMP_LEVEL_IMPERSONATE, // impersonation level
NULL, // use this simple setting
EOAC_NONE, // no special capabilities
NULL); // reserved
if (FAILED(hr))
{
CoUninitialize();
cout << "Failed to initialize security. Error code = 0x"
<< hex << hr << endl;
return;
}
O código requer as seguintes referências e instruções #include para compilar corretamente.
#define _WIN32_DCOM
#include <iostream>
using namespace std;
#include <Wbemidl.h>
#pragma comment(lib, "wbemuuid.lib")
Definir o nível de autenticação como RPC_C_AUTHN_LEVEL_DEFAULT permite que o DCOM negocie o nível de autenticação para corresponder às demandas de segurança do computador de destino. Para obter mais informações, consulte Alteração das credenciais de autenticação padrão usando C++ e Alteração das configurações de representação padrão usando C++.
Alterando as credenciais de autenticação padrão usando C++
As credenciais de autenticação padrão funcionam para a maioria das situações, mas talvez seja necessário usar credenciais de autenticação diferentes em situações diferentes. Por exemplo, talvez você queira adicionar criptografia aos procedimentos de autenticação.
A tabela a seguir lista e descreve os diferentes níveis de autenticação.
| Nível de autenticação | Descrição |
|---|---|
| RPC_C_AUTHN_LEVEL_DEFAULT | Autenticação de segurança padrão. |
| RPC_C_AUTHN_LEVEL_NONE | Sem autenticação. |
| RPC_C_AUTHN_LEVEL_CONNECT | Autenticação somente quando o cliente cria um relacionamento com o servidor. |
| RPC_C_AUTHN_LEVEL_CALL | Autenticação sempre que o servidor recebe um RPC. |
| RPC_C_AUTHN_LEVEL_PKT | Autenticação sempre que o servidor recebe dados de um cliente. |
| Nível de Autenticação de Integridade de Pacote RPC_C | Autenticação de que nenhum dado do pacote foi modificado. |
| RPC_C_AUTHN_LEVEL_PKT_PRIVACY | Inclui todos os níveis de autenticação anteriores e criptografa o valor de cada chamada RPC. |
Você pode especificar as credenciais de autenticação padrão para vários usuários usando uma estrutura de SOLE_AUTHENTICATION_LIST no parâmetro pAuthList de CoInitializeSecurity.
O exemplo de código a seguir mostra como alterar as credenciais de autenticação.
// Auth Identity structure
SEC_WINNT_AUTH_IDENTITY_W authidentity;
SecureZeroMemory( &authidentity, sizeof(authidentity) );
authidentity.User = L"MyUser";
authidentity.UserLength = wcslen( authidentity.User );
authidentity.Domain = L"MyDomain ";
authidentity.DomainLength = wcslen( authidentity.Domain );
authidentity.Password = L"";
authidentity.PasswordLength = wcslen( authidentity.Password );
authidentity.Flags = SEC_WINNT_AUTH_IDENTITY_UNICODE;
SecureZeroMemory( authninfo, sizeof(SOLE_AUTHENTICATION_INFO)*2 );
// NTLM Settings
authninfo[0].dwAuthnSvc = RPC_C_AUTHN_WINNT;
authninfo[0].dwAuthzSvc = RPC_C_AUTHZ_NONE;
authninfo[0].pAuthInfo = &authidentity;
// Kerberos Settings
authninfo[1].dwAuthnSvc = RPC_C_AUTHN_GSS_KERBEROS ;
authninfo[1].dwAuthzSvc = RPC_C_AUTHZ_NONE;
authninfo[1].pAuthInfo = &authidentity;
SOLE_AUTHENTICATION_LIST authentlist;
authentlist.cAuthInfo = 2;
authentlist.aAuthInfo = authninfo;
CoInitializeSecurity(
NULL,
-1,
NULL,
NULL,
RPC_C_AUTHN_LEVEL_CALL,
RPC_C_IMP_LEVEL_IMPERSONATE,
&authentlist,
EOAC_NONE,
NULL);
Alterando os níveis de representação padrão usando C++
COM fornece níveis de segurança padrão lidos a partir do registro do sistema. No entanto, a menos que especificamente modificado, as configurações do registo definem o nível de representação muito baixo para que o WMI funcione. Normalmente, o nível de representação padrão é RPC_C_IMP_LEVEL_IDENTIFY, mas o WMI precisa de pelo menos RPC_C_IMP_LEVEL_IMPERSONATE para funcionar com a maioria dos provedores, e você pode encontrar uma situação em que precise definir um nível mais alto de representação. Para obter mais informações, consulte Conectando-se ao WMI em um computador remoto. A tabela a seguir lista os diferentes níveis de simulação.
| Nível | Descrição |
|---|---|
| RPC_C_IMP_LEVEL_DEFAULT | O sistema operacional escolhe o nível de representação. |
| RPC_C_IMP_LEVEL_ANONYMOUS | O servidor pode representar o cliente, mas o token de representação não pode ser usado para nada. |
| RPC_C_IMP_LEVEL_IDENTIFY | O servidor pode obter a identidade do cliente e representar o cliente para verificação de ACL. |
| RPC_C_IMP_LEVEL_IMPERSONATE | O servidor pode impersonar o cliente através de uma fronteira de computador. |
| RPC_C_IMP_LEVEL_DELEGATE | O servidor pode representar o cliente através de vários limites e pode fazer chamadas em nome do cliente. |