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::ConnectServer eine 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 mithilfe von VBScript.

Das Ändern von Sicherheitsstufen oder Diensten ist in erster Linie ein Problem beim Herstellen einer Verbindung mit WMI auf einem Remotecomputer, 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. Für eine WMI-Clientanwendung erstellt der Aufruf der IWbemLocator::ConnectServer-Schnittstelle die anfängliche Identität. Die ConnectServer-Methode akzeptiert 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 ohne 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 seien die Daten lokal.

Die folgenden WMI-Schnittstellen verwenden Proxys:

Nachdem Sie einen Zeiger auf einen Remoteprozess erhalten haben, können Sie eine von zwei Aktionen ausführen. Wenn Sie wissen, was der Prozess ausführt, 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 zugreifen, z. B. auf IUnknown::Release.

Erkenntnisse und Empfehlungen

Die verteilte Version des Komponentenobjektmodells (Component Object Model, DCOM) handelt den Standardauthentifizierungsdienst (Kerberos, NTLM oder Negotiate) aus, und Sie können den Standardauthentifizierungsdienst nicht mit CoInitializeSecurity angeben. 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. Dabei handelt es sich um den empfohlenen 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 die 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 mithilfe von VBScript und Erstellen einer Monikerzeichenfolge.