Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2011.04.10;
Скачать: [xml.tar.bz2];

Вниз

Консольное приложение и 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.45 MB
Время: 0.004 c
15-1293027819
картман
2010-12-22 17:23
2011.04.10


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


2-1294612841
Германн
2011-01-10 01:40
2011.04.10
Свойство RowSelect у компонента TTreeView


2-1294836816
пишу_курсовой
2011-01-12 15:53
2011.04.10
посоветуйте, как организовать алгоритм


2-1294996934
12
2011-01-14 12:22
2011.04.10
Error creating variant or safe array. Из-за чего?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский