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

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

Права пользователя [D7, 2000, XP, 2003]


apic ©   (2007-10-13 14:55:00) 

Как узнать под каким типом учетной записи запущена программа (Администратор, пользователь или гость...)?


apic   (2007-10-18 14:46:00) [1]

Lacmus то, что надо!


Lacmus   (2007-10-13 19:40:00) [2]



{******************************************************************************* *******************}
{                                                                                                  }
{ 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


Рамиль   (2007-10-13 16:19:00) [3]

ИМХО:
Получить все группы, в которых состоит пользователь, и по http://support.microsoft.com/kb/243330вычислить группу (по имени нельзя, так как ее можно переименовать)


Правильный Вася   (2007-10-13 15:47:00) [4]

а что значит "тип"?
все перечисленное тобой отличается только набором прав
но весь список прав вообще вряд ли у кого есть, даже у админа
как ты их различать собираешься?
это только в хоме едитион есть такая грубая градация


Dib@zol   (2007-10-13 15:32:00) [5]

> [1] TIF ©   (13.10.07 15:24)

Вах, какой ответ!!! Сразу Мастера можно давать ;)

Я в этих делах не спец, но может быть, тут нужен LookupAccountName?


apic   (2007-10-13 15:31:00) [6]

Сильно сказано конечно...


TIF   (2007-10-13 15:24:00) [7]

API


Наверх

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