降低在單獨進程中的接收器的安全性
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 執行非同步呼叫
使用呼叫 CoCreateInstance 來建立一個 專用進程。
下列程式代碼範例會呼叫 CoCreateInstance,以建立專用的程式。
IUnsecuredApartment* pUnsecApp = NULL; CoCreateInstance(CLSID_UnsecuredApartment, NULL, CLSCTX_LOCAL_SERVER, IID_IUnsecuredApartment, (void**)&pUnsecApp);
實例化接收器物件。
下列程式代碼範例會建立新的接收物件。
CMySink* pSink = new CMySink; pSink->AddRef();
建立匯入的存根。
存根是從接收端產生的包裝函式。
下列程式碼範例會呼叫 CreateObjectStub 來為接收器建立存根。
IUnknown* pStubUnk = NULL; pUnsecApp->CreateObjectStub(pSink, &pStubUnk);
針對封裝器呼叫 QueryInterface,並請求獲取指向 IWbemObjectSink 介面的指標。
下列代碼範例會呼叫 QueryInterface,並請求取得 IWbemObjectSink 介面的指標。
IWbemObjectSink* pStubSink = NULL; pStubUnk->QueryInterface(IID_IWbemObjectSink, (void **)&pStubSink); pStubUnk->Release();
釋放匯入物件指標。
您可以釋放物件指標,因為現在存根擁有該指標。
下列程式碼範例會釋放匯流物件指標。
pSink->Release();
在任何異步呼叫中使用存根。
當呼叫完成時,釋放本機參考計數。
下列程式代碼範例會使用異步呼叫中的存根。
// pServices is an IWbemServices* object pServices->CreateInstanceEnumAsync(strClassName, 0, NULL, pStubSink);
有時,您在進行異步呼叫後可能必須取消該呼叫。 如果您需要取消呼叫,請使用原本進行呼叫的相同指標取消呼叫。
下列程式代碼範例示範如何取消異步呼叫。
pServices->CancelAsyncCall(pStubSink);
使用異步呼叫完成時,請釋放本機參考計數。
請務必在確認異步呼叫不需要取消之後,才釋放 pStubSink 指標。 此外,WMI 釋放 pSink 接收指標之後,請勿釋放 pStubSink。 在釋放 pSink 之後,如果釋放 pStubSink,會造成一個循環參考計數,導致接收器和存根永遠保留在記憶體中。 相反地,釋放指標的可能位置位於 IWbemObjectSink::SetStatus 呼叫中,WMI 會報告原始異步呼叫已完成。
完成後,呼叫 Release() 來釋放 COM。
下列程式代碼範例示範如何在 pUnsecApp 指標上呼叫Release()。
pUnsecApp->Release();
本主題中的程式代碼範例需要下列參考和 #include 語句才能正確編譯。
#include <wbemidl.h> #pragma comment(lib, "wbemuuid.lib")
如需 CoInitializeSecurity 函式和參數的詳細資訊,請參閱平台軟體開發工具包 (SDK) 中的 COM 檔。