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?

Abfragen ob Process Adminrechte hat?

Ein Thema von Orbmu2k · begonnen am 27. Apr 2006 · letzter Beitrag vom 22. Aug 2015
Antwort Antwort
Seite 3 von 5     123 45   
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
40.494 Beiträge
 
Delphi 11 Alexandria
 
#21

Re: Abfragen ob Process Adminrechte hat?

  Alt 25. Aug 2006, 15: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)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie
(Moderator)

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

Re: Abfragen ob Process Adminrechte hat?

  Alt 25. Aug 2006, 15: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
40.494 Beiträge
 
Delphi 11 Alexandria
 
#23

Re: Abfragen ob Process Adminrechte hat?

  Alt 25. Aug 2006, 15: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?
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list
  Mit Zitat antworten Zitat
NicoDE
(Gast)

n/a Beiträge
 
#24

Re: Abfragen ob Process Adminrechte hat?

  Alt 25. Aug 2006, 16: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
40.494 Beiträge
 
Delphi 11 Alexandria
 
#25

Re: Abfragen ob Process Adminrechte hat?

  Alt 25. Aug 2006, 16: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 ._.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
40.494 Beiträge
 
Delphi 11 Alexandria
 
#26

Re: Abfragen ob Process Adminrechte hat?

  Alt 29. Aug 2006, 14: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, 61x aufgerufen)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list
  Mit Zitat antworten Zitat
Eiswuxe

Registriert seit: 2. Nov 2006
7 Beiträge
 
#27

Re: Abfragen ob Process Adminrechte hat?

  Alt 12. Dez 2006, 13:54
Ich stehe gerade vor dem gleichen Problem, rauszufinden, mit welchen Rechten der Prozess jetzt "tatsächlich" läuft. Alle hier vorgestellten Methoden funktionieren leider nicht, auch nicht die Win2K Variante. Der Rückgabewert von CheckTokenMembership ist dann true, wenn der Check funktioniert hat. NICHT, wenn die Bedingung zutrifft. Man muss dafür als 3. Parameter einen Bool Wert übergeben und diesen Auswerten. Mit der aktuellen Methode liefert bei mir der Check nämlich auch bei einem eingeschränkten Benutzerkonto "true" zurück, was aber falsch ist
  Mit Zitat antworten Zitat
NicoDE
(Gast)

n/a Beiträge
 
#28

Re: Abfragen ob Process Adminrechte hat?

  Alt 12. Dez 2006, 14:07
Zitat von Eiswuxe:
Man muss dafür als 3. Parameter einen Bool Wert übergeben und diesen Auswerten.
Das wird doch im Beispiel gemacht. Wo ist das Problem?
  Mit Zitat antworten Zitat
Eiswuxe

Registriert seit: 2. Nov 2006
7 Beiträge
 
#29

Re: Abfragen ob Process Adminrechte hat?

  Alt 12. Dez 2006, 15:24
Sorry, da hab ich mich verguckt, stimmt. Leider funktioniert das bei mir trotzdem nicht
  Mit Zitat antworten Zitat
NicoDE
(Gast)

n/a Beiträge
 
#30

Re: Abfragen ob Process Adminrechte hat?

  Alt 12. Dez 2006, 15:31
Zitat von Eiswuxe:
Leider funktioniert das bei mir trotzdem nicht
Welche Delphi-Version?
Quelltext?
Was genau geht nicht?
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 00:41 Uhr.
Powered by vBulletin® Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf