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.
Salah satu tugas utama IWbemLocator::ConnectServer untuk WMI adalah mengembalikan pointer ke IWbemServices proxy. Melalui proksi IWbemServices, Anda dapat mengakses kemampuan infrastruktur WMI. Namun, penunjuk ke proksi IWbemServices memiliki identitas proses aplikasi klien dan bukan identitas proses IWbemServices. Oleh karena itu, jika Anda mencoba mengakses IWbemServices dengan pointer, Anda dapat menerima kode yang ditolak akses seperti E_ACCESSDENIED. Untuk menghindari kesalahan akses ditolak, Anda harus mengatur identitas pointer baru dengan melakukan panggilan ke antarmuka CoSetProxyBlanket.
Penyedia dapat mengatur keamanan pada namespace layanan sehingga tidak ada data yang dikembalikan kecuali Anda menggunakan privasi paket (PktPrivacy) di koneksi Anda ke namespace tersebut. Ini memastikan bahwa data dienkripsi saat melintasi jaringan. Jika Anda mencoba mengatur tingkat autentikasi yang lebih rendah, Anda akan mendapatkan pesan akses ditolak. Untuk informasi selengkapnya, lihat Mengatur Deskriptor Keamanan Namespace.
Untuk informasi selengkapnya tentang mengatur autentikasi dalam pembuatan skrip, lihat Mengatur Tingkat Keamanan Proses Default Menggunakan VBScript.
Mengatur Keamanan pada Antarmuka IUnknown Jarak Jauh
Dalam beberapa situasi, akses ke server yang lebih dari sekadar referensi ke proksi diperlukan. Terkadang, Anda mungkin perlu membangun koneksi yang aman ke antarmuka proksi IUnknown. Menggunakan IUnknown, Anda dapat mengkueri sistem jarak jauh untuk antarmuka dan teknik lain yang diperlukan.
Ketika proksi terletak di komputer jarak jauh, server mendelegasikan semua panggilan ke antarmuka IUnknown dari proksi ke antarmuka IUnknown. Misalnya, jika Anda memanggil QueryInterface pada proksi dan antarmuka yang diminta bukan bagian dari proksi, proksi mengirimkan panggilan ke server jarak jauh. Pada gilirannya, server jarak jauh memeriksa dukungan antarmuka yang sesuai. Jika server mendukung antarmuka, COM memproses sebuah proksi baru ke klien agar aplikasi dapat memanfaatkan antarmuka baru.
Masalah muncul jika klien tidak memiliki izin akses ke server jarak jauh, namun menggunakan kredensial pengguna yang melakukannya. Dalam situasi ini, setiap upaya untuk mengaksesQueryInterfacedi server jarak jauh gagal. Rilis akhir pada proksi juga gagal, karena pengguna saat ini tidak memiliki akses ke server jarak jauh. Gejala ini adalah jeda satu atau dua detik sebelum aplikasi klien gagal rilis proksi akhir. Kegagalan terjadi karena COM mencoba mengakses server jarak jauh menggunakan pengaturan keamanan default pengguna saat ini, yang tidak menyertakan kredensial yang dimodifikasi yang memungkinkan akses ke server di tempat pertama. Untuk informasi selengkapnya, lihat Mengatur Keamanan di IWbemServices dan Proksi Lainnya.
Untuk menghindari koneksi yang gagal, gunakanCoSetProxyBlanketuntuk secara eksplisit mengatur autentikasi keamanan pada pointer yang dikembalikan dari IUnknown. Menggunakan CoSetProxyBlanket, Anda dapat memastikan bahwa server jarak jauh menerima identitas autentikasi yang benar.
Contoh kode berikut menunjukkan cara menggunakanCoSetProxyBlanket untuk mengakses antarmukaIUnknownjarak jauh.
SEC_WINNT_AUTH_IDENTITY_W* pAuthIdentity =
new SEC_WINNT_AUTH_IDENTITY_W;
ZeroMemory(pAuthIdentity, sizeof(SEC_WINNT_AUTH_IDENTITY_W));
pAuthIdentity->User = new WCHAR[32];
StringCbCopyW(pAuthIdentity->User,sizeof(L"MyUser"),L"MyUser");
pAuthIdentity->UserLength = wcslen(pAuthIdentity->User);
pAuthIdentity->Domain = new WCHAR[32];
StringCbCopyW(pAuthIdentity->Domain,sizeof(L"MyDomain"),L"MyDomain");
pAuthIdentity->DomainLength = wcslen(pAuthIdentity->Domain);
pAuthIdentity->Password = new WCHAR[32];
pAuthIdentity->Password[0] = NULL;
pAuthIdentity->PasswordLength = wcslen( pAuthIdentity->Password);
pAuthIdentity->Flags = SEC_WINNT_AUTH_IDENTITY_UNICODE;
IWbemServices* pWbemServices = 0;
// Set proxy security
hr = CoSetProxyBlanket(pWbemServices,
RPC_C_AUTHN_DEFAULT,
RPC_C_AUTHZ_NONE,
COLE_DEFAULT_PRINCIPAL,
RPC_C_AUTHN_LEVEL_DEFAULT,
RPC_C_IMP_LEVEL_IMPERSONATE,
pAuthIdentity,
EOAC_NONE
);
if (FAILED(hr))
{
cout << "Count not set proxy blanket. Error code = 0x"
<< hex << hr << endl;
pWbemServices->Release();
return 1;
}
// Set IUnknown security
IUnknown* pUnk = NULL;
pWbemServices->QueryInterface(IID_IUnknown, (void**) &pUnk);
hr = CoSetProxyBlanket(pUnk,
RPC_C_AUTHN_DEFAULT,
RPC_C_AUTHZ_NONE,
COLE_DEFAULT_PRINCIPAL,
RPC_C_AUTHN_LEVEL_DEFAULT,
RPC_C_IMP_LEVEL_IMPERSONATE,
pAuthIdentity,
EOAC_NONE
);
if (FAILED(hr))
{
cout << "Count not set proxy blanket. Error code = 0x"
<< hex << hr << endl;
pUnk->Release();
pWbemServices->Release();
delete [] pAuthIdentity->User;
delete [] pAuthIdentity->Domain;
delete [] pAuthIdentity->Password;
delete pAuthIdentity;
return 1;
}
// cleanup IUnknown
pUnk->Release();
//
// Perform a bunch of operations
//
// Cleanup
pWbemServices->Release();
delete [] pAuthIdentity->User;
delete [] pAuthIdentity->Domain;
delete [] pAuthIdentity->Password;
delete pAuthIdentity;
Nota
Saat Anda mengatur keamanan pada antarmukaIUnknown dari proksi, COM membuat salinan proksi yang tidak dapat dirilis sampai Anda memanggil CoUninitialize.
Topik terkait
-
Autentikasi Pengaturan di WMI