Freigeben über


Ausführen von privilegierten Vorgängen mit C++

Spezielle Clientanwendungen können privilegierte Vorgänge aufrufen. Beispielsweise könnte eine Anwendung zulassen, dass ein Manager einen nicht reagierenden Bürocomputer neu startet. Mithilfe der Windows-Verwaltungsinstrumentation (WMI) können Sie einen privilegierten Vorgang ausführen, indem Sie den WMI-Anbieter für den privilegierten Vorgang aufrufen.

Im folgenden Verfahren wird beschrieben, wie Sie einen Anbieter für einen privilegierten Vorgang aufrufen.

So rufen Sie einen Anbieter für einen privilegierten Vorgang auf

  1. Rufen Sie Berechtigungen für den Clientprozess zum Ausführen des privilegierten Vorgangs ab.

    In der Regel legt ein Administrator die Berechtigungen mithilfe der Systemverwaltungstools fest, und zwar bevor der Prozess ausgeführt wird.

  2. Rufen Sie die Berechtigung für den Anbieterprozess ab, um den privilegierten Vorgang zu aktivieren.

    In der Regel können Sie Anbieterberechtigungen durch Aufrufen der Funktion AdjustTokenPrivileges festlegen.

  3. Rufen Sie die Berechtigung für den Clientprozess ab, um den privilegierten Vorgang zu aktivieren.

    Dieser Schritt ist nur erforderlich, wenn der Anbieter lokal für den Client ist. Wenn der Client und der Anbieter auf demselben Computer vorhanden sind, muss der Client den privilegierten Vorgang mit einem der folgenden Verfahren ausdrücklich aktivieren:

    • Wenn der Client der Besitzer des Prozesses ist, kann der Client mit AdjustTokenPrivileges das Prozesstoken vor dem Aufruf von WMI anpassen. In diesem Fall müssen Sie nicht weiter programmieren.
    • Wenn der Client nicht auf das Clienttoken zugreifen kann, kann er mithilfe des folgenden Verfahrens ein Threadtoken erstellen und AdjustTokenPrivileges für dieses Token verwenden.

Im folgenden Verfahren wird beschrieben, wie Sie ein Threadtoken erstellen und AdjustTokenPrivileges für dieses Token verwenden.

So erstellen Sie ein Threadtoken und verwenden AdjustTokenPrivileges für dieses Token

  1. Erstellen Sie eine Kopie des Prozesstokens, indem Sie ImpersonateSelf aufrufen.

  2. Rufen Sie das neu erstellte Threadtoken ab, indem Sie GetTokenInformation aufrufen.

  3. Aktivieren Sie den privilegierten Vorgang mit einem Aufruf von AdjustTokenPrivileges für das neue Token.

  4. Rufen Sie einen Zeiger auf IWbemServices ab.

  5. Umschließen Sie den Zeiger auf IWbemServices mit einem Aufruf von CoSetProxyBlanket.

  6. Wiederholen Sie die Schritte 1 bis 5 für jeden Aufruf von WMI.

    Hinweis

    Sie müssen die Schritte wiederholen, da COM Token falsch zwischenspeichert.

     

Für das Codebeispiel in diesem Thema ist die folgende #include-Anweisung erforderlich, um ordnungsgemäß kompiliert zu werden.

#include <wbemidl.h>

Im folgenden Codebeispiel wird gezeigt, wie Berechtigungen auf einem lokalen Computer aktiviert werden.

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