Condividi tramite


Riduzione della sicurezza per un sink in un processo separato

Strumentazione gestione di Windows (WMI) può creare un endpoint per ricevere chiamate di ritorno asincrone per un'applicazione client in un processo separato. Il processo separato è Unsecapp.exe. Utilizzare l'interfaccia IWbemUnsecuredApartment. IWbemUnsecuredApartment consente di controllare se Unsecapp.exe autentica i callback verso il sink. Per ulteriori informazioni, vedere Configurazione della sicurezza in una chiamata asincrona.

È quindi possibile ridurre il livello di sicurezza per quel processo e WMI può accedere al sink senza restrizioni. Per facilitare questa tecnica, WMI fornisce il processo Unsecapp.exe affinché funzioni come processo separato. È possibile ospitare Unsecapp.exe con una chiamata all'interfacciaIUnsecuredApartment.

L'interfaccia IUnsecuredApartment consente a un'applicazione client di creare un processo dedicato separato in esecuzione Unsecapp.exe per ospitare un'implementazione IWbemObjectSink. Il processo dedicato può chiamare CoInitializeSecurity per concedere a WMI l'accesso al processo dedicato senza compromettere la sicurezza del processo principale. Dopo l'inizializzazione, il processo dedicato funge da intermediario tra il processo principale e WMI.

La procedura seguente descrive come eseguire una chiamata asincrona con IUnsecuredApartment.

Per eseguire una chiamata asincrona con IUnsecuredApartment

  1. Creare un processo dedicato con una chiamata a CoCreateInstance.

    Nell'esempio di codice seguente viene chiamato CoCreateInstance per creare un processo dedicato.

    IUnsecuredApartment* pUnsecApp = NULL;
    
    CoCreateInstance(CLSID_UnsecuredApartment, NULL, 
      CLSCTX_LOCAL_SERVER, IID_IUnsecuredApartment, 
      (void**)&pUnsecApp);
    
  2. Creare un'istanza dell'oggetto sink.

    Nell'esempio di codice seguente viene creato un nuovo oggetto sink.

    CMySink* pSink = new CMySink;
    pSink->AddRef();
    
  3. Creare uno stub per il lavandino.

    Uno stub è una funzione wrapper prodotta dal sink.

    Nell'esempio di codice seguente viene chiamato CreateObjectStub per creare uno stub per il sink.

    IUnknown* pStubUnk = NULL; 
    pUnsecApp->CreateObjectStub(pSink, &pStubUnk);
    
  4. Chiamare QueryInterface per il wrapper e richiedere un puntatore all'interfaccia IWbemObjectSink.

    Nell'esempio di codice seguente viene chiamata la funzione QueryInterface e viene richiesto un puntatore all'interfaccia IWbemObjectSink .

    IWbemObjectSink* pStubSink = NULL;
    pStubUnk->QueryInterface(IID_IWbemObjectSink, (void **)&pStubSink); pStubUnk->Release();
    
  5. Rilasciare il puntatore dell'oggetto sink.

    È possibile rilasciare il puntatore all'oggetto poiché ora lo stub ne è il proprietario.

    Nell'esempio di codice seguente viene rilasciato il puntatore all'oggetto sink.

    pSink->Release();
    
  6. Usa lo stub in qualsiasi chiamata asincrona.

    Al termine della chiamata, rilasciare il conteggio dei riferimenti locali.

    Nell'esempio di codice seguente viene usato lo stub in una chiamata asincrona.

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

    A volte potrebbe essere necessario annullare una chiamata asincrona dopo aver effettuato la chiamata. Se è necessario annullare la chiamata, annullare la chiamata con lo stesso puntatore che ha originariamente effettuato la chiamata.

    Nell'esempio di codice seguente viene illustrato come annullare una chiamata asincrona.

    pServices->CancelAsyncCall(pStubSink);
    
  7. Rilasciare il conteggio dei riferimenti locali quando hai finito di utilizzare la chiamata asincrona.

    Assicurati di rilasciare il puntatore pStubSink solo dopo aver confermato che la chiamata asincrona non deve essere annullata. Inoltre, non rilasciare pStubSink dopo che WMI rilascia il puntatore sink pSink. Rilasciando pStubSink dopo pSink crea un conteggio di riferimenti circolare in cui il sink e lo stub rimangono in memoria per sempre. Al contrario, una possibile posizione in cui rilasciare il puntatore si trova nella chiamata IWbemObjectSink::SetStatus effettuata da WMI per segnalare che la chiamata asincrona originale è stata completata.

  8. Al termine, annullare l'inizializzazione di COM con una chiamata a Release().

    Nell'esempio di codice seguente viene illustrato come chiamare Release() sul puntatore pUnsecApp.

    pUnsecApp->Release();
    

    Gli esempi di codice in questo argomento richiedono il riferimento seguente e l'istruzione #include per la compilazione corretta.

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

Per ulteriori informazioni sulla funzione CoInitializeSecurity e i relativi parametri , consultare la documentazione COM nel Kit di Sviluppo Software della Piattaforma (SDK).