Menjalankan Operasi Istimewa Menggunakan C++

Aplikasi klien khusus mungkin memanggil operasi yang memiliki hak istimewa. Misalnya, aplikasi dapat memungkinkan manajer untuk me-reboot komputer office yang tidak responsif. Dengan menggunakan Instrumentasi Manajemen Windows (WMI), Anda dapat menjalankan operasi istimewa dengan memanggil penyedia WMI untuk operasi istimewa.

Prosedur berikut menjelaskan cara memanggil penyedia untuk operasi istimewa.

Untuk memanggil penyedia untuk operasi istimewa

  1. Dapatkan izin untuk proses klien dalam menjalankan operasi dengan hak istimewa.

    Biasanya, administrator mengatur izin menggunakan alat administratif sistem—sebelum menjalankan proses.

  2. Dapatkan izin untuk proses penyedia layanan guna mengaktifkan operasi istimewa.

    Biasanya, Anda dapat mengatur izin penyedia dengan panggilan ke fungsi AdjustTokenPrivileges.

  3. Peroleh izin bagi proses klien untuk mengaktifkan operasi yang memiliki hak istimewa.

    Langkah ini diperlukan hanya jika penyedia bersifat lokal untuk klien. Jika klien dan penyedia ada di komputer yang sama, klien harus secara khusus mengaktifkan operasi istimewa dengan menggunakan salah satu teknik berikut:

    • Jika klien memiliki proses, klien dapat menggunakan AdjustTokenPrivileges untuk menyesuaikan token proses sebelum memanggil WMI. Dalam hal ini, Anda tidak perlu membuat kode lebih lanjut.
    • Jika klien tidak dapat mengakses token klien, klien dapat menggunakan prosedur berikut untuk membuat token utas dan menggunakan AdjustTokenPrivileges pada token tersebut.

Prosedur berikut menjelaskan cara membuat token thread dan menggunakan AdjustTokenPrivileges pada token yang dibuat.

Untuk membuat token utas dan menggunakan AdjustTokenPrivileges pada token tersebut

  1. Buat salinan token proses dengan memanggil ImpersonateSelf.

  2. Ambil token utas yang baru dibuat dengan memanggil GetTokenInformation.

  3. Aktifkan operasi istimewa dengan panggilan ke AdjustTokenPrivileges pada token baru.

  4. Dapatkan pointer ke IWbemServices.

  5. Sembunyikan pointer ke IWbemServices dengan melakukan panggilan ke CoSetProxyBlanket.

  6. Ulangi langkah 1 hingga 5 pada setiap panggilan ke WMI.

    Nota

    Anda harus mengulangi langkah-langkah tersebut karena COM menyimpan token dengan salah.

     

Contoh kode dalam topik ini memerlukan pernyataan #include berikut untuk dikompilasi dengan benar.

#include <wbemidl.h>

Contoh kode berikut menunjukkan cara mengaktifkan hak istimewa pada komputer lokal.

// Get the privileges 
// The token has been obtained outside the scope of this code sample
// ================== 
DWORD dwLen;
bool bRes;
HANDLE hToken;

// obtain dwLen
bRes = GetTokenInformation(
  hToken, 
  TokenPrivileges, 
  NULL, 
  0,
  &dwLen
); 

BYTE* pBuffer = new BYTE[dwLen];
if(pBuffer == NULL)
{
  CloseHandle(hToken);
  return WBEM_E_OUT_OF_MEMORY;
} 

bRes = GetTokenInformation(
  hToken, 
  TokenPrivileges, 
  pBuffer,     
  dwLen,        
  &dwLen
);

if (!bRes)
{
  CloseHandle(hToken);
  delete [] pBuffer;
  return WBEM_E_ACCESS_DENIED;
} 

// Iterate through all the privileges and enable them all
// ====================================================== 
TOKEN_PRIVILEGES* pPrivs = (TOKEN_PRIVILEGES*)pBuffer;
for (DWORD i = 0; i < pPrivs->PrivilegeCount; i++)
{
  pPrivs->Privileges[i].Attributes |= SE_PRIVILEGE_ENABLED;
} 
// Store the information back in the token
// ========================================= 
bRes = AdjustTokenPrivileges(
  hToken, 
  FALSE, 
  pPrivs, 
  0, NULL, NULL
);

delete [] pBuffer;
CloseHandle(hToken); 

if (!bRes)
  return WBEM_E_ACCESS_DENIED;
else
  return WBEM_S_NO_ERROR;