Mengatur Tingkat Keamanan Proses Default Menggunakan C++
Ketika aplikasi klien masuk ke Windows Management Instrumentation (WMI) untuk pertama kalinya, aplikasi klien harus mengatur tingkat keamanan proses default dengan panggilan ke CoInitializeSecurity. COM menggunakan informasi dalam panggilan untuk menentukan berapa banyak keamanan yang harus dilakukan proses lain untuk mengakses proses aplikasi klien.
Bagian berikut dibahas dalam topik ini:
- Mengubah Kredensial Autentikasi Default Menggunakan C++
- Mengubah Tingkat Peniruan Default Menggunakan C++
Untuk sebagian besar aplikasi klien, argumen yang ditunjukkan dalam contoh berikut mengatur keamanan default untuk WMI.
HRESULT hr = NULL;
hr = CoInitializeSecurity(
NULL, // security descriptor
-1, // use this simple setting
NULL, // use this simple setting
NULL, // reserved
RPC_C_AUTHN_LEVEL_DEFAULT, // authentication level
RPC_C_IMP_LEVEL_IMPERSONATE, // impersonation level
NULL, // use this simple setting
EOAC_NONE, // no special capabilities
NULL); // reserved
if (FAILED(hr))
{
CoUninitialize();
cout << "Failed to initialize security. Error code = 0x"
<< hex << hr << endl;
return;
}
Kode memerlukan referensi berikut dan pernyataan #include untuk dikompilasi dengan benar.
#define _WIN32_DCOM
#include <iostream>
using namespace std;
#include <Wbemidl.h>
#pragma comment(lib, "wbemuuid.lib")
Mengatur tingkat autentikasi ke RPC_C_AUTHN_LEVEL_DEFAULT memungkinkan DCOM untuk menegosiasikan tingkat autentikasi agar sesuai dengan tuntutan keamanan komputer target. Untuk informasi selengkapnya, lihat Mengubah Kredensial Autentikasi Default Menggunakan C++ dan Mengubah Pengaturan Peniruan Default Menggunakan C++.
Mengubah Kredensial Autentikasi Default Menggunakan C++
Kredensial autentikasi default berfungsi untuk sebagian besar situasi, tetapi Anda mungkin perlu menggunakan kredensial autentikasi yang berbeda dalam situasi yang berbeda. Misalnya, Anda mungkin ingin menambahkan enkripsi ke prosedur autentikasi.
Tabel berikut ini mencantumkan dan menjelaskan tingkat autentikasi yang berbeda.
Tingkat autentikasi | Deskripsi |
---|---|
RPC_C_AUTHN_LEVEL_DEFAULT | Autentikasi keamanan default. |
RPC_C_AUTHN_LEVEL_NONE | Tidak ada autentikasi. |
RPC_C_AUTHN_LEVEL_CONNECT | Autentikasi hanya ketika klien membuat hubungan dengan server. |
RPC_C_AUTHN_LEVEL_CALL | Autentikasi setiap kali server menerima RPC. |
RPC_C_AUTHN_LEVEL_PKT | Autentikasi setiap kali server menerima data dari klien. |
RPC_C_AUTHN_LEVEL_PKT_INTEGRITY | Autentikasi bahwa tidak ada data dari paket yang telah dimodifikasi. |
RPC_C_AUTHN_LEVEL_PKT_PRIVACY | Mencakup semua tingkat autentikasi sebelumnya, dan mengenkripsi nilai setiap panggilan RPC. |
Anda dapat menentukan kredensial autentikasi default untuk beberapa pengguna dengan menggunakan struktur SOLE_AUTHENTICATION_LIST dalam parameter pAuthListcoInitializeSecurity.
Contoh kode berikut menunjukkan cara mengubah kredensial autentikasi.
// Auth Identity structure
SEC_WINNT_AUTH_IDENTITY_W authidentity;
SecureZeroMemory( &authidentity, sizeof(authidentity) );
authidentity.User = L"MyUser";
authidentity.UserLength = wcslen( authidentity.User );
authidentity.Domain = L"MyDomain ";
authidentity.DomainLength = wcslen( authidentity.Domain );
authidentity.Password = L"";
authidentity.PasswordLength = wcslen( authidentity.Password );
authidentity.Flags = SEC_WINNT_AUTH_IDENTITY_UNICODE;
SecureZeroMemory( authninfo, sizeof(SOLE_AUTHENTICATION_INFO)*2 );
// NTLM Settings
authninfo[0].dwAuthnSvc = RPC_C_AUTHN_WINNT;
authninfo[0].dwAuthzSvc = RPC_C_AUTHZ_NONE;
authninfo[0].pAuthInfo = &authidentity;
// Kerberos Settings
authninfo[1].dwAuthnSvc = RPC_C_AUTHN_GSS_KERBEROS ;
authninfo[1].dwAuthzSvc = RPC_C_AUTHZ_NONE;
authninfo[1].pAuthInfo = &authidentity;
SOLE_AUTHENTICATION_LIST authentlist;
authentlist.cAuthInfo = 2;
authentlist.aAuthInfo = authninfo;
CoInitializeSecurity(
NULL,
-1,
NULL,
NULL,
RPC_C_AUTHN_LEVEL_CALL,
RPC_C_IMP_LEVEL_IMPERSONATE,
&authentlist,
EOAC_NONE,
NULL);
Mengubah Tingkat Peniruan Default Menggunakan C++
COM menyediakan tingkat keamanan default yang dibaca dari registri sistem. Namun, kecuali dimodifikasi secara khusus, pengaturan registri mengatur tingkat peniruan identitas terlalu rendah agar WMI berfungsi. Biasanya, tingkat peniruan default RPC_C_IMP_LEVEL_IDENTIFY, tetapi WMI membutuhkan setidaknya RPC_C_IMP_LEVEL_IMPERSONATE untuk berfungsi dengan sebagian besar penyedia, dan Anda mungkin mengalami situasi di mana Anda perlu mengatur tingkat peniruan yang lebih tinggi. Untuk informasi selengkapnya, lihat Menyambungkan ke WMI di Komputer Jarak Jauh. Tabel berikut mencantumkan tingkat peniruan yang berbeda.
Tingkat | Deskripsi |
---|---|
RPC_C_IMP_LEVEL_DEFAULT | Sistem operasi memilih tingkat peniruan identitas. |
RPC_C_IMP_LEVEL_ANONYMOUS | Server dapat meniru klien, tetapi token peniruan tidak dapat digunakan untuk apa pun. |
RPC_C_IMP_LEVEL_IDENTIFY | Server dapat memperoleh identitas klien dan meniru klien untuk pemeriksaan ACL. |
RPC_C_IMP_LEVEL_IMPERSONATE | Server dapat meniru klien di satu batas komputer. |
RPC_C_IMP_LEVEL_DELEGATE | Server dapat meniru klien di beberapa batas, dan dapat melakukan panggilan atas nama klien. |