Delphi-PRAXiS
Seite 3 von 5     123 45      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Abfragen ob Process Adminrechte hat? (https://www.delphipraxis.net/68281-abfragen-ob-process-adminrechte-hat.html)

himitsu 25. Aug 2006 14:17

Re: Abfragen ob Process Adminrechte hat?
 
Liste der Anhänge anzeigen (Anzahl: 1)
@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 :roll:
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.

Luckie 25. Aug 2006 14:20

Re: Abfragen ob Process Adminrechte hat?
 
Ich hätte die Funktion IsAdmin oder IsRunningUnderAdminPrivileges genannt.

himitsu 25. Aug 2006 14:28

Re: Abfragen ob Process Adminrechte hat?
 
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?

NicoDE 25. Aug 2006 15:00

Re: Abfragen ob Process Adminrechte hat?
 
Zitat:

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).

himitsu 25. Aug 2006 15:18

Re: Abfragen ob Process Adminrechte hat?
 
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 ._.

himitsu 29. Aug 2006 13:13

Re: Abfragen ob Process Adminrechte hat?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hab meine integrierte Version nochmal auf deine zurückgeführt, :angel:
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 :oops: ... aber erstmal sehn was Nico draus macht)

Eiswuxe 12. Dez 2006 12:54

Re: Abfragen ob Process Adminrechte hat?
 
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 :(

NicoDE 12. Dez 2006 13:07

Re: Abfragen ob Process Adminrechte hat?
 
Zitat:

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?

Eiswuxe 12. Dez 2006 14:24

Re: Abfragen ob Process Adminrechte hat?
 
Sorry, da hab ich mich verguckt, stimmt. Leider funktioniert das bei mir trotzdem nicht :(

NicoDE 12. Dez 2006 14:31

Re: Abfragen ob Process Adminrechte hat?
 
Zitat:

Zitat von Eiswuxe
Leider funktioniert das bei mir trotzdem nicht :(

Welche Delphi-Version?
Quelltext?
Was genau geht nicht?


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:08 Uhr.
Seite 3 von 5     123 45      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz