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

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

Как узнать группу пользователя [D7, Win2k]


Chris ©   (2003-10-04 20:08:00) 

Необходимо узнать уровень прав пользователя, запустившего программу. Необходимо также различать пользователя (или администратора)локального и доменного.
И второй вопрос. Можно ли с сервера домена получить информацию о пользователе?


Chris   (2003-10-04 23:07:00) [1]

... достал меня плагиат!!!
Нашел в Инете кучу ссылок по запросу "Как проверить, имеем ли мы административные привилегии в системе?". В результате имеем неработающий модуль, потому что один не проверил работоспособность, а другие просто переписывают, беря количеством, а не качеством!
Пришлось немного подкорректировать:
function CheckAdministrator: Boolean;
var
SystemSidAuthority: SID_IDENTIFIER_AUTHORITY;
psidAdmin: PSID;
ptg: PTokenGroups;
htkThread: DWord;
cbTokenGroups: DWord;
iGroup: Longint;
bAdmin: Boolean;

begin
Result := false;
if not OpenThreadToken(GetCurrentThread(), // get security token
TOKEN_QUERY,
FALSE,
htkThread) then
if GetLastError() = ERROR_NO_TOKEN then
begin
if not OpenProcessToken(GetCurrentProcess(),
TOKEN_QUERY,
htkThread) then
Exit;
end
else
Exit;
if GetTokenInformation(htkThread, // get #of groups
TokenGroups,
nil,
0,
cbTokenGroups) then
Exit;
if GetLastError() <> ERROR_INSUFFICIENT_BUFFER then
Exit;
GetMem(ptg,cbTokenGroups);
// ptg := PTOKEN_GROUPS( getmem( cbTokenGroups ) );
if not Assigned(ptg) then
Exit;
if not GetTokenInformation(htkThread, // get groups
TokenGroups,
ptg,
cbTokenGroups,
cbTokenGroups) then
Exit;
if not AllocateAndInitializeSid(SystemSidAuthority,
2,
SECURITY_BUILTIN_DOMAIN_RID,
DOMAIN_ALIAS_RID_ADMINS,
0, 0, 0, 0, 0, 0,
psidAdmin) then
Exit;
for iGroup:=0 to ptg^.GroupCount-1 do // check administrator group
if EqualSid(ptg^.Groups[iGroup].Sid, psidAdmin) then
begin
Result := TRUE;
break;
end;
FreeSid(psidAdmin);
end;
но в результате я получаю пустышку, т.к. при любом раскладе функция дает False (проверял под пользователем, локальным администратором и администратором домена).
Поэтому пришлось отказаться от этого и использовать самый простой вариант:

...
function IsUserAdmin: Boolean; stdcall;

implementation

function IsUserAdmin; external "setupapi.dll" name "IsUserAdmin";
...
По крайней мере этот вариант работает


Игорь Шевченко   (2003-10-04 20:21:00) [2]

Пардон, невнимательно читал. Если пользователь уже запустил программу, то OpenProcessToken+GetTokenInformation


Игорь Шевченко   (2003-10-04 20:17:00) [3]

NetUserGetInfo


Наверх

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