Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Проверка прав пользователя


aldapooh ©   (2003-08-27 12:44:00) 

Я получаю Token с помощью LogonUser. Как проверить права этого пользователя, принадлежность к группе?
Кажется подойдут AccessCheck и CheckTokenMembership, но я не уверен и вообще в некой растерянности. Если можно пару советов или ссылок с примером желательно на Delphi.
Заранее благодарен!


clickmaker   (2003-08-29 12:45:00) [1]

Проверка, является ли юзер админом. Ф-ию несложно переделать для любой другой группы

function RunningAsAdministrator: boolean;
const
SECURITY_BUILTIN_DOMAIN_RID = $00000020;
DOMAIN_ALIAS_RID_ADMINS = $00000220;
SystemSidAuthority: SID_IDENTIFIER_AUTHORITY = (Value: (0,0,0,0,0,5));
var
hThread: THandle;
ptg: PTokenGroups;
cbTokenGroups: DWORD;
i: integer;
psidAdmin: PSID;
begin
Result := false;

if OpenThreadToken (GetCurrentThread, TOKEN_QUERY, FALSE, hThread) = FALSE then begin

if GetLastError = ERROR_NO_TOKEN then begin

if OpenProcessToken(GetCurrentProcess, TOKEN_QUERY, hThread) = FALSE then
Exit;
end else
Exit;
end;

if GetTokenInformation(hThread, TokenGroups, nil, 0, cbTokenGroups) <> FALSE then
Exit;

if GetLastError <> ERROR_INSUFFICIENT_BUFFER then
Exit;

ptg := PTokenGroups(LocalAlloc(LPTR, cbTokenGroups));
if (ptg = nil) then Exit;

if GetTokenInformation (hThread, TokenGroups, ptg, cbTokenGroups, cbTokenGroups) = FALSE then
Exit;

if AllocateAndInitializeSid(SystemSidAuthority, 2, SECURITY_BUILTIN_DOMAIN_RID,
DOMAIN_ALIAS_RID_ADMINS, 0, 0, 0, 0, 0, 0, psidAdmin) = FALSE then begin
LocalFree(Cardinal(ptg));
Exit;
end;

for i := 0 to ptg^.GroupCount-1 do begin

if EqualSid(ptg^.Groups[i].Sid, psidAdmin) then begin

Result := true;
break;
end;
end;

FreeSid(psidAdmin);
LocalFree(Cardinal(ptg));
end;


aldapooh   (2003-08-29 10:23:00) [2]

Где то я наврал потому что CheckTokenMembership(Token,SID,IsMember) всегда возвращает мне IsMember = True
Может я не тот токен или сид передаю...
Любые ваши комментариии...
Спасибо!


Наверх

Титульная страница Поиск, карта сайта Написать письмо