Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.07.18;
Скачать: CL | DM;

Вниз

Права администратора   Найти похожие ветки 

 
Oleg_   (2005-05-24 20:03) [0]

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


 
Kerk ©   (2005-05-24 20:39) [1]

В 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 (не пустой), то можно проверить свои силы на удалённой машине ;)


 
xShadow ©   (2005-05-25 09:25) [2]

пример 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;



Страницы: 1 вся ветка

Текущий архив: 2005.07.18;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.045 c
14-1117724473
NightStranger
2005-06-02 19:01
2005.07.18
Какую музыку предпочитаете, г-да программисты?


1-1120393211
kyro
2005-07-03 16:20
2005.07.18
События на клавиатуру


14-1119612391
Ньюб
2005-06-24 15:26
2005.07.18
блок копирования и запуска на других компьютерах


9-1112957487
П7
2005-04-08 14:51
2005.07.18
Динамическое освещение в 2Д


1-1120195196
Kot Andrei
2005-07-01 09:19
2005.07.18
Форма создана or нет