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

Вниз

Консольное приложение и UAC   Найти похожие ветки 

 
DVM ©   (2010-12-25 12:15) [11]

Придумал вот такой вариант:

program Project2;

{$APPTYPE CONSOLE}

uses
 Windows,
 SysUtils,
 ShellApi;

function IsAdministrator: Boolean;
var
 psidAdmin: Pointer;
 Token: THandle;
 Count: DWORD;
 TokenInfo: PTokenGroups;
 HaveToken: Boolean;
 I: Integer;
const
 SECURITY_NT_AUTHORITY: TSidIdentifierAuthority = (Value: (0, 0, 0, 0, 0, 5));
 SE_GROUP_USE_FOR_DENY_ONLY = $00000010;
 SECURITY_BUILTIN_DOMAIN_RID  = $00000020;
 DOMAIN_ALIAS_RID_ADMINS = $00000220;
begin
 psidAdmin := nil;
 TokenInfo := nil;
 HaveToken := False;
 try
   Token := 0;
   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
     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));
     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);
       if Result then
       begin
         //consider denied ACE with Administrator SID
         Result := TokenInfo^.Groups[I].Attributes and SE_GROUP_USE_FOR_DENY_ONLY
             <> SE_GROUP_USE_FOR_DENY_ONLY;
         Break;
       end;
       {$IFDEF RANGECHECKS_ON}
       {$RANGECHECKS ON}
       {$ENDIF RANGECHECKS_ON}
     end;
   end;
 finally
   if TokenInfo <> nil then
     FreeMem(TokenInfo);
   if HaveToken then
     CloseHandle(Token);
   if psidAdmin <> nil then
     FreeSid(psidAdmin);
 end;
end;

procedure Restart;
var
SEI: TShellExecuteInfo;
begin
ZeroMemory(@SEI, SizeOf(SEI));
SEI.cbSize := SizeOf(TShellExecuteInfo);
SEI.Wnd := 0;
SEI.fMask := SEE_MASK_FLAG_DDEWAIT or SEE_MASK_FLAG_NO_UI;
SEI.lpVerb := PChar("runas");
SEI.lpFile := PChar(ParamStr(0));
SEI.nShow := SW_SHOWNORMAL;
ShellExecuteEx(@SEI);
end;

begin
 if not IsAdministrator then
   begin
     Restart;
     Exit;
   end;
 Readln;
end.




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

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

Наверх




Память: 0.47 MB
Время: 0.014 c
15-1292966991
Юрий
2010-12-22 00:29
2011.04.10
С днем рождения ! 22 декабря 2010 среда


2-1294653381
softi
2011-01-10 12:56
2011.04.10
сохранение JPEG из буфера обмена


15-1293226188
Юрий
2010-12-25 00:29
2011.04.10
С днем рождения ! 25 декабря 2010 суббота


2-1293704422
Неважно
2010-12-30 13:20
2011.04.10
Цвет TBitmap


2-1294752413
начинающий1993
2011-01-11 16:26
2011.04.10
вызвать B из A