Verringern der Sicherheit für eine Senke in einem separaten Prozess

Windows-Verwaltungsinstrumentation (WMI) kann die Senke erstellen, um asynchrone Rückrufe für eine Client Anwendung in einem separaten Prozess zu empfangen. Der separate Prozess ist Unsecapp.exe. Verwenden Sie die iwbemunsecuder -Schnittstelle. Mit iwbemunsecuredapartment können Sie steuern, ob Unsecapp.exe Rückrufe für die Senke authentifiziert. Weitere Informationen finden Sie unter Festlegen der Sicherheit für einen asynchronen-Befehl.

Anschließend können Sie die Sicherheit für diesen Prozess verringern, und WMI kann ohne Einschränkung auf die Senke zugreifen. Zur Unterstützung dieser Technik stellt WMI den Unsecapp.exe Prozess bereit, der als separater Prozess fungiert. Sie können Unsecapp.exe hosten, indem Sie die iunsecuredapartment -Schnittstelle abrufen.

Die iunsecumenpartment -Schnittstelle ermöglicht es einer Client Anwendung, einen separaten dedizierten Prozess zu erstellen, der Unsecapp.exe zum Hosting einer iwbebobjectsink -Implementierung ausgeführt wird. Der dedizierte Prozess kann CoInitializeSecurity aufrufen, um den WMI-Zugriff auf den dedizierten Prozess zu gewähren, ohne die Sicherheit des Haupt Prozesses zu beeinträchtigen. Nach der Initialisierung fungiert der dedizierte Prozess als Vermittler zwischen dem Hauptprozess und WMI.

Im folgenden Verfahren wird beschrieben, wie ein asynchroner-Befehl mit iunsecuredapartmentdurchgeführt wird.

So führen Sie einen asynchronen aufrufsbefehl mit iunsecuredapartment aus

  1. Erstellen Sie einen dedizierten Prozess mit einem Aufrufen von cokreateinstance.

    Im folgenden Codebeispiel wird cokreatanstance aufgerufen, um einen dedizierten Prozess zu erstellen.

    IUnsecuredApartment* pUnsecApp = NULL;
    
    CoCreateInstance(CLSID_UnsecuredApartment, NULL, 
      CLSCTX_LOCAL_SERVER, IID_IUnsecuredApartment, 
      (void**)&pUnsecApp);
    
  2. Instanziieren Sie das sink-Objekt.

    Im folgenden Codebeispiel wird ein neues Sink-Objekt erstellt.

    CMySink* pSink = new CMySink;
    pSink->AddRef();
    
  3. Erstellen Sie einen Stub für die Senke.

    Ein Stub ist eine Wrapper Funktion, die von der Senke erzeugt wird.

    Im folgenden Codebeispiel wird " itateobjectstub " aufgerufen, um einen Stub für die Senke zu erstellen.

    IUnknown* pStubUnk = NULL; 
    pUnsecApp->CreateObjectStub(pSink, &pStubUnk);
    
  4. Aufrufen von QueryInterface für den Wrapper und Anfordern eines Zeigers auf die iwbemubjectsink -Schnittstelle.

    Im folgenden Codebeispiel wird QueryInterface aufgerufen und ein Zeiger auf die iwbemubjectsink -Schnittstelle angefordert.

    IWbemObjectSink* pStubSink = NULL;
    pStubUnk->QueryInterface(IID_IWbemObjectSink, (void **)&pStubSink); pStubUnk->Release();
    
  5. Geben Sie den Sink-Objekt Zeiger frei.

    Sie können den Objekt Zeiger freigeben, da der Stub jetzt den-Zeiger besitzt.

    Im folgenden Codebeispiel wird der Senke-Objekt Zeiger freigegeben.

    pSink->Release();
    
  6. Verwenden Sie den Stub in einem beliebigen asynchronen-Befehl.

    Wenn Sie mit dem-Befehl fertig sind, geben Sie den lokalen Verweis Zähler frei.

    Im folgenden Codebeispiel wird der Stub in einem asynchronen-Befehl verwendet.

    // pServices is an IWbemServices* object
    pServices->CreateInstanceEnumAsync(strClassName, 0, NULL, pStubSink);
    

    Manchmal müssen Sie möglicherweise einen asynchronen Aufrufvorgang abbrechen, nachdem Sie den-Befehl durchführen. Wenn Sie den-Befehl abbrechen müssen, brechen Sie den-Befehl mit dem gleichen Zeiger ab, der ursprünglich den-Befehl durchgeführt hat.

    Im folgenden Codebeispiel wird gezeigt, wie ein asynchroner-Befehl abgebrochen wird.

    pServices->CancelAsyncCall(pStubSink);
    
  7. Geben Sie den lokalen Verweis Zähler frei, wenn Sie die Verwendung des asynchronen Aufrufes abgeschlossen haben.

    Stellen Sie sicher, dass Sie den pstubsink -Zeiger erst freigeben, nachdem Sie sich vergewissert haben, dass der asynchrone-Befehl nicht abgebrochen werden muss. Außerdem sollten Sie pstubsink nicht freigeben, nachdem WMI den psink -Senke-Zeiger freigegeben hat. Durch das Freigeben von pstubsink nach psink wird eine zirkuläre Verweis Anzahl erstellt, in der die Senke und der Stub immer im Speicher bleiben. Stattdessen ist ein möglicher Speicherort für die Freigabe des Zeigers der iwbewbjectsink:: SetStatus -Befehl, der von WMI erstellt wurde, um zu melden, dass der ursprüngliche asynchrone-Aufrufvorgang abgeschlossen ist.

  8. Wenn Sie den Vorgang abgeschlossen haben, können Sie com mit einem Release von Release ()aufzurufen.

    Im folgenden Codebeispiel wird gezeigt, wie Release () auf dem punsecapp -Zeiger aufgerufen wird.

    pUnsecApp->Release();
    

    Die Codebeispiele in diesem Thema erfordern den folgenden Verweis und die # include-Anweisung zur ordnungsgemäßen Kompilierung.

    #include <wbemidl.h>
    #pragma comment(lib, "wbemuuid.lib")
    

Weitere Informationen zur CoInitializeSecurity -Funktion und zu Parametern finden Sie in der com -Dokumentation im Platform Software Development Kit (SDK).