AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Abfragen ob Process Adminrechte hat?
Thema durchsuchen
Ansicht
Themen-Optionen

Abfragen ob Process Adminrechte hat?

Ein Thema von Orbmu2k · begonnen am 27. Apr 2006 · letzter Beitrag vom 21. Aug 2015
Antwort Antwort
Seite 3 von 5     123 45      
Olli
(Gast)

n/a Beiträge
 
#1

Re: Abfragen ob Process Adminrechte hat?

  Alt 9. Jun 2006, 01:40
Zitat von Luckie:
Nun ja, dass der Code fehlrhaft sein soll, höre ich jetzt zum ersten mal.
Von fehlerhaft kann man wohl auch kaum sprechen. Immerhin funktioniert der Code ja bis Vista. Das Problem ist eben, daß etwas neues eingeführt wurde, was eine alte Schwachstelle der bekannten Methode zutage treten läßt. Ein Fehler ist es eigentlich wenige ... eher fehlende Funktionalität.
  Mit Zitat antworten Zitat
NicoDE
(Gast)

n/a Beiträge
 
#2

Re: Abfragen ob Process Adminrechte hat?

  Alt 9. Jun 2006, 07:46
Zitat von Olli:
Von fehlerhaft kann man wohl auch kaum sprechen. Immerhin funktioniert der Code ja bis Vista. Das Problem ist eben, daß etwas neues eingeführt wurde, was eine alte Schwachstelle der bekannten Methode zutage treten läßt. Ein Fehler ist es eigentlich wenige ... eher fehlende Funktionalität.
Das Problem gab es schon früher (siehe Anhang). Nur, dass es mit Vista für den Benutzer einfacher zu erreichen, bzw. zum Standard geworden ist.

Zum Anhang: Bei einem auf diese Art gestarteten Programm muss IsUserAdmin() False liefern (wenn man die Aussage als 'der Benutzer hat lokale administrative Rechte' interpretieren möchte).
Angehängte Grafiken
Dateityp: png runasprotected_866.png (10,0 KB, 130x aufgerufen)
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#3

Re: Abfragen ob Process Adminrechte hat?

  Alt 9. Jun 2006, 12:01
Könntest du deine obige Funktien entsprechend anpassen, da ich kein Vista zum Testen habe?
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
NicoDE
(Gast)

n/a Beiträge
 
#4

Re: Abfragen ob Process Adminrechte hat?

  Alt 9. Jun 2006, 12:41
Zitat von Luckie:
Könntest du deine obige Funktien entsprechend anpassen, da ich kein Vista zum Testen habe?
Du brauchst kein Vista zum Testen - siehe mein Beitrag mit Anhang.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.338 Beiträge
 
Delphi 12 Athens
 
#5

Re: Abfragen ob Process Adminrechte hat?

  Alt 25. Aug 2006, 14:17
@Nico:
Dat is aus deiner (alten) Variante heraus entstanden ... was genau würdest du jetzt noch ändern wollen?

