Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   seltsamer Fehler mit den Admin-Rechten ... (https://www.delphipraxis.net/213720-seltsamer-fehler-mit-den-admin-rechten.html)

paule32.jk 14. Sep 2023 16:03

seltsamer Fehler mit den Admin-Rechten ...
 
Hallo

ich habe ein Problem bei der Überprüfung eines Windows-Kontos.
Dabei soll geprüft werden, ob der angemeldete Benutzer zu der Liste der Administratoren bzw.
selbst Administrator ist.
Ich verwende dazu folgenden Code:
Delphi-Quellcode:
function IsAdmin: Boolean;
const
  DOMAIN_ALIAS_RID_ADMINS = $00000220;
  SECURITY_BUILTIN_DOMAIN_RID = $00000020;
  SECURITY_NT_AUTHORITY: TSIDIdentifierAuthority = (Value: (0, 0, 0, 0, 0, 5));
var
  Admin: Boolean;
  AdmGroup: PSID;
begin
  Admin := AllocateAndInitializeSid(SECURITY_NT_AUTHORITY,
  2, SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_ADMINS,
  0, 0, 0, 0, 0, 0, AdmGroup);
  if (Admin) then
  begin
    If (not CheckTokenMembership(0, AdmGroup, Admin)) then
      Admin := False;
    FreeSid(AdmGroup);
  end;
  Result := Admin;
end;
Leider gibt es bei mir ein das Problem, das eine IF-Abfrage wohl überfordert ist:
Delphi-Quellcode:
    if not(isAdmin) then
    begin
      showmessage('1111');  // dieser Dialog wird angezeigt
      I := MessageDlg(rs_App_User_Mode,
      mtWarning,[mbYes, mbNo],0);
      if I = mrNo then
      begin
      showmessage('ooooo'); // dieser Dialog wird nicht angezeigt
        FreeBDESetup;
        Form1.Close;

        SplashForm.ProgressBar1.Position := 70;
        SplashForm.isExit := true;
        SplashForm.isMemE := true;
        SplashForm.Close;
      end;
    end;
showmessage('uuuu'); // hier wird kein Dialog angezeigt.
mach da was falsch?

himitsu 14. Sep 2023 17:43

AW: seltsamer Fehler mit den Admin-Rechten ...
 
Man prüft nicht auf Admin, sondern auf das Recht, was man benötigt.

Es ist vollkommen egal, ob der aktuelle Nutzer ein Administrator ist.
* er kann dennoch das nötige Recht nicht besitzen (ja, man kann einem/allen Admin sämtliche Rechte entziehen, so dass er am Ende weniger darf, als ein popeliger User)
* und selbst wenn er das Recht hätte, muß es nicht sein, dass er es auch "jetzt" aktiv hat (zu Recht werden Admins standardmäßig nicht mit allen Rechen eingeloggt -> UAC-Restrictions)


Du weißt was ein Debugger ist?


Zitat:

Delphi-Quellcode:
if I = mrNo then

Jemand drückt aber nicht zufällig auf [X] oder nutzt [ESC] ?

mrCancel (oder war's mrAbort)


Zitat:

Delphi-Quellcode:
        SplashForm.Close;
      end;
    end;
showmessage('uuuu'); // hier wird kein Dialog angezeigt.

Vor dem .Close noch ein .Hide oder besser gleich direkt ein .Free.

Close schließ nicht sofort,
somit ist beim ShowMessage die Form1+SlashForm noch da, wird kurz danach geschlossen.
VCL-Dialoge hängen sich an die ActiveForm (deine Form1 bzw. SplashForm) und wird diese freigegeben/geschlossen, dann gehen sie ebenfalls sofort wieder zu.
Also .... dein Dialog wird (bestimmt) angezeigt, für paar Millisekunden. :angle2:
[edit] Gehen die Forms auch so zu, selbst wenn "diese" Close nicht ausgeführt werden? [/edit]

paule32.jk 14. Sep 2023 18:20

AW: seltsamer Fehler mit den Admin-Rechten ...
 
Zitat:

Zitat von himitsu (Beitrag 1526956)
Also .... dein Dialog wird (bestimmt) angezeigt, für paar Millisekunden. :angle2:
[edit] Gehen die Forms auch so zu, selbst wenn "diese" Close nicht ausgeführt werden? [/edit]

ja, genau.
Dann war noch eine Objektleiche enthalten, die ich zwar gelöscht, aber noch im DFM auffindbar war - ich
weiß jetzt nicht, warum Delphi sowas nicht von selbst lösen kann, falls man ein private Object löscht.
- wird doch auch fast alles gelöscht, wenn man das Objekt von der TForm lößt.

Mit etlichen Beeps läuft die alte D7 Anwendung wieder.
- gibt wieder Paar Tage, das alles zu beheben ...

himitsu 14. Sep 2023 19:48

AW: seltsamer Fehler mit den Admin-Rechten ...
 
Genau andersrum.
In der Form gelöscht, wird die gleichnamige Variable mit entfernt.

Und es muß keine Variable für ein Objekt geben.
Gibt es eine Published-Variable im Owner, dann wird beim Erstellen jene Variable gesetzt und beim Freigeben auf NIL gesetzt. (das machen alle TComponent-Nachfahren)


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:26 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