Форум: "WinAPI";
Текущий архив: 2003.11.27;
Скачать: [xml.tar.bz2];
ВнизКак узнать группу пользователя Найти похожие ветки
← →
Chris (2003-10-04 20:08) [0]Необходимо узнать уровень прав пользователя, запустившего программу. Необходимо также различать пользователя (или администратора)локального и доменного.
И второй вопрос. Можно ли с сервера домена получить информацию о пользователе?
← →
Игорь Шевченко (2003-10-04 20:17) [1]NetUserGetInfo
← →
Игорь Шевченко (2003-10-04 20:21) [2]Пардон, невнимательно читал. Если пользователь уже запустил программу, то OpenProcessToken+GetTokenInformation
← →
Chris (2003-10-04 23:07) [3]... достал меня плагиат!!!
Нашел в Инете кучу ссылок по запросу "Как проверить, имеем ли мы административные привилегии в системе?". В результате имеем неработающий модуль, потому что один не проверил работоспособность, а другие просто переписывают, беря количеством, а не качеством!
Пришлось немного подкорректировать:
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";
...
По крайней мере этот вариант работает
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2003.11.27;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.023 c