Compartir a través de


Reducir la seguridad de un receptor en un proceso independiente

Instrumental de administración de Windows (WMI) puede crear el receptor para recibir devoluciones de llamada asincrónicas para una aplicación cliente en un proceso independiente. El proceso independiente es Unsecapp.exe. Use la interfaz IWbemUnsecuredApartment. IWbemUnsecuredApartment permite controlar si Unsecapp.exe autentica las devoluciones de llamada en el receptor. Para obtener más información, consulte Establecer la seguridad en una llamada asincrónica.

Posteriormente, puede reducir la seguridad de ese proceso y WMI puede acceder al receptor sin restricciones. Para ayudar con esta técnica, WMI proporciona el proceso Unsecapp.exe, que funciona como proceso independiente. Puede hospedar Unsecapp.exe con una llamada a la interfaz IUnsecuredApartment.

La interfaz IUnsecuredApartment permite a una aplicación cliente crear un proceso dedicado independiente que ejecute Unsecapp.exe para hospedar una implementación de IWbemObjectSink. El proceso dedicado puede llamar a CoInitializeSecurity para conceder acceso WMI al proceso dedicado sin poner en peligro la seguridad del proceso principal. Después de la inicialización, el proceso dedicado actúa como intermediario entre el proceso principal y WMI.

En el procedimiento siguiente se describe cómo realizar una llamada asincrónica con IUnsecuredApartment.

Para realizar una llamada asincrónica con IUnsecuredApartment

  1. Cree un proceso dedicado con una llamada a CoCreateInstance.

    En el ejemplo de código siguiente se llama a CoCreateInstance para crear un proceso dedicado.

    IUnsecuredApartment* pUnsecApp = NULL;
    
    CoCreateInstance(CLSID_UnsecuredApartment, NULL, 
      CLSCTX_LOCAL_SERVER, IID_IUnsecuredApartment, 
      (void**)&pUnsecApp);
    
  2. Cree una instancia del objeto receptor.

    En el ejemplo de código siguiente se crea un nuevo objeto receptor.

    CMySink* pSink = new CMySink;
    pSink->AddRef();
    
  3. Cree un código auxiliar para el receptor.

    Un código auxiliar es una función de contenedor generada a partir del receptor.

    En el ejemplo de código siguiente se llama a CreateObjectStub para crear un código auxiliar para el receptor.

    IUnknown* pStubUnk = NULL; 
    pUnsecApp->CreateObjectStub(pSink, &pStubUnk);
    
  4. Llame a QueryInterface para el contenedor y solicite un puntero a la interfaz IWbemObjectSink.

    En el ejemplo de código siguiente se llama a QueryInterface y se solicita un puntero a la interfaz IWbemObjectSink.

    IWbemObjectSink* pStubSink = NULL;
    pStubUnk->QueryInterface(IID_IWbemObjectSink, (void **)&pStubSink); pStubUnk->Release();
    
  5. Libere el puntero del objeto receptor.

    Puede liberar el puntero del objeto porque el código auxiliar ahora es el propietario del puntero.

    En el ejemplo de código siguiente se libera el puntero de objeto receptor.

    pSink->Release();
    
  6. Use el código auxiliar en cualquier llamada asincrónica.

    Cuando termine con la llamada, libere el recuento de referencias locales.

    En el ejemplo de código siguiente se usa el código auxiliar en una llamada asincrónica.

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

    En ocasiones, es posible que tenga que cancelar una llamada asincrónica después de realizar la llamada. Si necesita cancelar la llamada, cancele la llamada con el mismo puntero que originalmente realizó la llamada.

    En el ejemplo de código siguiente se muestra cómo cancelar una llamada asincrónica.

    pServices->CancelAsyncCall(pStubSink);
    
  7. Libere el recuento de referencias locales cuando haya terminado de usar la llamada asincrónica.

    Asegúrese de liberar el puntero pStubSink solo después de confirmar que no es necesario cancelar la llamada asincrónica. Además, no libere pStubSink después de que WMI libere el puntero receptor pSink. La liberación de pStubSink después de pSink crea un recuento de referencias circular en el que el receptor y el código auxiliar permanecen en la memoria para siempre. Alternativamente, una posible ubicación para liberar el puntero está en la llamada IWbemObjectSink::SetStatus, realizada por WMI para informar de que la llamada asincrónica original está completa.

  8. Cuando termine, anule la inicialización de COM con una llamada a Release().

    En el ejemplo de código siguiente se muestra cómo llamar a Release() en el puntero pUnsecApp.

    pUnsecApp->Release();
    

    Los ejemplos de código de este tema requieren la siguiente referencia y la instrucción #include para compilarse correctamente.

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

Para obtener más información sobre la función y los parámetros de CoInitializeSecurity, consulte la documentación COM del kit de desarrollo de software (SDK) de plataforma.