Condividi tramite


Riduzione della sicurezza per un sink in un processo separato

Strumentazione gestione Windows (WMI) può creare il sink per ricevere callback asincroni per un'applicazione client in un processo separato. Il processo separato viene Unsecapp.exe. Usare l'interfaccia IWbemUnsecuredApartment . IWbemUnsecuredApartment consente di controllare se Unsecapp.exe autentica i callback nel sink. Per altre informazioni, vedere Impostazione della sicurezza in una chiamata asincrona.

È quindi possibile ridurre la sicurezza per tale processo e WMI può accedere al sink senza restrizioni. Per facilitare questa tecnica WMI fornisce il processo di Unsecapp.exe per funzionare come processo separato. È possibile ospitare Unsecapp.exe con una chiamata all'interfaccia IUnsecuredApartment .

L'interfaccia IUnsecuredApartment consente a un'applicazione client di creare un processo dedicato separato che esegue 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.

    L'esempio di codice seguente chiama 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 sink.

    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 .

    L'esempio di codice seguente chiama QueryInterface e richiede 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 perché lo stub è ora proprietario del puntatore.

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

    pSink->Release();
    
  6. Usare 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 eseguito 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 al termine dell'uso della chiamata asincrona.

    Assicurarsi di rilasciare il puntatore pStubSink solo dopo aver verificato che la chiamata asincrona non deve essere annullata. Inoltre, non rilasciare pStubSink dopo che WMI rilascia il puntatore sink pSink . Il rilascio di pStubSink dopo pSink crea un conteggio di riferimenti circolare in cui sia il sink che lo stub rimangono in memoria per sempre. È invece possibile rilasciare il puntatore 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() nel puntatore pUnsecApp .

    pUnsecApp->Release();
    

    Gli esempi di codice in questo argomento richiedono la compilazione corretta del riferimento e dell'istruzione #include seguente.

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

Per altre informazioni sulla funzione e i parametri CoInitializeSecurity , vedere la documentazione COM in Platform Software Development Kit (SDK).