Menurunkan Keamanan untuk Sink dalam Proses Terpisah
Instrumentasi Manajemen Windows (WMI) dapat membuat sink untuk menerima panggilan balik asinkron untuk aplikasi klien dalam proses terpisah. Proses terpisah Unsecapp.exe. Gunakan antarmuka IWbemUnsecuredApartment . IWbemUnsecuredApartment memungkinkan Anda mengontrol apakah Unsecapp.exe mengautentikasi panggilan balik ke sink. Untuk informasi selengkapnya, lihat Mengatur Keamanan pada Panggilan Asinkron.
Anda kemudian dapat menurunkan keamanan pada proses tersebut dan WMI dapat mengakses sink tanpa batasan. Untuk membantu teknik ini, WMI menyediakan proses Unsecapp.exe untuk berfungsi sebagai proses terpisah. Anda dapat menghosting Unsecapp.exe dengan panggilan ke antarmuka IUnsecuredApartment .
Antarmuka IUnsecuredApartment memungkinkan aplikasi klien untuk membuat proses khusus terpisah yang berjalan Unsecapp.exe untuk menghosting implementasi IWbemObjectSink . Proses khusus dapat memanggil CoInitializeSecurity untuk memberikan akses WMI ke proses khusus tanpa mengorbankan keamanan proses utama. Setelah inisialisasi, proses khusus bertindak sebagai perantara antara proses utama dan WMI.
Prosedur berikut menjelaskan cara melakukan panggilan asinkron dengan IUnsecuredApartment.
Untuk melakukan panggilan asinkron dengan IUnsecuredApartment
Buat proses khusus dengan panggilan ke CoCreateInstance.
Contoh kode berikut memanggil CoCreateInstance untuk membuat proses khusus.
IUnsecuredApartment* pUnsecApp = NULL; CoCreateInstance(CLSID_UnsecuredApartment, NULL, CLSCTX_LOCAL_SERVER, IID_IUnsecuredApartment, (void**)&pUnsecApp);
Buat instans objek sink.
Contoh kode berikut membuat objek sink baru.
CMySink* pSink = new CMySink; pSink->AddRef();
Buat stub untuk sink.
Stub adalah fungsi pembungkus yang dihasilkan dari sink.
Contoh kode berikut memanggil CreateObjectStub untuk membuat stub untuk sink.
IUnknown* pStubUnk = NULL; pUnsecApp->CreateObjectStub(pSink, &pStubUnk);
Panggil QueryInterface untuk pembungkus, dan minta penunjuk ke antarmuka IWbemObjectSink .
Contoh kode berikut memanggil QueryInterface dan meminta penunjuk ke antarmuka IWbemObjectSink .
IWbemObjectSink* pStubSink = NULL; pStubUnk->QueryInterface(IID_IWbemObjectSink, (void **)&pStubSink); pStubUnk->Release();
Lepaskan penunjuk objek sink.
Anda dapat melepaskan penunjuk objek karena stub sekarang memiliki penunjuk.
Contoh kode berikut merilis penunjuk objek sink.
pSink->Release();
Gunakan stub dalam panggilan asinkron apa pun.
Setelah selesai dengan panggilan, rilis jumlah referensi lokal.
Contoh kode berikut menggunakan stub dalam panggilan asinkron.
// pServices is an IWbemServices* object pServices->CreateInstanceEnumAsync(strClassName, 0, NULL, pStubSink);
Terkadang Anda mungkin harus membatalkan panggilan asinkron setelah melakukan panggilan. Jika Anda perlu membatalkan panggilan, batalkan panggilan dengan penunjuk yang sama yang awalnya melakukan panggilan.
Contoh kode berikut menunjukkan cara membatalkan panggilan asinkron.
pServices->CancelAsyncCall(pStubSink);
Rilis jumlah referensi lokal saat Anda selesai menggunakan panggilan asinkron.
Pastikan untuk merilis pointer pStubSink hanya setelah Anda mengonfirmasi bahwa panggilan asinkron tidak perlu dibatalkan. Selanjutnya, jangan rilis pStubSink setelah WMI merilis pointer sink pSink . Merilis pStubSink setelah pSink membuat jumlah referensi melingkar di mana sink dan stub tetap dalam memori selamanya. Sebagai gantinya, lokasi yang mungkin untuk merilis pointer ada di panggilan IWbemObjectSink::SetStatus , yang dibuat oleh WMI untuk melaporkan bahwa panggilan asinkron asli selesai.
Setelah selesai, batalkan menginisialisasi COM dengan panggilan ke Release().
Contoh kode berikut menunjukkan cara memanggil Release() pada pointer pUnsecApp .
pUnsecApp->Release();
Contoh kode dalam topik ini memerlukan referensi berikut dan pernyataan #include untuk dikompilasi dengan benar.
#include <wbemidl.h> #pragma comment(lib, "wbemuuid.lib")
Untuk informasi selengkapnya tentang fungsi dan parameter CoInitializeSecurity , lihat dokumentasi COM di Kit Pengembangan Perangkat Lunak Platform (SDK).