Verringern der Sicherheit für eine Senke in einem separaten Prozess
Die Windows-Verwaltungsinstrumentation (WMI) kann die Senke erstellen, um asynchrone Rückrufe für eine Clientanwendung in einem separaten Prozess zu empfangen. Der separate Prozess ist „Unsecapp.exe“. Verwenden Sie die Schnittstelle IWbemUnsecuredApartment. Mit IWbemUnsecuredApartment können Sie steuern, ob „Unsecapp.exe“ Rückrufe an die Senke authentifiziert. Weitere Informationen finden Sie unter Festlegen der Sicherheit für einen asynchronen Aufruf.
Anschließend können Sie die Sicherheit für diesen Prozess verringern, und WMI kann ohne Einschränkung auf die Senke zugreifen. Um diese Technik zu unterstützen, stellt WMI den Prozess „Unsecapp.exe“ bereit, der als separater Prozess fungiert. Sie können „Unsecapp.exe“ mit einem Aufruf der Schnittstelle IUnsecuredApartment hosten.
Die Schnittstelle IUnsecuredApartment ermöglicht es einer Clientanwendung, einen separaten dedizierten Prozess zu erstellen, der „Unsecapp.exe“ zum Hosten einer IWbemObjectSink-Implementierung ausführt. Der dedizierte Prozess kann CoInitializeSecurity aufrufen, um WMI-Zugriff auf den dedizierten Prozess zu gewähren, ohne die Sicherheit des Hauptprozesses zu beeinträchtigen. Nach der Initialisierung fungiert der dedizierte Prozess als Vermittler zwischen dem Hauptprozess und WMI.
Im folgenden Verfahren wird beschrieben, wie Sie einen asynchronen Aufruf mit IUnsecuredApartment ausführen.
So führen Sie einen asynchronen Aufruf mit „IUnsecuredApartment“ aus
Erstellen Sie einen dedizierten Prozess durch Aufrufen von CoCreateInstance.
Im folgenden Codebeispiel wird CoCreateInstance aufgerufen, um einen dedizierten Prozess zu erstellen.
IUnsecuredApartment* pUnsecApp = NULL; CoCreateInstance(CLSID_UnsecuredApartment, NULL, CLSCTX_LOCAL_SERVER, IID_IUnsecuredApartment, (void**)&pUnsecApp);
Instanziieren Sie das Senkenobjekt.
Im folgenden Codebeispiel wird ein neues Senkenobjekt erstellt.
CMySink* pSink = new CMySink; pSink->AddRef();
Erstellen Sie einen Stub für den neuen Code.
Ein Stub ist eine Wrapperfunktion, die von der Senke erzeugt wird.
Im folgenden Codebeispiel wird CreateObjectStub aufgerufen, um einen Stub für die Senke zu erstellen.
IUnknown* pStubUnk = NULL; pUnsecApp->CreateObjectStub(pSink, &pStubUnk);
Rufen Sie QueryInterface für den Wrapper auf, und fordern Sie einen Zeiger auf die IWbemObjectSink-Schnittstelle an.
Im folgenden Codebeispiel wird QueryInterface aufgerufen und ein Zeiger auf die IWbemObjectSink-Schnittstelle angefordert.
IWbemObjectSink* pStubSink = NULL; pStubUnk->QueryInterface(IID_IWbemObjectSink, (void **)&pStubSink); pStubUnk->Release();
Geben Sie den Senkenobjektzeiger frei.
Sie können den Objektzeiger freigeben, da der Stub jetzt den Zeiger besitzt.
Im folgenden Codebeispiel wird der Senkenobjektzeiger freigegeben.
pSink->Release();
Verwenden Sie den Stub in jedem asynchronen Aufruf.
Wenn Sie mit dem Aufruf fertig sind, geben Sie die lokale Verweisanzahl frei.
Im folgenden Codebeispiel wird der Stub in einem asynchronen Aufruf verwendet.
// pServices is an IWbemServices* object pServices->CreateInstanceEnumAsync(strClassName, 0, NULL, pStubSink);
Manchmal müssen Sie möglicherweise einen asynchronen Aufruf abbrechen, nachdem Sie ihn gestartet haben. Wenn Sie den Anruf abbrechen müssen, brechen Sie ihn mit demselben Zeiger ab, mit dem der Aufruf ursprünglich getätigt wurde.
Im folgenden Codebeispiel wird gezeigt, wie Sie einen asynchronen Aufruf abbrechen.
pServices->CancelAsyncCall(pStubSink);
Geben Sie die lokale Verweisanzahl frei, wenn Sie mit dem asynchronen Aufruf fertig sind.
Stellen Sie sicher, dass Sie den Zeiger pStubSink erst freigeben, nachdem Sie sich vergewissert haben, dass der asynchrone Aufruf nicht abgebrochen werden muss. Darüber hinaus dürfen Sie pStubSink nicht freigeben, nachdem WMI den Senkenzeiger pSink freigegeben hat. Die Freigabe von pStubSink nach pSink erzeugt eine Zirkelverweisanzahl, bei der sowohl die Senke als auch der Stub für immer im Arbeitsspeicher verbleiben. Ein möglicher Ort für die Freigabe des Zeigers ist stattdessen der Aufruf IWbemObjectSink::SetStatus, der von WMI ausgeführt wird, um zu melden, dass der ursprüngliche asynchrone Aufruf abgeschlossen ist.
Nach Fertigstellung heben Sie die Initialisierung von COM mit einem Aufruf von Release() auf.
Im folgenden Codebeispiel wird veranschaulicht, wie Release() für den pUnsecApp-Zeiger aufgerufen wird.
pUnsecApp->Release();
Für die Codebeispiele in diesem Thema müssen die folgenden Verweise und #include-Anweisungen ordnungsgemäß kompiliert werden.
#include <wbemidl.h> #pragma comment(lib, "wbemuuid.lib")
Weitere Informationen zur Funktion CoInitializeSecurity und deren Parametern finden Sie in der COM-Dokumentation im Platform Software Development Kit (SDK).