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 22. Aug 2015
Antwort Antwort
Seite 1 von 5  1 23     Letzte »    
Benutzerbild von Orbmu2k
Orbmu2k

Registriert seit: 29. Nov 2004
Ort: Erfurt
254 Beiträge
 
Turbo Delphi für Win32
 
#1

Abfragen ob Process Adminrechte hat?

  Alt 27. Apr 2006, 12:32
Hallo,

Ich habe ein Problem unter Vista ... dort ist man zwar als lokaler Admin eingeloggt
allerdings werden Programme nur mit Benutzerrechten gestartet.

Da ich Funktionen nutze die Administrator Rechte benötigen hatte ich bisher
immer zur Sicherheit abgefragt ob der angemeldete Benutzer Admin Rechte hat.
Nun liefert die Abfrage True aber das Programm selbst hat gar keine Adminrechte.

Kann man nun irgendwie "sicher" abfragen ob das Programm selbst mit "Administrator Rechten" ausgeführt wird ?

Vielen Dank im Vorraus.
  Mit Zitat antworten Zitat
Olli
(Gast)

n/a Beiträge
 
#2

Re: Abfragen ob Process Adminrechte hat?

  Alt 21. Mai 2006, 16:40
Kannst du mir mal dein Testprogramm zuschicken (zB per PN). Ich werde mir mal die Vista Preview installieren, welche ich mir bei MSDN runtergeladen habe. Das Problem klingt nämlich interessant.
  Mit Zitat antworten Zitat
Benutzerbild von Orbmu2k
Orbmu2k

Registriert seit: 29. Nov 2004
Ort: Erfurt
254 Beiträge
 
Turbo Delphi für Win32
 
#3

Re: Abfragen ob Process Adminrechte hat?

  Alt 7. Jun 2006, 09:27
Hallo Olli,

mit einer Antwort hatte ich gar nich mehr gerechnet

Also ich verwende bisher folgenden Code zum ermitteln ob der aktuelle Benutzer Administrator Rechte hat:

Delphi-Quellcode:
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;

Diese Funktion liefert auf allen neueren Vista Versionen mit UAP natürlich "True" da der angemeldete Benutzer Administrator Rechte hat.

Was ich noch herausgefunden habe ist das MS es wohl über einen Manifest Eintrag steuert ob das Programm Administrator Rechte benötigt und den Benutzer speziell dann darauf hinweist.

Mein Programm kann aber auch unter eingeschränkten Rechten problemlos laufen, wenn ich diese Funktionen in dem Fall nicht durchführe. Deswegen würde ich nun gerne abfragen können welche Rechte das Programm hat und nicht welche Rechte der angemeldete Benutzer hat.
  Mit Zitat antworten Zitat
NicoDE
(Gast)

n/a Beiträge
 
#4

Re: Abfragen ob Process Adminrechte hat?

  Alt 7. Jun 2006, 09:44
Das Problem ist, dass es nun zwei Sicherheits-Token gibt.
(eines mit allen Rechten und ein 'beschnittenes' mit dem fast alle normalen Programme laufen)

Siehe http://www.microsoft.com/germany/tec...1f5c6c2d9.mspx

Eine Lösung in Delphi kann ich auf die Schnelle nicht anbieten.
  Mit Zitat antworten Zitat
Benutzerbild von Orbmu2k
Orbmu2k

Registriert seit: 29. Nov 2004
Ort: Erfurt
254 Beiträge
 
Turbo Delphi für Win32
 
#5

Re: Abfragen ob Process Adminrechte hat?

  Alt 7. Jun 2006, 10:13
Also wenn ich das richtig verstanden habe ist per default das niedrigste Privileg gültig für Programme aber die Frage ist was passiert mit dem Privileg wenn man "Run as Administrator" zum starten des Programms verwendet ... also irgendwie ist das ganz schön komplex
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#6

Re: Abfragen ob Process Adminrechte hat?

  Alt 7. Jun 2006, 10:28
Ein Dirty-Methode wäre es zu versuchen, in den Systemteil der Registry zu schreiben (oder nich read-only zu öffnen). Wenns funktioniert: Programm hat Adminrechte, wenn nicht User-Rechte.
Markus Kinzler
  Mit Zitat antworten Zitat
NicoDE
(Gast)

n/a Beiträge
 
#7

Re: Abfragen ob Process Adminrechte hat?

  Alt 7. Jun 2006, 11:10
