降低個別進程中接收的安全性

Windows Management Instrumentation (WMI) 可以建立接收,以在個別進程中接收用戶端應用程式的非同步回呼。 個別的程式Unsecapp.exe。 使用 IWbemUnsecuredApartment 介面。 IWbemUnsecuredApartment 可讓您控制Unsecapp.exe驗證接收的回呼。 如需詳細資訊,請參閱 在非同步呼叫上設定安全性

然後,您可以降低該程式的安全性,而 WMI 可以存取接收,而不受限制。 為了協助使用這項技術,WMI 提供Unsecapp.exe程式,以作為個別進程運作。 您可以使用 IUnsecuredApartment 介面的呼叫來裝載Unsecapp.exe。

IUnsecuredApartment介面可讓用戶端應用程式建立個別的專用進程,執行Unsecapp.exe來裝載IWbemObjectSink實作。 專用進程可以呼叫 CoInitializeSecurity ,將專用進程的存取權授與 WMI,而不會危害主要進程的安全性。 初始化之後,專用進程會作為主要進程與 WMI 之間的媒介。

下列程式描述如何使用 IUnsecuredApartment執行非同步呼叫。

使用 IUnsecuredApartment 執行非同步呼叫

  1. 建立具有 CoCreateInstance呼叫的專用程式。

    下列程式碼範例會呼叫 CoCreateInstance 來建立專用進程。

    IUnsecuredApartment* pUnsecApp = NULL;
    
    CoCreateInstance(CLSID_UnsecuredApartment, NULL, 
      CLSCTX_LOCAL_SERVER, IID_IUnsecuredApartment, 
      (void**)&pUnsecApp);
    
  2. 具現化接收物件。

    下列程式碼範例會建立新的接收物件。

    CMySink* pSink = new CMySink;
    pSink->AddRef();
    
  3. 建立接收的存根。

    存根是從接收產生的包裝函式。

    下列程式碼範例會呼叫 CreateObjectStub 來建立接收的存根。

    IUnknown* pStubUnk = NULL; 
    pUnsecApp->CreateObjectStub(pSink, &pStubUnk);
    
  4. 呼叫包裝函式的 QueryInterface ,並要求 IWbemObjectSink 介面的指標。

    下列程式碼範例會呼叫 QueryInterface ,並要求 IWbemObjectSink 介面的指標。

    IWbemObjectSink* pStubSink = NULL;
    pStubUnk->QueryInterface(IID_IWbemObjectSink, (void **)&pStubSink); pStubUnk->Release();
    
  5. 釋放接收物件指標。

    您可以釋放物件指標,因為存根現在擁有指標。

    下列程式碼範例會釋放接收物件指標。

    pSink->Release();
    
  6. 在任何非同步呼叫中使用存根。

    當呼叫完成時,請釋放本機參考計數。

    下列程式碼範例會在非同步呼叫中使用存根。

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

    有時候,您可能必須取消呼叫之後的非同步呼叫。 如果您需要取消呼叫,請使用原本進行呼叫的相同指標取消呼叫。

    下列程式碼範例示範如何取消非同步呼叫。

    pServices->CancelAsyncCall(pStubSink);
    
  7. 使用非同步呼叫完成時,請釋放本機參考計數。

    只有在您確認非同步呼叫不需要取消之後,才釋放 pStubSink 指標。 此外,請勿在 WMI 釋放 pSink 接收指標之後釋放pStubSinkpSink之後釋放pStubSink會建立迴圈參考計數,讓接收和存根永遠保留在記憶體中。 相反地,釋放指標的可能位置是在 IWbemObjectSink::SetStatus 呼叫中,由 WMI 進行,以報告原始非同步呼叫已完成。

  8. 完成時,使用 對 Release () 的呼叫來取消初始化 COM。

    下列程式碼範例示範如何在pUnsecApp指標上呼叫Release ()

    pUnsecApp->Release();
    

    本主題中的程式碼範例需要下列參考和#include語句才能正確編譯。

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

如需 CoInitializeSecurity 函式和參數的詳細資訊,請參閱平臺軟體發展工具組 (SDK) 中的 COM 檔。