![]() |
Domain Name auslesen
Hallo Chris
Danke für den Hinweis. Habe nicht sofort verstanden, was Du mit einem Thread meinst! Aber ich denke, dass ich dafür ein neues Thema öffnen soll. (na ja immer diese Neulinge.... :) ) Als hier nochmals die Frage Ich suche nach einer Möglichkeit, um die Windows-Domain-User auszulesen. Ich habe zwar die Funktionen für das auslesen der lokalen User gefunden (NetQueryDisplayInformation). Damit sollte man auch die Domain-User auslesen können. Nun fehlt mir aber eine Möglichkeit, wie man den Domain-Name auslesen kann. Kann Du mir da weiter helfen? Gruss Xaver |
Moin Xaver,
ich hab' mal ein kleines Beispiel erstellt:
Delphi-Quellcode:
Anhand des Usernamens kann man ja nicht auf die Domain schliessen, da ja ein Name in mehreren Domänen vorhanden sein kann.
var
pwuiWork : PWKSTA_USER_INFO_1; begin if NetWkstaUserGetInfo(nil,1,@pwuiWork) = NErr_Success then begin try ShowMessage( WideCharToString(pwuiWork.wkui1_logon_domain)+'\'+ WideCharToString(pwuiWork.wkui1_username) ); finally NetApiBufferFree(pwuiWork); end; end; end; Dieses Beispiel gibt nur die Domäne und den Usernamen des gerade angemeldeten Users zurück. Bliebe noch zu erwähnen, dass diese Funktion im Kontext des angemeldeten Users aufgerufen werden muss. Ein Aufruf aus einem Programm heraus, dass im Kontext eines anderen Users läuft (z.B. über SU Dienst gestartet) könnte falsche Werte zurückliefern (ich hab's noch nicht ausprobiert) |
Domain name
Hallo Chris
Danke für Deine Hilfe! Sieht gut aus. Ich denke damit sollte ich mein Problem lösen können. :dancer: Gruss Xaver |
Domain-Name auslesen
Hallo Chris
Die Funktion NetWkstaUserGetInfo funktioniert zwar korrekt, gibt mir aber den Domain-Servername und nicht den Domain-Name zurück. Das würde für das Auslesen der User reichen, was ich in der Zwischenzeit auch mache. Das Problem ist jedoch, dass ich den Domain-Name ebenfalls benötige. Das ganze hängt mit dem SQL-Server zusammen, in dem man für die NT-Authentifizierung den Domain-Name angeben muss. Also habe ich jetzt zwar die Users muss denen aber den Domain-Name manuel davor setzen, was nicht gerade elegant ist. Ich habe es auch schon mit der Funktion LookupAccountSid versucht. Mit der bekomme ich den Stations-Name, auf der ich das Programm ausführe. Geht also auch nicht richtig. Mit NetServerEnum kann ich ebenfalls den Server-Name auslesen. Ich kann sogar einschränken, dass nur die Server mit SQL-Server zurückgegeben werden. Das nützt natürlich nicht allzuviel, da der SQL-Server nicht zwingend ein PDC sein muss. Hast Du noch eine Idee, die mir beim Suchen weiter hilft? :duck: Gruss Xaver |
Moin Xaver,
irgendwie hab' ich jetzt ein kleines Verständnisproblem... Die Struktur WKSTA_USER_INFO1 habe ich, folgendermassen aus der Header Datei übersetzt:
Delphi-Quellcode:
Hierbei ist wkui1_username der Accountname des Users, wkui1_logon_domain, die Domäne, an der der User angemeldet ist, wkui1_oth_domains eine mit Blanks getrennte Domänen Liste, und wkui1_logon_server der Server, der den User authentifiziert hat.
PWKSTA_USER_INFO_1 = ^WKSTA_USER_INFO_1;
WKSTA_USER_INFO_1 = packed record wkui1_username : PWChar; wkui1_logon_domain : PWChar; wkui1_oth_domains : PWChar; wkui1_logon_server : PWChar; end; Somit müsste der Member wkui1_logon_domain genau das sein, was Du brauchst, ausser natürlich
Könntest Du das bitte nochmal überprüfen? Bislang haben die Net Funktionen eigentlich keinerlei Probleme gemacht. Oder hab' ich jetzt nicht ganz verstanden, was Du vorhast? |
Hallo Chris
Ich habe es genau so implementiert, wie Du das aufgeführt hast. Habe dazu auch noch die h-Files vom Lanmanager herunter geholt ( ![]() Ich habe hier leider ebenfalls keine Domäne und kann das jeweils nur im Büro prüfen. Da das Projekt momentan noch nicht so dringend ist, entwickle ich das ganze zuhause und sehe dann am nächsten Tag, ob das funktioniert hat, was ich so gemacht habe. Gruss Xaver |
Moin Xaver,
nur zum Verständnis: Melden sich die User jetzt an der Domäne an oder nicht? |
Hallo Chris
Sie melden sich nicht an der Domain an. Alle Rechner sind als Mitglied der Arbeitsgruppe definiert, wobei der Arbeitsgruppen-Name gleich wie der Domain-Name ist, z.B. Domain-Name: VIDDOMAIN; Im Feld Mitgied von Arbeitsgruppe (Netzwerkeinstellungen) steht ebenfalls VIDDOMAIN. Also erfolgt die Anmeldung so wie ich das sehe, lokal. Gruss Xaver |
Hallo Chirs
Ich glaube ich habs gefunden, wie die Microsoftis das mit dem Domain-Name im SQL-Server Enterprise Manager machen. Die Lesen es nicht aus dem Netzwerk heraus, sondern haben eine Stored Procedure im SQL-Server definiert, mit welcher sie den Domain des Servers abfragen. Dadurch entfällt natürlich das Problem der lokalen Anmeldung. Ist ja eigentlich logisch, dass in Falle eines SQL-Zugriffs nicht die Domain-Zugehörigkeit der Workstation massgebend ist sondern die des SQL-Server bzw. des Users auf dem SQL-Server. Manchmal sind die Microsoftis schlauer als das eigentlich erlaupt ist :lol: Werde das morgen einmal auf dem Firmennetz prüfen. Lokal bekomme ich auf jedenfall das korrekte ergebnis. Gruss Xaver |
Moin Xaver,
dann funktioniert NetWkstaUserGetInfo also korrekt. Bei lokaler Anmeldung wird halt der Rechnername als Domain angegeben. |
Re: Domain Name auslesen
Warum funktioniert der Code nicht?Ist doch genua das aus eurem Beispiel oben?
Delphi-Quellcode:
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, NetApi32; type PWKSTA_USER_INFO_1 = ^WKSTA_USER_INFO_1; WKSTA_USER_INFO_1 = packed record wkui1_username : PWChar; wkui1_logon_domain : PWChar; wkui1_oth_domains : PWChar; wkui1_logon_server : PWChar; end; TForm1 = class(TForm) procedure FormCreate(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); var pwuiWork : PWKSTA_USER_INFO_1; begin if NetWkstaUserGetInfo(nil,1,@pwuiWork) = NErr_Success then begin //<- hier kommt der Fehler: Die Typen der tatsächlichen und formalen Var-Parameter müssen übereinstimmen try ShowMessage( WideCharToString(pwuiWork.wkui1_logon_domain)+'\'+ WideCharToString(pwuiWork.wkui1_username) ); finally NetApiBufferFree(pwuiWork); end; end; end; |
Re: Domain Name auslesen
Moin Tpercon,
das wird vermutlich daran liegen, dass die Übersetzung der Funktion die Du verwendest borlandtypisch deklariert wurde (mit var Parametern an der Stelle, wo die Funktion etwas zurückliefern soll/kann). Meine Deklaration, c-typisch (mit Angabe der Adresse an der Stelle wo die Funktion etwas zurückliefern soll/kann), sieht so aus:
Delphi-Quellcode:
// für dynamischen Import TcsNetWkstaUserGetInfo = function( const reserved : PWChar; const level : DWord; const bufptr : Pointer ) : NET_API_STATUS; stdcall; // für statischen Import function NetWkstaUserGetInfo( const reserved : PWChar; const level : DWord; const bufptr : Pointer ) : NET_API_STATUS; stdcall; external 'netapi32.dll'; |
Re: Domain Name auslesen
:hello: Jetzt geht das schonmal! Danke dir.
|
Re: Domain Name auslesen
Hallo zusammen!
Habe das auch mal probiert, aber bei mir haperts bereits an der netapi32-uses klausel: "File not Found netapi32.dcu". Woher bekomme ich die netapi32.dcu?? Hab im Inet mal danach gesucht, scheint aber nur ne .dll zu geben.. mfg Benni aka MASTER of LAN |
Re: Domain Name auslesen
Moin Benni,
erst einmal herzlich willkommen hier in der Delphi-PRAXiS. Was die NETAPI32.DCU angeht kann ich jetzt nur mal eine Vermutung anstellen. Die die Tpercon mit eingebunden hatte stammt vermutlich von den JEDIs. Für mein Beispiel hatte ich mir allerdings die ganzen Deklarationen selber aus dem Microsoft Headern übersetzt (für NetWkstaUserGetInfo und die Strukturen weiter oben im Thread zu finden). Wenn Du die Unit aus der uses Eintragung rausnimmst, und dafür anderen Übersetzungen nimmst sollte es gehen. [EDIT] Was ich noch vergessen hatte: Die hier beschriebenen Deklarationen funktionieren nicht unter 9x/ME. [/EDIT] |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07: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