Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi lokale Benutzerrechte herausfinden (https://www.delphipraxis.net/82889-lokale-benutzerrechte-herausfinden.html)

mbeilharz 21. Dez 2006 13:47


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

Christian Seehase 21. Dez 2006 14:06

Re: lokale Benutzerrechte herausfinden
 
Moin Michael,

Zitat:

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?

mbeilharz 21. Dez 2006 14:16

Re: lokale Benutzerrechte herausfinden
 
Zitat:

Zitat von Christian Seehase
Moin Michael,

Zitat:

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.

BBG 21. Dez 2006 15:16

Re: lokale Benutzerrechte herausfinden
 
Wieso denn read-only? Das darf doch jeder Benutzer?? :gruebel:
Poste doch mal die Procedure...

mbeilharz 21. Dez 2006 15:36

Re: lokale Benutzerrechte herausfinden
 
Zitat:

Zitat von BBG
Wieso denn read-only? Das darf doch jeder Benutzer?? :gruebel:
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]

HolgerX 26. Dez 2006 21:23

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

mbeilharz 27. Dez 2006 08:32

Re: lokale Benutzerrechte herausfinden
 
Zitat:

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

HolgerX 30. Dez 2006 07:14

Re: lokale Benutzerrechte herausfinden
 
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!!!!

Christian Seehase 30. Dez 2006 13:58

Re: lokale Benutzerrechte herausfinden
 
Moin Holger,

Zitat:

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:

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.


mbeilharz 2. Jan 2007 16:00

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


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:27 Uhr.
Seite 1 von 2  1 2      

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