AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi lokale Benutzerrechte herausfinden
Thema durchsuchen
Ansicht
Themen-Optionen

lokale Benutzerrechte herausfinden

Ein Thema von mbeilharz · begonnen am 21. Dez 2006 · letzter Beitrag vom 26. Nov 2010
Antwort Antwort
Seite 1 von 2  1 2      
mbeilharz

Registriert seit: 12. Mai 2006
18 Beiträge
 
#1

lokale Benutzerrechte herausfinden

  Alt 21. Dez 2006, 13:47
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

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

Michael
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: lokale Benutzerrechte herausfinden

  Alt 21. Dez 2006, 14:06
Moin Michael,

Zitat von mbeilharz:
...was bezogen auf die Domäne stimmt aber lokal nicht.
sicher?
Ist sein Domänenaccount Mitglied der lokalen Administratorengruppe, oder nur der lokale Account?
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
mbeilharz

Registriert seit: 12. Mai 2006
18 Beiträge
 
#3

Re: lokale Benutzerrechte herausfinden

  Alt 21. Dez 2006, 14:16
Zitat von Christian Seehase:
Moin Michael,

Zitat von mbeilharz:
...was bezogen auf die Domäne stimmt aber lokal nicht.
sicher?
Ist sein Domänenaccount Mitglied der lokalen Administratorengruppe, oder nur der lokale Account?
Hallo Christian,

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.
  Mit Zitat antworten Zitat
BBG
(Gast)

n/a Beiträge
 
#4

Re: lokale Benutzerrechte herausfinden

  Alt 21. Dez 2006, 15:16
Wieso denn read-only? Das darf doch jeder Benutzer??
Poste doch mal die Procedure...
  Mit Zitat antworten Zitat
mbeilharz

Registriert seit: 12. Mai 2006
18 Beiträge
 
#5

Re: lokale Benutzerrechte herausfinden

  Alt 21. Dez 2006, 15:36
Zitat von BBG:
Wieso denn read-only? Das darf doch jeder Benutzer??
Poste doch mal die Procedure...
Hast ja recht, ich meinte es eher symbolisch (war leider nicht erkennbar), ich versuche also einen HKLM Eintrag zu erstellen.

Hier die Proc:

Delphi-Quellcode:
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;
[edit=Christian Seehase]Delphi-Tags gesetzt. Bitte künftig selber machen. Danke. Mfg, Christian Seehase[/edit]
  Mit Zitat antworten Zitat
HolgerX

Registriert seit: 10. Apr 2006
Ort: Leverkusen
961 Beiträge
 
Delphi 6 Professional
 
#6

Re: lokale Benutzerrechte herausfinden

  Alt 26. Dez 2006, 21:23
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
  Mit Zitat antworten Zitat
mbeilharz

Registriert seit: 12. Mai 2006
18 Beiträge
 
#7

Re: lokale Benutzerrechte herausfinden

  Alt 27. Dez 2006, 08:32
Zitat von HolgerX:
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
Das unterschiedliche Profile verwendet werden, war und ist hier sicherlich jedem klar ... daher auch der Titel dieses Threads: "lokale Benutzerrechte herausfinden". Ich habe keinen MS-UAC-CE hinlegen wollen, um die aktuellen LOKALEN Rechte per SystemCalls oder API herauszufinden.

Bevor Du hier Dein Wissen auf Plakaten verteilst, ein Tip zurück: den Kontext nicht aus dem Blick verlieren.


Michael
  Mit Zitat antworten Zitat
HolgerX

Registriert seit: 10. Apr 2006
Ort: Leverkusen
961 Beiträge
 
Delphi 6 Professional
 
#8

Re: lokale Benutzerrechte herausfinden

  Alt 30. Dez 2006, 07:14
Hallo,

sorry, wenn Du anscheinend deine Fragen unverständlich stelltst, kann man nur so darauf antworten:

Zitat:
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.
Zitat:
Das unterschiedliche Profile verwendet werden, war und ist hier sicherlich jedem klar ...
Richtig, was ich in meiner Mail ja nur nochmals darlegte, genauso, wie deine Probleme!

Zitat:
daher auch der Titel dieses Threads: "lokale Benutzerrechte herausfinden". Ich habe keinen MS-UAC-CE hinlegen wollen, um die aktuellen LOKALEN Rechte per SystemCalls oder API herauszufinden.
Tja Dir scheint der Unterschied zwischen LOKALEN und DOMÄNE-Rechten ja anscheinend nicht ganz klar zu sein.

- 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:
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.
Schauiii....

Holger

P.s.
Zitat:
Bevor Du hier Dein Wissen auf Plakaten verteilst, ein Tip zurück: den Kontext nicht aus dem Blick verlieren.
.. gebe ich an Dich zurück!!!!
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#9

Re: lokale Benutzerrechte herausfinden

  Alt 30. Dez 2006, 13:58
Moin Holger,

Zitat von HolgerX:
Die von Dir als Quellcode dargestellte IsAdmin, macht nicht anderes in der AKTULELLEN
ANMELDUNG (SID) nach den Rechten eines Administrators zu schauen!!
Zitat von mbeilharz:
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.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
mbeilharz

Registriert seit: 12. Mai 2006
18 Beiträge
 
#10

Re: lokale Benutzerrechte herausfinden

  Alt 2. Jan 2007, 16:00
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:
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;
so long
michael
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 22:48 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