15 мая 2023 года "Исходники.РУ" отмечают своё 23-летие!
Поздравляем всех причастных и неравнодушных с этим событием!
И огромное спасибо всем, кто был и остаётся с нами все эти годы!

Главная Форум Журнал Wiki DRKB Discuz!ML Помощь проекту


Как получить список привелегий учётной записи

Эта статья демонстрирует, как пролистать привелегии, доступные процессу.

Когда пользователь запускает процесс, то этот процесс получает права пользователя. Эти права, унаследованные от пользователя, включая привелегии учётной записи, управляют доступом к системным сервисам. Чтобы получить список прав, принадлежащих процессу (а соответственно и текущему пользователю), проделайте следующие шаги:

  1. Вызовите функцию GetCurrentProcess, для получения дескриптора текущего процесса.

  2. Вызовите функцию GetProcessToken, чтобы получить маркёр доступа процесса.

  3. Вызовите функцию GetTokenInformation, для получения списка привелегий.

  4. При помощи функций LookupPrivilegeName и LookupPrivilegeDisplayName, циклически пройдитесь по списку привелегий, чтобы получить текстовое название каждой привелегии в списке.

Пример кода

Следующий пример пролистывает названия привелегий для текущего процесса. Имена привелегий и их отображаемые эквиваленты определены в заголовочном файле Winnt.h.

#include <windows.h>
#include <stdio.h>

#define NAME_SIZE 255

void main(void) {

   HANDLE            hToken        = NULL;
   DWORD             cbTokenInfo   = 0;
   PTOKEN_PRIVILEGES ptiPrivileges = NULL;

   char  szPrivilegeName[NAME_SIZE];
   DWORD cbPrivilegeName;
   char  szDisplayName[NAME_SIZE];
   DWORD cbDisplayName;
   DWORD dwLangId;
   UINT  nIndex;

   __try {


      // Получаем дескриптор маркёра доступа процесса.
      if (!OpenProcessToken(GetCurrentProcess(), TOKEN_READ, 
            &hToken)) {

         printf("OpenProcessToken() failed.  Error %d\n", 
               GetLastError());
         __leave;
      }

      // Определяем требуемый размер буфера для маркёра привелегий.
      if (GetTokenInformation(hToken, TokenPrivileges, 
            NULL, 0, &cbTokenInfo)) {

         // Если длина буфера нулевая, то ошибка.
         __leave;
      
      } else {

         // Если длина буфера нулевая, то ошибка.
         if (GetLastError() != ERROR_INSUFFICIENT_BUFFER) {
            printf("GetTokenInformation() failed.  Error %d\n",
                  GetLastError());
            __leave;
         }
      }

      // Распределяем буфер для маркёра привелегий.
      ptiPrivileges = (PTOKEN_PRIVILEGES) HeapAlloc(GetProcessHeap(),
            HEAP_ZERO_MEMORY, cbTokenInfo);
      if (!ptiPrivileges) {
         printf("HeapAlloc() failed.  Error %d\n", GetLastError());
         __leave;
      }

      // Получаем привелегии.
      if (!GetTokenInformation(hToken, TokenPrivileges, 
            ptiPrivileges, cbTokenInfo, &cbTokenInfo)) {
         
         printf("GetTokenInformation() failed.  Error %d\n", 
               GetLastError());
         __leave;
      }
      
      // Отображаем привелегии.
      printf("%-32s %s\n", "PRIVILEGE NAME", "DISPLAY NAME");
      printf("%-32s %s\n", "--------------", "------------");

      // Циклически проходим по всем LUID.
      for (nIndex = 0; nIndex < ptiPrivileges->PrivilegeCount; 
         nIndex++) {

         // Получаем имя привелегии, связанное с этим LUID.
         cbPrivilegeName = NAME_SIZE;
         if (!LookupPrivilegeName(NULL, 
               &ptiPrivileges->Privileges[nIndex].Luid,
               szPrivilegeName, &cbPrivilegeName)) {
         
            printf("LookupPrivilegeName() failed.  Error %d\n",
                  GetLastError());
            __leave;
         }

         // Получаем отображаемое имя, связанное с этим LUID.
         cbDisplayName = NAME_SIZE;
         if (!LookupPrivilegeDisplayName(NULL, szPrivilegeName,
               szDisplayName, &cbDisplayName, &dwLangId)) {
            
            printf("LookupPrivilegeDisplayName() failed.  Error %d\n",
                  GetLastError());
            __leave;
         }

         printf("%-32s %s\n", szPrivilegeName, szDisplayName);
      }
   
   } __finally {

      // Освобождаем ресурсы.
      if (hToken)
         CloseHandle(hToken);

      if (!ptiPrivileges) 
         HeapFree(GetProcessHeap(), 0, ptiPrivileges);
   }
   
   return;
}