Форум: "Начинающим";
Текущий архив: 2007.11.11;
Скачать: [xml.tar.bz2];
ВнизПрава пользователя Найти похожие ветки
← →
apic © (2007-10-13 14:55) [0]Как узнать под каким типом учетной записи запущена программа (Администратор, пользователь или гость...)?
← →
TIF © (2007-10-13 15:24) [1]API
← →
apic © (2007-10-13 15:31) [2]Сильно сказано конечно...
← →
Dib@zol © (2007-10-13 15:32) [3]> [1] TIF © (13.10.07 15:24)
Вах, какой ответ!!! Сразу Мастера можно давать ;)
Я в этих делах не спец, но может быть, тут нужен LookupAccountName?
← →
Правильный Вася (2007-10-13 15:47) [4]а что значит "тип"?
все перечисленное тобой отличается только набором прав
но весь список прав вообще вряд ли у кого есть, даже у админа
как ты их различать собираешься?
это только в хоме едитион есть такая грубая градация
← →
Рамиль © (2007-10-13 16:19) [5]ИМХО:
Получить все группы, в которых состоит пользователь, и по http://support.microsoft.com/kb/243330 вычислить группу (по имени нельзя, так как ее можно переименовать)
← →
Lacmus © (2007-10-13 19:40) [6]
{******************************************************************************* *******************}
{ }
{ Project JEDI Code Library (JCL) }
const
SECURITY_NT_AUTHORITY: TSidIdentifierAuthority = (Value: (0, 0, 0, 0, 0, 5));
SECURITY_BUILTIN_DOMAIN_RID = ($00000020);
DOMAIN_ALIAS_RID_ADMINS = ($00000220);
DOMAIN_ALIAS_RID_USERS = ($00000221);
DOMAIN_ALIAS_RID_GUESTS = ($00000222);
function IsAdministrator: Boolean;
var
psidAdmin: Pointer;
Token: THandle;
Count: DWORD;
TokenInfo: PTokenGroups;
HaveToken: Boolean;
I: Integer;
begin
Result := False;
psidAdmin := nil;
TokenInfo := nil;
HaveToken := False;
try
HaveToken := OpenThreadToken(GetCurrentThread, TOKEN_QUERY, True, Token);
if (not HaveToken) and (GetLastError = ERROR_NO_TOKEN) then
HaveToken := OpenProcessToken(GetCurrentProcess, TOKEN_QUERY, Token);
if HaveToken then
begin
{$IFDEF FPC}
Win32Check(AllocateAndInitializeSid(SECURITY_NT_AUTHORITY, 2,
SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_ADMINS, 0, 0, 0, 0, 0, 0,
psidAdmin));
if GetTokenInformation(Token, TokenGroups, nil, 0, @Count) or
(GetLastError <> ERROR_INSUFFICIENT_BUFFER) then
RaiseLastOSError;
TokenInfo := PTokenGroups(AllocMem(Count));
Win32Check(GetTokenInformation(Token, TokenGroups, TokenInfo, Count, @Count));
{$ELSE FPC}
Win32Check(AllocateAndInitializeSid(SECURITY_NT_AUTHORITY, 2,
SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_ADMINS, 0, 0, 0, 0, 0, 0,
psidAdmin));
if GetTokenInformation(Token, TokenGroups, nil, 0, Count) or
(GetLastError <> ERROR_INSUFFICIENT_BUFFER) then
RaiseLastOSError;
TokenInfo := PTokenGroups(AllocMem(Count));
Win32Check(GetTokenInformation(Token, TokenGroups, TokenInfo, Count, Count));
{$ENDIF FPC}
for I := 0 to TokenInfo^.GroupCount - 1 do
begin
{$RANGECHECKS OFF} // Groups is an array [0..0] of TSIDAndAttributes, ignore ERangeError
Result := EqualSid(psidAdmin, TokenInfo^.Groups[I].Sid);
{$IFDEF RANGECHECKS_ON}
{$RANGECHECKS ON}
{$ENDIF RANGECHECKS_ON}
if Result then
Break;
end;
end;
finally
if TokenInfo <> nil then
FreeMem(TokenInfo);
if HaveToken then
CloseHandle(Token);
if psidAdmin <> nil then
FreeSid(psidAdmin);
end;
end;
пользователь - DOMAIN_ALIAS_RID_USERS или гость - DOMAIN_ALIAS_RID_GUESTS
← →
apic © (2007-10-18 14:46) [7]Lacmus то, что надо!
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2007.11.11;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.05 c