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