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

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

Права администратора [D6, WinXP]


Oleg_ ©   (2005-05-24 20:03:00) 

Подскажите, как проверить есть ли у текущего пользователя права администратора.


xShadow   (2005-05-25 09:25:00) [1]

пример 1-го способа
function IsAdmin: Boolean;
const
SECURITY_NT_AUTHORITY : TSIDIdentifierAuthority = (Value: (0, 0, 0, 0, 0, 5));
SECURITY_BUILTIN_DOMAIN_RID                     = $00000020;
DOMAIN_ALIAS_RID_ADMINS                         = $00000220;
var
hAccessToken       : THandle;
ptgGroups          : PTokenGroups;
dwInfoBufferSize   : DWORD;
psidAdministrators : PSID;
i                  : Integer;
bSuccess           : BOOL;
begin
if Win32Platform <> VER_PLATFORM_WIN32_NT then
begin
  Result := True;
  Exit;
end;

Result := False;
bSuccess := OpenThreadToken(GetCurrentThread, TOKEN_QUERY, True, hAccessToken);
if not bSuccess then
begin
  if GetLastError = ERROR_NO_TOKEN then
  begin
    bSuccess := OpenProcessToken(GetCurrentProcess, TOKEN_QUERY, hAccessToken);
  end;
end;
if bSuccess then
begin
  GetMem(ptgGroups, 1024);
  bSuccess := GetTokenInformation(hAccessToken, TokenGroups, ptgGroups, 1024, dwInfoBufferSize);
  CloseHandle(hAccessToken);
  if bSuccess then
  begin
    AllocateAndInitializeSid(SECURITY_NT_AUTHORITY, 2, SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_ADMINS, 0, 0, 0, 0, 0, 0, psidAdministrators);
    {$R-}
    for i := 0 to ptgGroups.GroupCount-1 do
    begin
      if EqualSid(psidAdministrators, ptgGroups.Groups[i].Sid) then
      begin
        Result := True;
        Break;
      end;
    end;
    {$R+}
    FreeSid(psidAdministrators);
  end;
  FreeMem(ptgGroups);
end;
end;


Kerk   (2005-05-24 20:39:00) [2]

В MSDN описано как минимум два метода. В первом открываем Token процесса и долго с ним мучаемся...

Второй метод прост. Вот пример функции на Delphi:

Uses WINSVC;
----------
Function IsUserAdmin(Const aHostName: String): Bool;

Var SCHndl: THandle;

Begin
SCHndl := OpenSCManager(PChar(aHostName), Nil, SC_MANAGER_ALL_ACCESS);
Result := SCHndl <> 0;
If Result Then
  CloseServiceHandle(SCHndl)
Else
  If GetLastError <> ERROR_ACCESS_DENIED Then
    RaiseLastWin32Error;
End;


Если указать aHostName (не пустой), то можно проверить свои силы на удалённой машине ;)


Наверх

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