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