Partager via


Exécution d’opérations privilégiées à l’aide de C++

Des applications clientes spéciales peuvent appeler des opérations privilégiées. Par exemple, une application peut autoriser un manager à redémarrer un ordinateur de bureau qui ne répond pas. À l’aide de Windows Management Instrumentation (WMI), vous pouvez exécuter une opération privilégiée en appelant le fournisseur WMI pour l’opération privilégiée.

La procédure suivante décrit comment appeler un fournisseur pour une opération privilégiée.

Pour appeler un fournisseur pour une opération privilégiée

  1. Obtenez les autorisations permettant au processus client d’exécuter l’opération privilégiée.

    En règle générale, un administrateur définit les autorisations à l’aide des outils d’administration système avant d’exécuter le processus.

  2. Obtenez l’autorisation pour que le processus du fournisseur active l’opération privilégiée.

    En règle générale, vous pouvez définir des autorisations de fournisseur avec un appel à la fonction AdjustTokenPrivileges.

  3. Obtenez l’autorisation pour que le processus du client active l’opération privilégiée.

    Cette étape est nécessaire uniquement si le fournisseur est local pour le client. Si le client et le fournisseur existent sur le même ordinateur, le client doit spécifiquement activer l’opération privilégiée à l’aide de l’une des techniques suivantes :

    • Si le client est propriétaire du processus, il peut utiliser AdjustTokenPrivileges pour ajuster le jeton de processus avant d’appeler WMI. Dans ce cas, vous n’avez pas besoin de coder davantage.
    • Si le client ne peut pas accéder au jeton client, il peut utiliser la procédure suivante pour créer un jeton de thread et utiliser AdjustTokenPrivileges sur ce jeton.

La procédure suivante décrit comment créer un jeton de thread et utiliser AdjustTokenPrivileges sur ce jeton.

Pour créer un jeton de thread et utiliser AdjustTokenPrivileges sur ce jeton

  1. Créez une copie du jeton de processus en appelant ImpersonateSelf.

  2. Récupérez le jeton de thread nouvellement créé en appelant GetTokenInformation.

  3. Activez l’opération privilégiée avec un appel à AdjustTokenPrivileges sur le nouveau jeton.

  4. Obtenez un pointeur vers IWbemServices.

  5. Masquez le pointeur vers IWbemServices avec un appel à CoSetProxyBlanket.

  6. Répétez les étapes 1 à 5 sur chaque appel à WMI.

    Notes

    Vous devez répéter les étapes, car COM met en cache les jetons de manière incorrecte.

     

L’exemple de code de cette rubrique nécessite la compilation correcte de l’instruction #include suivante.

#include <wbemidl.h>

L’exemple de code suivant montre comment activer les privilèges sur un ordinateur local.

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