Zitat von mkinzler:
Ein Dirty-Methode wäre es zu versuchen, in den Systemteil der Registry zu schreiben (oder nich read-only zu öffnen). Wenns funktioniert: Programm hat Adminrechte, wenn nicht User-Rechte.
Nunja, eine 'saubere' Lösung würde eher darin bestehen, die Aussagen anders zu interpretieren...

Die Aussage von IsAdmin() ist immer noch korrekt (Mitglied der lokalen Gruppe der Administratoren).
Allerdings ist bisherige Interpretation (lokaler Admin = alle Rechte) nicht zutreffend. Diese Interpretation wahr schon immer falsch (wenn auch hinreichend genau für die meisten Fälle). Allerdings tritt das Problem nun 'dank' Vista auf einem Standardsystem offen zu tage.
  Mit Zitat antworten Zitat
NicoDE
(Gast)

n/a Beiträge
 
#8

Re: Abfragen ob Process Adminrechte hat?

  Alt 7. Jun 2006, 15:47
Your personal bugfix

vorher:if EqualSid(psidAdministrators, ptgGroups.Groups[x].Sid) then nacher:
Delphi-Quellcode:
if (SE_GROUP_ENABLED = (ptgGroups.Groups[x].Attributes and SE_GROUP_ENABLED)) and
  EqualSid(psidAdministrators, ptgGroups.Groups[x].Sid) then
Man muss zusätzlich überprüfen, ob die Gruppe überhaupt für Sicherheitsabfragen relevant ist.
(SE_GROUP_ENABLED = 4)
  Mit Zitat antworten Zitat
Benutzerbild von Orbmu2k
Orbmu2k

Registriert seit: 29. Nov 2004
Ort: Erfurt
254 Beiträge
 
Turbo Delphi für Win32
 
#9

Re: Abfragen ob Process Adminrechte hat?

  Alt 7. Jun 2006, 19:34
Hey super, das ging ja fix danke

Nun hab ich grad kein Vista zur Hand ... aber ich werd das ausprobieren sobald MS die neue Public Beta 2 released hat.

Ich hab grad mal nach dem SE_GROUP_ENABLED Flag im MSDN nachgeschlagen das gibt es ja schon seit es NT gibt ... dann brauch ich mir ja keine Sorgen machen das die Abfrage dann auf "älteren" Windows Versionen falsche Ergebnisse liefert.
  Mit Zitat antworten Zitat
NicoDE
(Gast)

n/a Beiträge
 
#10

Re: Abfragen ob Process Adminrechte hat?

  Alt 7. Jun 2006, 19:50
Zitat von Orbmu2k:
Ich hab grad mal nach dem SE_GROUP_ENABLED Flag im MSDN nachgeschlagen das gibt es ja schon seit es NT gibt ... dann brauch ich mir ja keine Sorgen machen das die Abfrage dann auf "älteren" Windows Versionen falsche Ergebnisse liefert.
Wegen der Abwärtskompatibilität brauchst du dir keine Sorgen machen

Die Überprüfung ist immer noch 'vereinfacht' (normalerweise müsste man mit der SID einen SD erstellen und mittels AccessCheck gegen das Token prüfen).

Wenn man Windows XP voraussetzen kann, dann beschränkt sich die 'korrekte' Abfrage auf:
Delphi-Quellcode:
function IsUserAdmin: BOOL;
begin
  Result := SHTestTokenMembership(THandle(nil), DOMAIN_ALIAS_RID_ADMINS);
end;
Wenn man Windows 2000 voraussetzen kann, dann beschränkt sich die 'korrekte' Abfrage auf:
Delphi-Quellcode:
function IsUserAdmin: BOOL;
var
  SidToCheck: PSID;
begin
  Result := AllocateAndInitializeSid(SECURITY_NT_AUTHORITY, 2,
    SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_ADMINS,
    0, 0, 0, 0, 0, 0, SidToCheck);
  if Result then
  begin
    if not CheckTokenMembership(THandle(nil), SidToCheck, Result) then
      Result := False;
    FreeSid(SidToCheck);
  end;
end;
Wenn man allerdings Windows NT 4.0 unterstützen muss, dann wird's aufwendig (InitializeSecurityDescriptor, SetSecurityDescriptorOwner, SetSecurityDescriptorGroup, InitializeAcl, AddAccessAllowedAce, SetSecurityDescriptorDacl, AccessCheck).
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 5  1 23     Letzte »    


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 09:23 Uhr.
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