Festlegen der Sicherheit für IWbemServices und andere Proxys

In C++ können Sie die Sicherheit für den gesamten Prozess festlegen, indem Sie CoInitializeSecurity aufrufen, bevor Sie über IWbemLocator::ConnectServereine Verbindung mit WMI herstellen. Sie können auch die Authentifizierungsebene, die Identitätswechselebene oder den Authentifizierungsdienst in einem Aufruf ändern, der einen Zeiger auf einen WMI-Proxy abruft, z. B. IWbemServices oder IWbemCallResult. Wenn Sie CoSetProxyBlanket aufrufen, können Sie auch den Authentifizierungsdienst (Kerberos, NTLM oder Negotiate) ändern.

Skripts und Visual Basic Anwendungen legen die Sicherheit für Proxys nur indirekt durch Aufrufe von SWbemServices und anderen Automatisierungsobjekten fest. Weitere Informationen zum Festlegen und Ändern der Authentifizierung und des Identitätswechsels im Skript finden Sie unter Festlegen der Standardprozesssicherheitsstufe mit VBScript.

Das Ändern von Sicherheitsebenen oder -diensten ist in erster Linie ein Problem, wenn eine Verbindung mit WMI auf einem Remotecomputer hergestellt wird, auf dem ein anderes Betriebssystem ausgeführt wird. Weitere Informationen finden Sie unter Herstellen einer Verbindung zwischen verschiedenen Betriebssystemen.

Eine Clientanwendung stellt mithilfe einer Identität eine Verbindung mit einem WMI-Proxy her. Eine Identität ist ein Datenobjekt, das aus einem Benutzernamen, einem Kennwort und Autoritätseinstellungen besteht. Bei einer WMI-Clientanwendung wird durch den Aufruf der IWbemLocator::ConnectServer-Schnittstelle die anfängliche Identität erstellt. Die ConnectServer-Methode verwendet die Identität in einem Satz von drei Parametern, die Sie auf NULL festlegen können, um den aktuellen Benutzer anzugeben. Sie können auch einen Parameter ungleich NULL angeben, um einen bestimmten Benutzer und eine bestimmte Domäne anzugeben. Wenn der Aufruf erfolgreich ist, gibt ConnectServer einen Zeiger zurück, über den Sie direkt auf eine Vielzahl von Remoteprozessen zugreifen können, z. B. einen WMI-Dienst oder das Windows Betriebssystem.

Wie viele COM-Schnittstellen gibt ConnectServer einen Zeiger auf einen Proxy zurück. Ein Proxy ist ein Datenobjekt, das einen Remoteprozess darstellt, z. B. WMI oder einen Remoteanbieter. COM verwendet einen Proxy, um Entwicklern den Zugriff auf Remotedaten zu ermöglichen, als wären die Daten lokal.

Die folgenden WMI-Schnittstellen verwenden Proxys:

Nachdem Sie einen Zeiger auf einen Remoteprozess erhalten haben, können Sie zwei Dinge tun. Wenn Sie wissen, was der Prozess macht, können Sie die Sicherheit für den Zeiger festlegen und normal auf den Prozess zugreifen. Dies ist bei den meisten Zeigern auf einen WMI-Dienst der Fall. Weitere Informationen finden Sie unter Festlegen der Sicherheitsstufen für eine WMI-Verbindung. Alternativ müssen Sie über einen Aufruf der IUnknown-Schnittstelle auf dem Proxy auf eine andere COM-Schnittstelle wie IUnknown::Releasezugreifen.

Standardwerte und Empfehlungen

Die verteilte Version des Component Object Model (DCOM) handelt den Standardauthentifizierungsdienst (Kerberos, NTLM oder Negotiate) aus, und Sie können den Standardauthentifizierungsdienst nicht mit CoInitializeSecurityangeben. Wenn Sie RPC _ C _ AUTHN _ DEFAULT im Authentifizierungsdienstparameter von CoSetProxyBlanket angeben, kann DCOM den entsprechenden Dienst auswählen. Für Remoteverbindungen ist der Standarddienst Negotiate. Dies ist der empfohlene Dienst für Anwendungen, die sowohl in Kerberos- als auch in Nicht-Kerberos-Domänen funktionieren. Für lokale Verbindungen ist der Standardauthentifizierungsdienst NT LAN Manager (NTLM).

Das folgende Codebeispiel zeigt den verwendeten Standardauthentifizierungsdienst.

// The pWbemServices variable is of type IWbemServices*

HRESULT hr = CoSetProxyBlanket(
     pWbemServices,                //Proxy
     RPC_C_AUTHN_DEFAULT,          //Authentication service 
     RPC_C_AUTHZ_DEFAULT,          //Authorization service 
     COLE_DEFAULT_PRINCIPAL,       //Server principal name used 
                                       // by authentication service
     RPC_C_AUTHN_LEVEL_DEFAULT,    //Authentication level
     RPC_C_IMP_LEVEL_IMPERSONATE,  //Impersonation level
     COLE_DEFAULT_AUTHINFO,       //Client identity
     EOAC_DEFAULT                  //Capability flags
     );

Das Codebeispiel in diesem Thema erfordert den folgenden Verweis und # include-Anweisungen.

#define _WIN32_DCOM
#include <wbemidl.h>
#include <comdef.h>

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

Für die Skripterstellung wird empfohlen, die Standardwerte zu verwenden, die DCOM für Remoteaufrufe auswählt. Auf dem lokalen Computer können Sie keinen Authentifizierungsdienst für WMI-Aufrufe angeben. Weitere Informationen finden Sie unter Festlegen des Authentifizierungsdiensts mit VBScript und Erstellen einer Monikerzeichenfolge.