Aktivieren und Deaktivieren von Berechtigungen in C++

Durch aktivieren einer Berechtigung in einem Zugriffstoken kann der Prozess Aktionen auf Systemebene ausführen, die zuvor nicht möglich waren. Ihre Anwendung sollte gründlich überprüfen, ob die Berechtigung für den Kontotyp geeignet ist, insbesondere für die folgenden leistungsstarken Berechtigungen.

Berechtigungskonstante Zeichenfolgenwert Anzeigename
SE_ASSIGNPRIMARYTOKEN_NAME SeAssignPrimaryTokenPrivilege Ersetzen eines Tokens auf Prozessebene
SE_BACKUP_NAME SeBackupPrivilege Sichern von Dateien und Verzeichnissen
SE_DEBUG_NAME SeDebugPrivilege Debuggen von Programmen
SE_INCREASE_QUOTA_NAME SeIncreaseQuotaPrivilege Anpassen von Speicherkontingenten für einen Prozess
SE_TCB_NAME SeTcbPrivilege Einsetzen als Teil des Betriebssystems

Bevor Sie diese potenziell gefährlichen Berechtigungen aktivieren, sollten Sie feststellen, dass Funktionen oder Vorgänge in Ihrem Code tatsächlich die Berechtigungen erfordern. Beispielsweise erfordern nur sehr wenige Funktionen im Betriebssystem tatsächlich das SeTcbPrivilege. Eine Liste aller verfügbaren Berechtigungen finden Sie unter Berechtigungskonstanten.

Das folgende Beispiel zeigt, wie Sie eine Berechtigung in einem Zugriffstoken aktivieren oder deaktivieren. Im Beispiel wird die LookupPrivilegeValue-Funktion aufgerufen, um den lokal eindeutigen Bezeichner (LUID ) abzurufen, den das lokale System zum Identifizieren der Berechtigungen verwendet. Anschließend ruft das Beispiel die AdjustTokenPrivileges-Funktion auf , die die Berechtigung, die vom Wert des bEnablePrivilege-Parameters abhängt, entweder aktiviert oder deaktiviert.

#include <windows.h>
#include <stdio.h>
#pragma comment(lib, "advapi32.lib")

BOOL SetPrivilege(
    HANDLE hToken,          // access token handle
    LPCTSTR lpszPrivilege,  // name of privilege to enable/disable
    BOOL bEnablePrivilege   // to enable or disable privilege
    ) 
{
    TOKEN_PRIVILEGES tp;
    LUID luid;

    if ( !LookupPrivilegeValue( 
            NULL,            // lookup privilege on local system
            lpszPrivilege,   // privilege to lookup 
            &luid ) )        // receives LUID of privilege
    {
        printf("LookupPrivilegeValue error: %u\n", GetLastError() ); 
        return FALSE; 
    }

    tp.PrivilegeCount = 1;
    tp.Privileges[0].Luid = luid;
    if (bEnablePrivilege)
        tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
    else
        tp.Privileges[0].Attributes = 0;

    // Enable the privilege or disable all privileges.

    if ( !AdjustTokenPrivileges(
           hToken, 
           FALSE, 
           &tp, 
           sizeof(TOKEN_PRIVILEGES), 
           (PTOKEN_PRIVILEGES) NULL, 
           (PDWORD) NULL) )
    { 
          printf("AdjustTokenPrivileges error: %u\n", GetLastError() ); 
          return FALSE; 
    } 

    if (GetLastError() == ERROR_NOT_ALL_ASSIGNED)

    {
          printf("The token does not have the specified privilege. \n");
          return FALSE;
    } 

    return TRUE;
}