Bagikan melalui


Mengatur Autentikasi Menggunakan C++

Salah satu tugas utama IWbemLocator::ConnectServer untuk WMI adalah mengembalikan pointer ke proksi IWbemServices . Melalui proksi IWbemServices , Anda dapat mengakses kemampuan infrastruktur WMI. Namun, pointer 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 panggilan ke antarmuka CoSetProxyBlanket .

Penyedia dapat mengatur keamanan pada namespace layanan sehingga tidak ada data yang dikembalikan kecuali Anda menggunakan privasi paket (PktPrivacy) dalam 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 Namepace Security Descriptors.

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, diperlukan lebih banyak akses ke server daripada sekadar pointer ke proksi. Terkadang, Anda mungkin perlu mendapatkan koneksi yang aman ke antarmuka proksi IUnknown . Dengan 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 proksi IUnknown 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 memang mendukung antarmuka, COM marshals proksi baru kembali ke klien sehingga aplikasi dapat menggunakan 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 mengakses QueryInterface di server jarak jauh gagal. Rilis akhir pada proksi juga gagal, karena pengguna saat ini tidak memiliki akses ke server jarak jauh. Gejalanya adalah jeda satu atau dua detik sebelum aplikasi klien gagal dalam 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, gunakan CoSetProxyBlanket untuk secara eksplisit mengatur autentikasi keamanan pada pointer yang dikembalikan dari IUnknown. Dengan menggunakan CoSetProxyBlanket, Anda dapat memastikan bahwa server jarak jauh menerima identitas autentikasi yang benar.

Contoh kode berikut menunjukkan cara menggunakan CoSetProxyBlanket untuk mengakses antarmuka IUnknown jarak 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;

Catatan

Saat Anda mengatur keamanan pada antarmuka proksi IUnknown , COM membuat salinan proksi yang tidak dapat dirilis sampai Anda memanggil CoUninitialize.

 

Mengatur Autentikasi di WMI