Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Userrechte in einer Domain auslesen (https://www.delphipraxis.net/96216-userrechte-einer-domain-auslesen.html)

gargano 20. Jul 2007 09:38


Userrechte in einer Domain auslesen
 
Hallo,

vielleicht gibt es dieses Thema schon an anderer Stelle, ich habe lange gesucht, aber nichts Passendes gefunden.

Folgendes Problem :

In meinem Programm habe ich eine eigene Anmeldung mit eigener Rechteverwaltung.
Dies ist keine Windowsverwaltung, sondern darin wird definiert ob einer eine Aktion durchführen darf oder nicht.

Nun möchte ich die Domain User verwenden um die Rechte zu indentifizieren :
Also : User1 hat in der Domain Administratorrechte, User2 nur Userrechte.

Wie man die User in eine Doamin findet und wie man eine SID in Klartext umwandelt habe ich schon gefunden.

Was noch fehlt ist die Funktion wie man die Rechte eines User in der Domain findet .

ähnlich wie : function GetUserRights (Domain,User:String):String;
also GetUserRights ('','User1') und hearuskommt 'Administrator'.

Wobei bei leerem Domainstring die aktuelle Domain verwendet werden soll.

Hat sowas jemand schon gemacht ? :gruebel:

Gruß
gargano

Dezipaitor 20. Jul 2007 11:19

Re: Userrechte in einer Domain auslesen
 
Willst du nur wissen, ob der Benutzer (Domain) Administrator ist?

Oder willst du wissen, ob der Benutzer auf bestimmte Ressourcen (Datei, usw) zugriff hat?

gargano 20. Jul 2007 11:41

Re: Userrechte in einer Domain auslesen
 
Ich möchte nur wissen ob der Benutzer ein Administrator, User mit bestimmten Rechten oder in sonst einer Gruppe ist.
Die Sache ist die, daß der Benutzer meines Programms aber nicht der angemeldete User sein muß.

Z.B. Frau Huber hat sich ins System eingeloggt, Frau Mayer will das Programm benutzen und dazu muß ich in der Domain überprüfen welche Rechte (Admin,User...) Frau Mayer hat.

Gruß
gargano

Dezipaitor 20. Jul 2007 12:34

Re: Userrechte in einer Domain auslesen
 
Also du willst nur wissen, zu welcher Domain-Gruppe ein Benutzer gehört, der sich bei dir anmeldet?
Dann nimm NetUserGetGroups. Dabei nicht vergessen, dass die Gruppennamen ausgeschrieben sind und auf anderssprachigen Systemen auch anders heißen können.

Oder willst du auch Privilegien der Benutzer wissen?

Um Zugriffsrechte an Dateien usw. festzustellen brauchst du immer ein Token, (vereinfacht )eine ACL und einen Zugrifftyp (AccessMask).
Um das Token zu bekommen must du den Prozess (Thread) personifizieren, d.h. du meldest den Benutzer kurzzeitig am System an, um den Zugriff zu testen.

gargano 20. Jul 2007 13:37

Re: Userrechte in einer Domain auslesen
 
Danke für den Tip,

entschuldige bitte meine unverschämte Frage : Du hast nicht zufällig ein Beispiel für NetUserGetGroups in Delphi zur Hand ?

Gruß
gargano

Dezipaitor 20. Jul 2007 13:45

Re: Userrechte in einer Domain auslesen
 
Hab ich nicht.
Jedoch das Internet stellt sogar mehrere zur Verfügung :

http://www.delphipages.com/threads/t...=19807&G=19804

und schau dir auch das an:
http://entwickler-forum.de/showthread.php?t=37120

gargano 20. Jul 2007 17:16

Re: Userrechte in einer Domain auslesen
 
Danke, das dachte ich mir das in der Art gehen könnte.

Gehen könnte, dachte ich.
Leider bringt mir die Funktion immer den Code für 'User not found' wenn ich den Domain Namen leer lass. Wenn im Domain was drin steht, dann dauert es etwas länger und er bringt 'Domain not found'.

Der Name ist richtig als PWideChar eingetragen.

Hast Du ein Idee an was das liegen kann ? :wall: :pale: :?: :coder2:

Gruß
gargano

Christian Seehase 20. Jul 2007 17:30

Re: Userrechte in einer Domain auslesen
 
Moin Gargano,

zeig' doch mal, wie Du die Funktion benutzt.
Erfahrungsgemäss sind die NetXXX-Funktionen manchmal etwas tricky in der Anwendung.

gargano 23. Jul 2007 12:00

Re: Userrechte in einer Domain auslesen
 
Hallo Chris,
manchmal liegt die Lösung doch näher als erwartet. Ich habe anstatt des Domains den Domainnamen verwendet.
Mit NetGetDCName(nil,pointer(DomainName),pointer(Domai n)); bekommt man die Domain heraus.

Für die, die es interessiert hier der ganze Code :

Delphi-Quellcode:
Function NetUserGetGroups(ServerName, UserName : lpWStr; Level : DWord; Var Buffer : Pointer; PrefMaxLen : DWord; EntriesRead, TotalEntries : lpDWord) : LongInt; stdcall; External 'NETAPI32.DLL';

procedure TForm1.Button3Click(Sender: TObject);
Type
USER_INFO_0 = Record
 Group_Name : PWideChar;
End;
    TBuffer = array[0..1024] of Pointer;

var
    Level : DWORD;
    PrefMaxLen :DWORD;
    PAdr : DWord;
    PBuffer : ^TBuffer;
    Buffer:TBuffer;
    entriesRead, totalEntries : DWORD;
    ResultNetApiStatus :NetAPIStatus;
    TheUser:Array[0..255] Of WideChar;
    User_Info_0_Struct : USER_INFO_0;
    i:Integer;
    domain,DomainName : PWideChar;
begin
     Level:=0;
     PrefMaxLen:= 1024 ;
     StringToWideChar(DomainNameEdit.text,@DomainName,255);

//get Domain Controller
     NetGetDCName(nil,pointer(DomainName),pointer(Domain));        
 
     DomainEdit.Text:=WideCharToString(domain); // nur zur Ansicht

     StringToWideChar(UserEdit.text,@TheUser,255);
     UserGroupMemo.Clear;

     ResultNetApiStatus:=NetUserGetGroups (domain,@TheUser, level, pointer(Pbuffer) , PrefMaxLen, @entriesRead, @totalEntries);

     If ResultNetApiStatus = 0 Then Begin
        For I := 0 To EntriesRead - 1 Do begin
            User_Info_0_Struct := USER_INFO_0(PBuffer[i]);
            UserGroupMemo.Lines.Add(WideCharToString(User_Info_0_Struct.Group_Name));
        end;
        if (Domain <> nil) then NetApiBufferFree(Domain);
        if (pBuffer <> nil) then NetApiBufferFree(pBuffer);
 End;
End;
[edit=Luckie]Delphi-Tags. Mfg, Luckie[/edit]


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:37 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