kann's grad nich testen, aber dieses SE_GROUP_ENABLED hab'sch erstma reingemacht
Code:
For Loop := 0 to TokenInformation^.GroupCount - 1 do
  If [color=#ff0000](TokenInformation^.Groups[Loop].Attributes and SE_GROUP_ENABLED <> 0)[/color]
    and EqualSid(TokenInformation^.Groups[Loop].Sid, AdminSid) Then Begin
Delphi-Quellcode:
//ganze Unit siehe Anhang

  Function CheckForAdmin: Boolean;
    Const SECURITY_NT_AUTHORITY: TSIDIdentifierAuthority = (Value: (0, 0, 0, 0, 0, 5));
      SECURITY_BUILTIN_DOMAIN_RID = $00000020;
      DOMAIN_ALIAS_RID_ADMINS = $00000220;

    Var TokenHandle: THandle;
      ReturnLength: LongWord;
      TokenInformation: PTokenGroups;
      AdminSid: PSID;
      Loop: Integer;
      AdminCheckForm: TAdminCheckForm;

    Begin
      Result := False;
      TokenHandle := 0;
      TokenInformation := nil;
      If OpenProcessToken(GetCurrentProcess, TOKEN_QUERY, TokenHandle) Then
        Try
          GetTokenInformation(TokenHandle, TokenGroups, nil, 0, ReturnLength);
          TokenInformation := GetMemory(ReturnLength);
          If (TokenInformation <> nil) and GetTokenInformation(TokenHandle,
            TokenGroups, TokenInformation, ReturnLength, ReturnLength) Then Begin
            AdminSid := nil;
            AllocateAndInitializeSid(SECURITY_NT_AUTHORITY, 2, SECURITY_BUILTIN_DOMAIN_RID,
              DOMAIN_ALIAS_RID_ADMINS, 0, 0, 0, 0, 0, 0, AdminSid);
            For Loop := 0 to TokenInformation^.GroupCount - 1 do
              If ((TokenInformation^.Groups[Loop].Attributes and SE_GROUP_ENABLED) = SE_GROUP_ENABLED)
                and EqualSid(TokenInformation^.Groups[Loop].Sid, AdminSid) Then Begin
                Result := True;
                Break;
              End;
            FreeSid(AdminSid);
          End;
        Finally
          FreeMemory(TokenInformation);
          CloseHandle(TokenHandle);
        End;
      If not Result Then Begin
        AdminCheckForm := TAdminCheckForm.Create(nil);
        AdminCheckForm.ShowModal;
        AdminCheckForm.Free;
      End;
    End;
Aufrufen tu ich's einfach ma so:
Delphi-Quellcode:
Program ...;

Uses DataRescue_AdminCheck, ...;

Begin
  ...
  If not CheckForAdmin Then Exit;
  ...
End.
Angehängte Dateien
Dateityp: pas datarescue_admincheck_158.pas (5,2 KB, 52x aufgerufen)
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#6

Re: Abfragen ob Process Adminrechte hat?

  Alt 25. Aug 2006, 14:20
Ich hätte die Funktion IsAdmin oder IsRunningUnderAdminPrivileges genannt.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.338 Beiträge
 
Delphi 12 Athens
 
#7

Re: Abfragen ob Process Adminrechte hat?

  Alt 25. Aug 2006, 14:28
Aber nur die "neue" Version (jetzt wo man och noch zwischen 'nem Benutzer und seinen Rechten unterscheiden muß -.-'' ).

Bei der "alten" Variante sollte daß IsAdmin doch noch stimmen?
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
NicoDE
(Gast)

n/a Beiträge
 
#8

Re: Abfragen ob Process Adminrechte hat?

  Alt 25. Aug 2006, 15:00
Zitat von himitsu:
Dat is aus deiner (alten) Variante heraus entstanden ... was genau würdest du jetzt noch ändern wollen?
Ich mach am Sonntag mal ne Unit fertig (vorher habe ich keine Zeit dazu).
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.338 Beiträge
 
Delphi 12 Athens
 
#9

Re: Abfragen ob Process Adminrechte hat?

  Alt 25. Aug 2006, 15:18
Och, laß dir Zeit ... bis XP läuft es anscheinend ja ganz gut und Vista gibt's "noch" nicht.


Wollt daß nur solange noch "beheben", wie ich wenigstens ä bissl in der Materie drin bin ... glaub nicht, daß ich sowas so schnell nochmal machen/gebrauchen werde ._.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.338 Beiträge
 
Delphi 12 Athens
 
#10

Re: Abfragen ob Process Adminrechte hat?

  Alt 29. Aug 2006, 13:13
Hab meine integrierte Version nochmal auf deine zurückgeführt,
sodaß jetzt erstma was (hoffentlich) "Funktionierendes" existiert.

Delphi-Quellcode:
////////////////////////////////////////////////////////////////////////////////
// Procedure : HasAdminPrivileges
// Author : NBe
// Comment :
function HasAdminPrivileges: LongBool;
const
  // bekannte SIDs ... (WinNT.h)
  SECURITY_NT_AUTHORITY: TSIDIdentifierAuthority = (Value: (0, 0, 0, 0, 0, 5));
  // bekannte RIDs ... (WinNT.h)
  SECURITY_BUILTIN_DOMAIN_RID: DWORD = $00000020;
  DOMAIN_ALIAS_RID_ADMINS: DWORD = $00000220;
  SE_GROUP_ENABLED: DWORD = $00000004;

var
  TokenHandle : THandle;
  ReturnLength : DWORD;
  TokenInformation : PTokenGroups;
  AdminSid : PSID;
  Loop : Integer;

begin
  Result := False;
  TokenHandle := 0;
  TokenInformation := nil;
  AdminSid := nil;
  if OpenProcessToken(GetCurrentProcess, TOKEN_QUERY, TokenHandle) then
  try
    ReturnLength := 0;
    GetTokenInformation(TokenHandle, TokenGroups, nil, 0, ReturnLength);
    TokenInformation := GetMemory(ReturnLength);
    if Assigned(TokenInformation) and GetTokenInformation(TokenHandle,
      TokenGroups, TokenInformation, ReturnLength, ReturnLength) then
    begin
      AllocateAndInitializeSid(SECURITY_NT_AUTHORITY, 2,
        SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_ADMINS,
        0, 0, 0, 0, 0, 0, AdminSid);
      for Loop := 0 to TokenInformation^.GroupCount - 1 do
      begin
        if (SE_GROUP_ENABLED = (TokenInformation^.Groups[Loop].Attributes and SE_GROUP_ENABLED))
          and EqualSid(TokenInformation^.Groups[Loop].Sid, AdminSid) then
        begin
          Result := True;
          Break;
        end;
      end;
      FreeSid(AdminSid);
      AdminSid := nil;
    end;
  finally
    FreeSid(AdminSid);
    FreeMemory(TokenInformation);
    CloseHandle(TokenHandle);
  end;
end;
Und da ich's grad bemerkt hatte ... in meiner Unit werden jetzt an CreateProcessWithLogon auch das Arbeitsverzeichnis und die Parameterliste mit übergeben (gut daß ich da jetzt doch nochmal reingesehen hab ._.)

CheckForAdminPrivileges sorgt also dafür, daß das Programm mit Admin-Rechten gestartet wird.

Delphi-Quellcode:
If CheckForAdminPrivileges Then Begin
  // Programm gestartet
End Else Begin
  // konnte nicht mit Admin-Rechten gestartet werden,
  //
  // und/oder eine andere Instanz des Programms wurde
  // mit Admin-Rechten gestartet
End;
(ich glaub hier würde sich ein TriState-Result besser machen ... aber erstmal sehn was Nico draus macht)
Angehängte Dateien
Dateityp: zip privilegescheck_343.zip (3,1 KB, 62x aufgerufen)
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 5     123 45      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:57 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz