![]() |
lokale Benutzerrechte herausfinden
Moin,
für den Fall, dass dieses Thema bereits in einem anderem Forum diskutiert/behandelt wird, dann tausendmal sorry. Ich habe keins gefunden - ähnliche zu Hauf, aber eben nur ähnliche - bitte haut mir in dem Fall das existierene Forum um die Ohren :warn: Nun aber: Ich habe eine Routine - wie sie identisch in verschiedenen Foren diskutiert wird - um die Rechte des aktuellen Benutzers herauszufinden, bzw. ob er Admin ist oder eben nicht. Funzt auch relativ gut ... dachte ich, oder ich verstehe eben was nicht. Folgender Fall: Ein Benutzer ist unter identischem Namen und Passwort in einer Domäne und an einem Rechner bekannt. In der Domäne ist er einfach nur User, lokal Mitglied der Administratoren. Wenn sich der Benutzer am Rechner an der Domäne anmeldet, dann hat er laut meiner IsAdmin() keine Admin Rechte, was bezogen auf die Domäne stimmt aber lokal nicht. Meldet sich der Benutzer an dem Rechner lokal an, dann bringt IsAdmin() dass er Admin ist - hier stimmt alles. Ich könnte eine dirty Funktion machen, die statt auf IsAdmin() zu hören, versucht, einen HKLM read-only zu öffnen ... naja, als WorkAround evtl., lieber wäre mir, wenn ich sauber vom aktuellen Benutzer, dessen lokale Rechte ermitteln könnte. Geht das? Bin für jeden Tip dankbar :hi: Michael |
Re: lokale Benutzerrechte herausfinden
Moin Michael,
Zitat:
Ist sein Domänenaccount Mitglied der lokalen Administratorengruppe, oder nur der lokale Account? |
Re: lokale Benutzerrechte herausfinden
Zitat:
Alle Mitglieder der Domäne (Domänen-Benutzer) sind an dem Rechner in der Gruppe der Administratoren. Der Benutzer ist nochmals separat an der Maschine in der Gruppe der Administratoren. |
Re: lokale Benutzerrechte herausfinden
Wieso denn read-only? Das darf doch jeder Benutzer?? :gruebel:
Poste doch mal die Procedure... |
Re: lokale Benutzerrechte herausfinden
Zitat:
Hier die Proc:
Delphi-Quellcode:
[edit=Christian Seehase]Delphi-Tags gesetzt. Bitte künftig selber machen. Danke. Mfg, Christian Seehase[/edit]
function IsAdmin: boolean;
const SE_GROUP_MANDATORY = $00000001; SE_GROUP_ENABLED_BY_DEFAULT = $00000002; SE_GROUP_ENABLED = $00000004; SE_GROUP_OWNER = $00000008; SE_GROUP_USE_FOR_DENY_ONLY = $00000010; SE_GROUP_LOGON_ID = $C0000000; SE_GROUP_RESOURCE = $20000000; SECURITY_NT_AUTHORITY: TSIDIdentifierAuthority = (Value: (0, 0, 0, 0, 0, 5)); SECURITY_BUILTIN_DOMAIN_RID = $00000020; DOMAIN_ALIAS_RID_ADMINS = $00000220; 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 ( SE_GROUP_ENABLED = ( ptgGroups.Groups[x].Attributes and SE_GROUP_ENABLED)) and EqualSid(psidAdministrators, ptgGroups.Groups[x].Sid ) then begin Result := True; Break; end; {$R+} FreeSid(psidAdministrators); end; FreeMem(ptgGroups); end; end; |
Re: lokale Benutzerrechte herausfinden
Hallo,
Leute,Leute, Leute... Deine IsAdmin ist i.O. und meldet auch das richtige Ergebnis! Nun zu deinem Benutzer! Auch wenn der Benutzer den gleichen Name auf der Domäne und dem Lokalen Rechener hat, sind es dennoch zwei unterschiedliche Benutzer mit unterschiedlicher SID. Bei der Anmeldung mit dem Benutzername entscheidest Du dich welches Profil geladen wird Domäne -> Profil aus Domäne, lokale Profile werden ignoriert! Lokal -> Profil vom lokalen Rechner, Domäne-Profil wird ignoriert. Da Du nicht gleichzeitig an der Domäne und Lokale angemeldet seien kannst, hast Du mal nur User (Domäne-Anmeldung) oder Adim (Lokale Anmeldung) Rechte! Ein Tip: Bevor Du dich weiter mit Bentzerrechten beschäftigst, solltest Du dich erstmal mit der Rechteverwaltung unter Windows / Domänen beschäftigen, und wo die jeweiligen Profile von wem verwaltet werden! Schauiii.. Holger |
Re: lokale Benutzerrechte herausfinden
Zitat:
Bevor Du hier Dein Wissen auf Plakaten verteilst, ein Tip zurück: den Kontext nicht aus dem Blick verlieren. Michael |
Re: lokale Benutzerrechte herausfinden
Hallo,
sorry, wenn Du anscheinend deine Fragen unverständlich stelltst, kann man nur so darauf antworten: Zitat:
Zitat:
Zitat:
- Hier geht es EINDEUTIG um ZWEI Profile, einmal in der DOMAIN und einmal LOKAL! - Ob beide Profile den gleichen NAME und das gleiche PASSWORT haben ist unter Windows wurscht, es sind immmer ZWEI Benutzer mit jeweils einer eigenen SID. - Es kann sich immer nur unter EINEM PROFIL gleichzeitig angemeldet werden! - Die von Dir als Quellcode dargestellte IsAdmin, macht nicht anderes in der AKTULELLEN ANMELDUNG (SID) nach den Rechten eines Administrators zu schauen!! Lösungsmöglichkeit: Wenn Du nach einer ANMELDUNG in der DOMÄNE die Rechte der Lokalen Benutzeranmeldung erfahren willst, muss sich dein Programm zunächst nochmal als lokaler Benutzer mit dessen Passwort anmelden, dessen Profil laden und sich dann dessen Rechte aneignen, damit die Abfrage funktioniert. Dazu müssete dem PROGRAMM neben dem BENUTZERNAME noch dessen PASSWORT bekannt sein, welches aber nach der Anmeldung an der Domäne nicht mehr verfügbar ist!! Somit kann sich dein Programm nicht direkt als Lokaler Benutzer anmelden. Oder: Lösche den lokalen User und füge den Domäne-User im DC beim Rechner als Admin ein! Dann könnte es eventuell klappen, ah moment mal, soweit ich mich erinnern kann würde der User denoch nur User-Rechte haben, da Windows entzogene Rechte höher bewertet und nimmt, egal ob später noch Rechte hinzukommen! Oder so ähnlich.. So ein Mist aber ach mit der Benuzterverwaltung unter Windows!! Zur Wiederholung: Zitat:
Holger P.s. Zitat:
|
Re: lokale Benutzerrechte herausfinden
Moin Holger,
Zitat:
Zitat:
|
Re: lokale Benutzerrechte herausfinden
Durch stöbern im NET habe ich eine Funktion gefunden, die so funktioniert (auf alle Fälle bisher), wie ich es erhofft habe.
Benutzer meldet sich an einem Rechner an, Benutzer ist per Domänendefinition (sämtliche Anwender dieser Domäne) an dem Rechner Benutzer, per lokaler Definition hat er Adminrechte. Ich habe diese Funktion bei ein paar Accounts, mit unterschiedlichsten Ausprägungen, getestet und bisher funzt die Funktion. Ganz daneben kann die Funktion nicht sein, vielleicht wäre als Name statt IsAdmin eher ein IsLocalAdmin() besser? Aber das darf jeder halten, wie er will.
Delphi-Quellcode:
so long
function IsAdmin(): LongBool;
const SECURITY_NT_AUTHORITY: TSIDIdentifierAuthority = (Value: (0, 0, 0, 0, 0, 5)); 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; michael |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:27 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