Menjalankan Operasi Istimewa Menggunakan C++

Aplikasi klien khusus mungkin memanggil operasi istimewa. Misalnya, aplikasi dapat memungkinkan manajer untuk me-reboot komputer office yang tidak responsif. Dengan menggunakan Windows Management Instrumentation (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 untuk menjalankan operasi istimewa.

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

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

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

  3. Dapatkan izin untuk proses klien untuk mengaktifkan operasi istimewa.

    Langkah ini diperlukan hanya jika penyedia 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 utas dan menggunakan AdjustTokenPrivileges pada token tersebut.

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. Tutup pointer ke IWbemServices dengan panggilan ke CoSetProxyBlanket.

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

    Catatan

    Anda harus mengulangi langkah-langkah karena COM menyimpan token dengan tidak benar.

     

Contoh kode dalam topik ini memerlukan pernyataan #include berikut untuk mengkompilasi 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;