Delen via


Bevoegde bewerkingen uitvoeren met C++

Speciale clienttoepassingen kunnen bevoegde bewerkingen aanroepen. Een toepassing kan bijvoorbeeld toestaan dat een manager een niet-reagerende kantoorcomputer opnieuw opstart. Met Behulp van Windows Management Instrumentation (WMI) kunt u een bevoegde bewerking uitvoeren door de WMI-provider aan te roepen voor de bevoegde bewerking.

In de volgende procedure wordt beschreven hoe u een provider aanroept voor een bevoegde bewerking.

Een provider aanroepen voor een bevoegde bewerking

  1. Verkrijg toestemming voor het clientproces om de geprivilegieerde handeling uit te voeren.

    Normaal gesproken stelt een beheerder de machtigingen in met systeembeheerprogramma's, voordat het proces wordt uitgevoerd.

  2. Verkrijg toestemming voor het providerproces om de bevoordeelde operatie uit te voeren.

    Doorgaans kunt u providermachtigingen instellen met een aanroep naar de AdjustTokenPrivileges functie.

  3. Vraag toestemming voor het clientproces om de bevoorrechte handeling uit te voeren.

    Deze stap is alleen nodig als de provider lokaal is voor de client. Als de client en provider op dezelfde computer aanwezig zijn, moet de client de bevoegde bewerking specifiek inschakelen met behulp van een van de volgende technieken:

    • Als de client eigenaar is van het proces, kan de client AdjustTokenPrivileges gebruiken om het procestoken aan te passen voordat WMI wordt aangeroepen. In dit geval hoeft u geen code meer uit te voeren.
    • Als de client geen toegang heeft tot het clienttoken, kan de client de volgende procedure gebruiken om een threadtoken te maken en AdjustTokenPrivileges op dat token te gebruiken.

In de volgende procedure wordt beschreven hoe u een threadtoken maakt en AdjustTokenPrivileges op dat token gebruikt.

Een threadtoken maken en AdjustTokenPrivileges op dat token gebruiken

  1. Maak een kopie van het procestoken door ImpersonateSelfaan te roepen.

  2. Haal het zojuist gemaakte threadtoken op door GetTokenInformation-aan te roepen.

  3. Schakel de bevoegde bewerking in met een aanroep naar AdjustTokenPrivileges op het nieuwe token.

  4. Verkrijg een aanwijzer naar IWbemServices.

  5. Verberg de aanwijzer naar IWbemServices met een aanroep naar CoSetProxyBlanket.

  6. Herhaal stap 1 tot en met 5 bij elke aanroep naar WMI.

    Notitie

    Je moet de stappen herhalen omdat COM tokens onjuist cachet.

     

Voor het codevoorbeeld in dit onderwerp is de volgende #include instructie vereist om correct te compileren.

#include <wbemidl.h>

In het volgende codevoorbeeld ziet u hoe u bevoegdheden op een lokale computer inschakelt.

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