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;
}