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:
- Ändern der Standardanmeldeinformationen für die Authentifizierung mithilfe von C++
- Ändern der Standardidentitätswechselebenen mithilfe von C++
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. |