Festlegen der Standardprozesssicherheitsstufe mithilfe von C++

Wenn sich eine Clientanwendung zum ersten Mal bei der Windows-Verwaltungsinstrumentation (WMI) anmeldet, muss sie die Standardprozesssicherheitsstufe mit einem Aufruf von CoInitializeSecurity festlegen. COM verwendet die Informationen im Aufruf, um zu bestimmen, wie viel Sicherheit ein anderer Prozess haben muss, um auf den Clientanwendungsprozess zuzugreifen.

Die folgenden Abschnitte werden in diesem Thema behandelt:

Für die meisten Clientanwendungen legen die im folgenden Beispiel gezeigten Argumente die Standardsicherheit für WMI fest.

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

Der Code erfordert die folgenden Verweise und #include-Anweisungen für eine ordnungsgemäße Kompilierung.

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

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

Wenn Sie die Authentifizierungsebene auf RPC_C_AUTHN_LEVEL_DEFAULT festlegen, kann DCOM die Authentifizierungsebene so aushandeln, dass sie den Sicherheitsanforderungen des Zielcomputers entspricht. Weitere Informationen finden Sie unter Ändern der Standardanmeldeinformationen für die Authentifizierung mithilfe von C++ und Ändern der Standardidentitätswechseleinstellungen mithilfe von C++.

Ändern der Standardanmeldeinformationen für die Authentifizierung mithilfe von C++

Die Standardanmeldeinformationen für die Authentifizierung funktionieren in den meisten Situationen, aber Möglicherweise müssen Sie in verschiedenen Situationen unterschiedliche Anmeldeinformationen für die Authentifizierung verwenden. So können Sie beispielsweise den Authentifizierungsverfahren eine Verschlüsselung hinzufügen.

In der folgenden Tabelle werden die verschiedenen Authentifizierungsebenen aufgeführt und beschrieben.

Authentifizierungsebene BESCHREIBUNG
RPC_C_AUTHN_LEVEL_DEFAULT Standard-Sicherheitsauthentifizierung.
RPC_C_AUTHN_LEVEL_NONE Keine Authentifizierung
RPC_C_AUTHN_LEVEL_CONNECT Authentifizierung nur, wenn der Client eine Beziehung mit dem Server erstellt.
RPC_C_AUTHN_LEVEL_CALL Authentifizierung jedes Mal, wenn der Server einen RPC empfängt.
RPC_C_AUTHN_LEVEL_PKT Authentifizierung jedes Mal, wenn der Server Daten von einem Client empfängt.
RPC_C_AUTHN_LEVEL_PKT_INTEGRITY Authentifizierung, dass keine Daten aus dem Paket geändert wurden.
RPC_C_AUTHN_LEVEL_PKT_PRIVACY Schließt alle vorherigen Authentifizierungsebenen ein und verschlüsselt den Wert jedes RPC-Aufrufs.

 

Sie können die Standardauthentifizierungsanmeldeinformationen für mehrere Benutzer angeben, indem Sie eine SOLE_AUTHENTICATION_LIST-Struktur im pAuthList-Parameter von CoInitializeSecurity verwenden.

Im folgenden Codebeispiel wird gezeigt, wie die Anmeldeinformationen für die Authentifizierung geändert werden.

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

Ändern der Standardidentitätswechselebenen mithilfe von C++

COM stellt Standardsicherheitsstufen bereit, die aus der Systemregistrierung gelesen werden. Sofern nicht ausdrücklich geändert, legen die Registrierungseinstellungen die Identitätswechselstufe jedoch zu niedrig fest, damit WMI funktioniert. In der Regel ist die Standardidentitätswechselebene RPC_C_IMP_LEVEL_IDENTIFY, aber WMI benötigt mindestens RPC_C_IMP_LEVEL_IMPERSONATE , um mit den meisten Anbietern zu funktionieren, und möglicherweise müssen Sie eine höhere Ebene des Identitätswechsels festlegen. Weitere Informationen finden Sie unter Herstellen einer Verbindung mit WMI auf einem Remotecomputer. In der folgenden Tabelle sind die verschiedenen Ebenen des Identitätswechsels aufgeführt.

Ebene BESCHREIBUNG
RPC_C_IMP_LEVEL_DEFAULT Das Betriebssystem wählt die Ebene des Identitätswechsels aus.
RPC_C_IMP_LEVEL_ANONYMOUS Der Server kann die Identität des Clients annehmen, aber das Identitätswechseltoken kann für nichts verwendet werden.
RPC_C_IMP_LEVEL_IDENTIFY Der Server kann die Identität des Clients abrufen und die Identität des Clients für die ACL-Überprüfung annehmen.
RPC_C_IMP_LEVEL_IMPERSONATE Der Server kann die Identität des Clients über eine Computergrenze hinweg annehmen.
RPC_C_IMP_LEVEL_DELEGATE Der Server kann die Identität des Clients über mehrere Grenzen hinweg annehmen und Aufrufe im Namen des Clients tätigen.