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:
IWbemServices (SWbemServices-Skriptobjek)
IWbemRefresher (SWbemRefresher-Skriptobjek)
Die WMI-Auffrischung ist ein Sonderfall, da ein IWbemServices-Zeiger übergeben wird, dessen Sicherheitseinstellungen ordnungsgemäß festgelegt werden müssen. Weitere Informationen zur Verwendung von Aktualisierungsobjekten finden Sie unter Zugreifen auf Leistungsdaten in C++.
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.