Delen via


Het standaardniveau voor procesbeveiliging instellen met C++

Wanneer een clienttoepassing zich voor het eerst aanmeldt bij Windows Management Instrumentation (WMI), moet deze het standaardbeveiligingsniveau voor processen instellen met een aanroep naar CoInitializeSecurity. COM gebruikt de informatie in de aanroep om te bepalen hoeveel beveiliging een ander proces moet hebben om toegang te krijgen tot het clienttoepassingsproces.

In dit onderwerp worden de volgende secties besproken:

Voor de meeste clienttoepassingen stellen de argumenten in het volgende voorbeeld de standaardbeveiliging voor WMI in.

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;
}

De code vereist de volgende verwijzingen en #include instructies om correct te compileren.

#define _WIN32_DCOM
#include <iostream>
using namespace std;
#include <Wbemidl.h>

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

Door het verificatieniveau in te stellen op RPC_C_AUTHN_LEVEL_DEFAULT kan DCOM onderhandelen over het verificatieniveau om te voldoen aan de beveiligingsvereisten van de doelcomputer. Zie voor meer informatie het wijzigen van de standaardverificatiereferenties met C++ en het wijzigen van de standaard-imitatie-instellingen met C++.

De standaardverificatiereferenties wijzigen met C++

De standaardverificatiereferenties werken voor de meeste situaties, maar mogelijk moet u in verschillende situaties verschillende verificatiereferenties gebruiken. U kunt bijvoorbeeld versleuteling toevoegen aan de verificatieprocedures.

In de volgende tabel worden de verschillende verificatieniveaus vermeld en beschreven.

Verificatieniveau Beschrijving
RPC_C_AUTHN_LEVEL_DEFAULT Standaardbeveiligingsverificatie.
RPC_C_AUTHN_LEVEL_NONE Geen verificatie.
RPC_C_AUTHN_LEVEL_CONNECT Verificatie alleen wanneer de client een relatie met de server maakt.
RPC_C_AUTHN_LEVEL_CALL Verificatie telkens wanneer de server een RPC ontvangt.
RPC_C_AUTHN_LEVEL_PKT Verificatie telkens wanneer de server gegevens van een client ontvangt.
RPC_C_AUTHN_LEVEL_PKT_INTEGRITY Verificatie dat er geen gegevens uit het pakket zijn gewijzigd.
RPC_C_AUTHN_LEVEL_PKT_PRIVACY Bevat alle vorige verificatieniveaus en versleutelt de waarde van elke RPC-aanroep.

 

U kunt de standaardverificatiereferenties voor meerdere gebruikers opgeven met behulp van een SOLE_AUTHENTICATION_LIST structuur in de pAuthList parameter van CoInitializeSecurity.

In het volgende codevoorbeeld ziet u hoe u de verificatiereferenties wijzigt.

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

De standaard-imitatieniveaus wijzigen met C++

COM biedt standaardbeveiligingsniveaus die worden gelezen uit het systeemregister. Tenzij dit specifiek is gewijzigd, stellen de registerinstellingen het imitatieniveau echter te laag in om WMI te laten functioneren. Normaal gesproken is het standaard-imitatieniveau RPC_C_IMP_LEVEL_IDENTIFY, maar WMI heeft ten minste RPC_C_IMP_LEVEL_IMPERSONATE nodig om met de meeste providers te kunnen functioneren. Mogelijk ondervindt u een situatie waarin u een hoger imitatieniveau moet instellen. Zie Verbinding maken met WMI op een externe computervoor meer informatie. De volgende tabel bevat de verschillende niveaus van imitatie.

Niveau Beschrijving
RPC_C_IMP_LEVEL_DEFAULT Het besturingssysteem kiest het niveau van imitatie.
RPC_C_IMP_LEVEL_ANONYMOUS De server kan de client imiteren, maar het imitatietoken kan niet voor iets worden gebruikt.
RPC_C_IMP_LEVEL_IDENTIFY De server kan de identiteit van de client verkrijgen en de client imiteren voor ACL-controle.
RPC_C_IMP_LEVEL_IMPERSONATE De server kan de client imiteren over één computergrens.
RPC_C_IMP_LEVEL_DELEGATE De server kan de client imiteren over meerdere grenzen en kan namens de client aanroepen doen.