Aktivieren und Deaktivieren von Berechtigungen in C++

Wenn Sie eine Berechtigung in einem Zugriffstoken aktivieren, 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 Typ des Kontos geeignet ist, insbesondere für die folgenden leistungsstarken Berechtigungen.

Berechtigungskonstante Zeichenfolgenwert Anzeigename
_SE ASSIGNPRIMARYTOKEN-NAME _ SeAssignPrimaryTokenPrivilege Ersetzen eines Tokens auf Prozessebene
_SE _SICHERUNGSNAME SeBackupPrivilege Sichern von Dateien und Verzeichnissen
_SE _DEBUGNAME SeDebugPrivilege Debuggen von Programmen
_SE ERHÖHEN DES _ _ KONTINGENTNAMENS 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, bestimmen Sie, ob Funktionen oder Vorgänge in Ihrem Code die Berechtigungen tatsächlich benötigen. Beispielsweise erfordern nur sehr wenige Funktionen im Betriebssystem tatsächlich seTcbPrivilege. Eine Liste aller verfügbaren Berechtigungen finden Sie unter Berechtigungskonstanten.

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

#include <windows.h>
#include <stdio.h>
#pragma comment(lib, "cmcfg32.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;
}