Задача перечисления привилегий учетной записи

Первая задача - перечисление привилегий данной учетной записи - решается при помощи функции LsaEnumerateAccountRights. Эта функция перечисляет привилегии пользователя с заданным идентификатором безопасности Sid в отношении системы с объектом политики PolicyHandle, передаваемыми ей в качестве параметров.

Обычно учетная запись, если не предпринимать специальных мер, не имеет привилегий. Привилегиями обладает группа, к которой принадлежит данный пользователь. Поэтому не нужно удивляться, если число привилегий, которыми обладает конкретный пользователь, в том числе и администратор системы, окажется равным 0. Напротив, набор привилегий в маркере представляет собой совокупность привилегий пользователя и групп, к которым приписан данный пользователь. С другой стороны, если добавить привилегию пользователю и вызвать функцию LsaEnumerateAccountRights, то вновь добавленная привилегия сразу же будет замечена, тогда как в маркере доступа процессов данного пользователя ее не окажется. Это связано с тем, что такой маркер формируется на этапе входа пользователя в систему, поэтому, иногда, для того, чтобы новая привилегия пользователя попала в его маркер доступа, целесообразно осуществить повторный вход в систему.

Прогон программы перечисления привилегий пользователя

В качестве примера рассмотрим программу, задача которой - вывод списка привилегий текущего пользователя.

#ifndef UNICODE

#define UNICODE

#endif

#include <windows.h>

#include <stdio.h>

#include "ntsecapi.h"

BOOL GetUserSID(TOKEN_USER *, PDWORD pdwSize);

void main(void){

PSID pSid;

DWORD TokenUserBufSize=256;

TOKEN_USER *pUser;

HANDLE hHeap;

LSA_HANDLE hPolicy=NULL;

LSA_OBJECT_ATTRIBUTES ObjAttributes = {0};

ULONG Count = 0, i = 0, PrivDispBufLen = 512, Language = 0;

PLSA_UNICODE_STRING Privileges = NULL;

WCHAR PrivBuf[512], PrivDispBuf[512];

CHAR TempPrivDispBuf[512], TempPrivBuf[512];

BOOL Return;

hHeap = GetProcessHeap();

pUser = (TOKEN_USER *)HeapAlloc(hHeap, HEAP_ZERO_MEMORY, TokenUserBufSize);

if(!GetUserSID(pUser, &TokenUserBufSize)) printf("GetUserSid Error\n");

pSid = pUser->User.Sid;

if(!IsValidSid(pSid)) { printf("Sid Error\n"); return; }

ObjAttributes.Length = sizeof(ObjAttributes);

LsaOpenPolicy(NULL, &ObjAttributes, POLICY_VIEW_LOCAL_INFORMATION| POLICY_LOOKUP_NAMES| POLICY_CREATE_ACCOUNT, &hPolicy);

LsaEnumerateAccountRights(hPolicy, pSid, &Privileges, &Count);

printf("Current user has %d privileges:\n",Count);

for(i = 0; i < Count; i ++) {

lstrcpyn(PrivBuf, Privileges[i].Buffer, Privileges[i].Length);

PrivBuf[Privileges[i].Length] = 0;

PrivDispBufLen = 512;

Return = LookupPrivilegeDisplayName(NULL, PrivBuf, PrivDispBuf, &PrivDispBufLen, &Language);

if(!Return) lstrcpy(PrivDispBuf, TEXT("Дружественное имя привилегии не найдено"));

CharToOem(PrivDispBuf, TempPrivDispBuf);

CharToOem(PrivBuf, TempPrivBuf);

printf("%s (%s)\n", TempPrivBuf, TempPrivDispBuf);

}

if(Privileges) LsaFreeMemory(Privileges);

LsaClose(hPolicy);

HeapFree(hHeap,0,pUser);

}

BOOL GetUserSID(TOKEN_USER * pUser, PDWORD pdwSize) {

BOOL fSuccess = FALSE;

HANDLE hToken = NULL;

DWORD dwSize;

if (!OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &hToken)) return FALSE;

if (!GetTokenInformation(hToken, TokenUser, pUser, *pdwSize, &dwSize))

return FALSE;

fSuccess = TRUE;

if (hToken != NULL) CloseHandle(hToken);

return(fSuccess);

}

Данная программа получает маркер доступа текущего процесса, извлекает из него Sid пользователя, при помощи функции LsaOpenPolicy открывает объект политики безопасности и вызывает функцию LsaEnumerateAccountRights для получения списка привилегий. Функция LookupPrivilegeDisplayName преобразует программное имя привилегии в дружественное имя. Для вывода имени привилегии на экран на русском языке используется функция CharToOem. Если число привилегий оказывается равным нулю, то с учетом замечания, сделанного выше, рекомендуется добавить пользователю, от имени которого запускается программа, одну или несколько привилегий с помощью административной консоли управления.

Наши рекомендации