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:

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.