![]() |
Abfragen ob Process Adminrechte hat?
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. |
Re: Abfragen ob Process Adminrechte hat?
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.
|
Re: Abfragen ob Process Adminrechte hat?
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. |
Re: Abfragen ob Process Adminrechte hat?
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 ![]() Eine Lösung in Delphi kann ich auf die Schnelle nicht anbieten. |
Re: Abfragen ob Process Adminrechte hat?
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 :shock:
|
Re: Abfragen ob Process Adminrechte hat?
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.
|
Re: Abfragen ob Process Adminrechte hat?
Zitat:
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. |
Re: Abfragen ob Process Adminrechte hat?
Your personal bugfix ;)
vorher:
Delphi-Quellcode:
nacher:
if EqualSid(psidAdministrators, ptgGroups.Groups[x].Sid) then
Delphi-Quellcode:
Man muss zusätzlich überprüfen, ob die Gruppe überhaupt für Sicherheitsabfragen relevant ist.
if (SE_GROUP_ENABLED = (ptgGroups.Groups[x].Attributes and SE_GROUP_ENABLED)) and
EqualSid(psidAdministrators, ptgGroups.Groups[x].Sid) then (SE_GROUP_ENABLED = 4) |
Re: Abfragen ob Process Adminrechte hat?
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. |
Re: Abfragen ob Process Adminrechte hat?
Zitat:
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:
Wenn man Windows 2000 voraussetzen kann, dann beschränkt sich die 'korrekte' Abfrage auf:
function IsUserAdmin: BOOL;
begin Result := SHTestTokenMembership(THandle(nil), DOMAIN_ALIAS_RID_ADMINS); end;
Delphi-Quellcode:
Wenn man allerdings Windows NT 4.0 unterstützen muss, dann wird's aufwendig (InitializeSecurityDescriptor, SetSecurityDescriptorOwner, SetSecurityDescriptorGroup, InitializeAcl, AddAccessAllowedAce, SetSecurityDescriptorDacl, AccessCheck).
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; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:44 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