Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > Права администратора


Автор: PIF 8.6.2005, 17:00
Здравствуйте!
Как можно узнать имеет ли данный пользоватиль права администратора (при старте программы).
Заранее спасибо!!!

Автор: _hunter 8.6.2005, 17:26
юзаем поиск
http://forum.vingrad.ru/index.php?showtopic=51999

Автор: PIF 8.6.2005, 18:37
Код

type 
 PTOKEN_GROUPS = TOKEN_GROUPS^; 

function RunningAsAdministrator(): Boolean; 
var 
 SystemSidAuthority: SID_IDENTIFIER_AUTHORITY = SECURITY_NT_AUTHORITY; 
 psidAdmin: PSID; 
 ptg: PTOKEN_GROUPS = nil; 
 htkThread: Integer; { HANDLE } 
 cbTokenGroups: Longint; { DWORD } 
 iGroup: Longint; { DWORD } 
 bAdmin: Boolean; 
begin 
 Result := false; 
 if not OpenThreadToken(GetCurrentThread(), // get security token 
   TOKEN_QUERY, FALSE, htkThread) then 
   if GetLastError() = ERROR_NO_TOKEN then 
   begin 
     if not OpenProcessToken(GetCurrentProcess(), 
       TOKEN_QUERY, htkThread) then 
       Exit; 
   end 
   else 
     Exit; 

 if GetTokenInformation(htkThread, // get #of groups 
   TokenGroups, nil, 0, cbTokenGroups) then 
   Exit; 

 if GetLastError() <> ERROR_INSUFFICIENT_BUFFER then 
   Exit; 

 ptg := PTOKEN_GROUPS(getmem(cbTokenGroups)); 
 if not Assigned(ptg) then 
   Exit; 

 if not GetTokenInformation(htkThread, // get groups 
   TokenGroups, ptg, cbTokenGroups, cbTokenGroups) then 
   Exit; 

 if not AllocateAndInitializeSid(SystemSidAuthority, 
   2, SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_ADMINS, 
   0, 0, 0, 0, 0, 0, psidAdmin) then 
   Exit; 

 iGroup := 0; 
 while iGroup < ptg^.GroupCount do // check administrator group 
 begin 
   if EqualSid(ptg^.Groups[iGroup].Sid, psidAdmin) then 
   begin 
     Result := TRUE; 
     break; 
   end; 
   Inc(iGroup); 
 end; 
 FreeSid(psidAdmin); 
end; 

Выдает ошибку при компиляции!

Автор: _hunter 8.6.2005, 18:52
какую?

Автор: PIF 8.6.2005, 18:54
В строке SystemSidAuthority: SID_IDENTIFIER_AUTHORITY = SECURITY_NT_AUTHORITY; и
ptg: PTOKEN_GROUPS = nil;
[Error] Cannot initialize local variables

Автор: _hunter 8.6.2005, 19:31
ну потом их проинициализируй...

Автор: PIF 8.6.2005, 19:34
каким образом не подскажите, а то я совсем новичек

Автор: _hunter 9.6.2005, 11:03
написать SystemSidAuthority := SECURITY_NT_AUTHORITY; smile

Автор: poor_yorik 9.6.2005, 15:47
Попробуй такой код

Код

const
   SECURITY_NT_AUTHORITY: TSIDIdentifierAuthority =
     (Value: (0, 0, 0, 0, 0, 5));
   SECURITY_BUILTIN_DOMAIN_RID = $00000020;
   DOMAIN_ALIAS_RID_ADMINS = $00000220;

 function IsAdmin: Boolean;
 var
   hAccessToken: THandle;
   ptgGroups: PTokenGroups;
   dwInfoBufferSize: DWORD;
   psidAdministrators: PSID;
   x: Integer;
   bSuccess: BOOL;
 begin
   Result   := False;
   bSuccess := OpenThreadToken(GetCurrentThread, TOKEN_QUERY, True,
     hAccessToken);
   if not bSuccess then
   begin
     if GetLastError = ERROR_NO_TOKEN then
       bSuccess := OpenProcessToken(GetCurrentProcess, TOKEN_QUERY,
         hAccessToken);
   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 x := 0 to ptgGroups.GroupCount - 1 do
         if EqualSid(psidAdministrators, ptgGroups.Groups[x].Sid) then
         begin
           Result := True;
           Break;
         end;
       {$R+}
       FreeSid(psidAdministrators);
     end;
     FreeMem(ptgGroups);
   end;
 end;

 procedure TForm1.Button1Click(Sender: TObject);
 begin
   if isAdmin then
     ShowMessage('Logged in as Administrator');
 end;


Автор: PIF 9.6.2005, 17:49
Спасибо, все работает!!!

Автор: Nicholas 15.6.2005, 18:37
А КАК ПРАВА АДМИНА УСТАНОВИТЬ В WinXP,NT ??

Автор: _hunter 15.6.2005, 18:56
добавить пользователя в группу админов...

Автор: Alex 15.6.2005, 22:56
Модератор: Пожалуйста, один топик - один вопрос.

Автор: Rrader 16.6.2005, 07:22
Цитата

Здравствуйте!
Как можно узнать имеет ли данный пользоватиль права администратора (при старте программы).
Заранее спасибо!!!

http://forum.vingrad.ru/index.php?showtopic=51999&unread=1&st=0&#entry443059 smile

Автор: Nicholas 17.6.2005, 02:16
Цитата(_hunter @ 15.6.2005, 18:56)
добавить пользователя в группу админов...


Это понятно, а вот код какой?

Кроме того наверняка есть способ без добавления в группу.

smile


p.s. Модераторы, топик называется "Права администратора" - значит все что с ними связано. smile

Автор: Alex 17.6.2005, 02:20
Nicholas, по хорошему не понимаем? Хорошо, будем тогда жестко. Тема закрыта!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)