Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
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 Pengaturan 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.
AntarmukaIUnsecuredApartmentmemungkinkan aplikasi klien membuat proses khusus terpisah yang berjalan Unsecapp.exe untuk menghosting implementasiIWbemObjectSink. 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 wastafel.
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 antarmukaIWbemObjectSink.
IWbemObjectSink* pStubSink = NULL; pStubUnk->QueryInterface(IID_IWbemObjectSink, (void **)&pStubSink); pStubUnk->Release();
Lepaskan penunjuk objek sink.
Anda dapat melepaskan pointer objek karena stub sekarang memiliki pointer.
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, gunakan pointer yang sama dengan yang awalnya digunakan.
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 merilis pStubSink setelah WMI merilis pSink sink pointer. Merilis pStubSink setelah pSink membuat jumlah referensi melingkar di mana sink dan stub tetap dalam memori selamanya. Sebagai gantinya, lokasi yang memungkinkan untuk melepaskan penunjuk ada di panggilan IWbemObjectSink::SetStatus, yang dibuat oleh WMI untuk melaporkan bahwa panggilan asinkron yang asli telah diselesaikan.
Setelah selesai, mengakhiri inisialisasi 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 dalam Kit Pengembangan Perangkat Lunak Platform (SDK).