Włączanie i wyłączanie uprawnień w języku C++
Włączenie uprawnień w tokenie dostępu umożliwia procesowi wykonywanie akcji na poziomie systemu, których wcześniej nie można było wykonać. Aplikacja powinna dokładnie sprawdzić, czy uprawnienie jest odpowiednie dla typu konta, zwłaszcza w przypadku następujących zaawansowanych uprawnień.
Stała uprawnień | Wartość ciągu | Nazwa wyświetlana |
---|---|---|
SE_ASSIGNPRIMARYTOKEN_NAME | SeAssignPrimaryTokenPrivilege | Zamień token na poziomie procesu |
SE_BACKUP_NAME | SeBackupPrivilege | Tworzenie kopii zapasowych plików i katalogów |
SE_DEBUG_NAME | SeDebugPrivilege | Debugowanie programów |
SE_ZWIEKSZ_NAZWE_KWOTY | SeIncreaseQuotaPrivilege | Dostosowywanie przydziałów pamięci dla procesu |
SE_TCB_NAME | SeTcbPrivilege | Działanie jako część systemu operacyjnego |
Przed włączeniem któregokolwiek z tych potencjalnie niebezpiecznych uprawnień należy określić, że funkcje lub operacje w kodzie rzeczywiście wymagają uprawnień. Na przykład bardzo niewiele funkcji w systemie operacyjnym rzeczywiście wymaga SeTcbPrivilege. Aby uzyskać listę wszystkich dostępnych uprawnień, sprawdź Privilege Constants.
W poniższym przykładzie pokazano, jak włączyć lub wyłączyć uprawnienia w tokenie dostępu . W przykładzie wywoływana jest funkcja LookupPrivilegeValue, aby pozyskać lokalnie unikatowy identyfikator (LUID), którego system lokalny używa do identyfikowania uprawnień. Następnie przykład wywołuje funkcję AdjustTokenPrivileges, która włącza lub wyłącza uprawnienia zależne od wartości parametru bEnablePrivilege.
#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;
}