Mengaktifkan dan Menonaktifkan Hak Istimewa di C++
Mengaktifkan hak istimewa dalam token akses memungkinkan proses untuk melakukan tindakan tingkat sistem yang sebelumnya tidak dapat dilakukan. Aplikasi Anda harus memverifikasi secara menyeluruh bahwa hak istimewa sesuai dengan jenis akun, terutama untuk hak istimewa yang kuat berikut.
Konstanta hak istimewa | Nilai untai (karakter) | Nama tampilan |
---|---|---|
SE_ASSIGNPRIMARYTOKEN_NAME | SeAssignPrimaryTokenPrivilege | Ganti token tingkat proses |
SE_BACKUP_NAME | SeBackupPrivilege | untuk file dan direktori |
SE_DEBUG_NAME | SeDebugPrivilege | Program debug |
SE_INCREASE_QUOTA_NAME | SeIncreaseQuotaPrivilege | Sesuaikan kuota memori untuk sebuah proses |
SE_TCB_NAME | SeTcbPrivilege | Bertindak sebagai bagian dari sistem operasi |
Sebelum mengaktifkan salah satu hak istimewa yang berpotensi berbahaya ini, tentukan bahwa fungsi atau operasi dalam kode Anda benar-benar memerlukan hak istimewa. Misalnya, sangat sedikit fungsi dalam sistem operasi yang benar-benar memerlukan SeTcbPrivilege. Untuk daftar semua hak istimewa yang tersedia, lihat Konstanta Hak Istimewa.
Contoh berikut menunjukkan cara mengaktifkan atau menonaktifkan hak istimewa dalam token akses. Contoh memanggil fungsi LookupPrivilegeValue untuk mendapatkan pengidentifikasi unik lokal (LUID) yang digunakan sistem lokal untuk mengidentifikasi hak istimewa. Kemudian contoh memanggil fungsi AdjustTokenPrivileges , yang mengaktifkan atau menonaktifkan hak istimewa yang bergantung pada nilai parameter bEnablePrivilege .
#include <windows.h>
#include <stdio.h>
#pragma comment(lib, "advapi32.lib")
BOOL SetPrivilege(
HANDLE hToken, // access token handle
LPCTSTR lpszPrivilege, // name of privilege to enable/disable
BOOL bEnablePrivilege // to enable or disable privilege
)
{
TOKEN_PRIVILEGES tp;
LUID luid;
if ( !LookupPrivilegeValue(
NULL, // lookup privilege on local system
lpszPrivilege, // privilege to lookup
&luid ) ) // receives LUID of privilege
{
printf("LookupPrivilegeValue error: %u\n", GetLastError() );
return FALSE;
}
tp.PrivilegeCount = 1;
tp.Privileges[0].Luid = luid;
if (bEnablePrivilege)
tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
else
tp.Privileges[0].Attributes = 0;
// Enable the privilege or disable all privileges.
if ( !AdjustTokenPrivileges(
hToken,
FALSE,
&tp,
sizeof(TOKEN_PRIVILEGES),
(PTOKEN_PRIVILEGES) NULL,
(PDWORD) NULL) )
{
printf("AdjustTokenPrivileges error: %u\n", GetLastError() );
return FALSE;
}
if (GetLastError() == ERROR_NOT_ALL_ASSIGNED)
{
printf("The token does not have the specified privilege. \n");
return FALSE;
}
return TRUE;
}
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk