Udostępnij za pośrednictwem


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