Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
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. |