![]() |
Domain-Server auflisten
Kuck euch doch bitte mal in diesem Thread den Wunsch von Sharky an. Man soll in meinem User-Manager den Domain-Controller oder nennt man es Server? angeben können.
Ich bräuchte jetzt also was, was mir alle im Netzwerk vorhandenen Server auflistet. Ich müßte euch allerdings um funktionierenden, lauffähigen Code bitten, da ich keinen Zugriff auf ein entsprechendes Netzwerk habe. Am liebsten wäre mit Code, der mir die Namen in eine Listbox packt - mehr nicht. Nachtrag: Es geht mir um den ersten Parameter dieser Funktion: ![]() Ich habe da gerade eine Idee bekommen: Was passiert denn, wenn ich den "Computer auswählen" Dialog anzeige? Könnte man da den Server aus wählen? |
Re: Domain-Server auflisten
Hai Luckie,
ich habe bei Torry diesen Code gefunden:
Delphi-Quellcode:
Die Funktion ComputerBrowser listet dir alle Domainen und die Computer in ihr auf.
const
FOCUSDLG_DOMAINS_ONLY = 1; FOCUSDLG_SERVERS_ONLY = 2; FOCUSDLG_SERVERS_DOMAINS = 3; FOCUSDLG_BROWSE_LOGON_DOMAIN = $00010000; FOCUSDLG_BROWSE_WKSTA_DOMAIN = $00020000; FOCUSDLG_BROWSE_OTHER_DOMAINS = $00040000; FOCUSDLG_BROWSE_TRUSTING_DOMAINS = $00080000; FOCUSDLG_BROWSE_WORKGROUP_DOMAINS = $00100000; FOCUSDLG_BROWSE_ALL_DOMAINS = FOCUSDLG_BROWSE_LOGON_DOMAIN or FOCUSDLG_BROWSE_WKSTA_DOMAIN or FOCUSDLG_BROWSE_OTHER_DOMAINS or FOCUSDLG_BROWSE_TRUSTING_DOMAINS or FOCUSDLG_BROWSE_WORKGROUP_DOMAINS; function SystemFocusDialog(hwndOwner: HWND; dwSelectionFlag: UINT; wszName: PWideChar; dwBufSize: DWORD; var bOKPressed: Boolean; wszHelpFile: PWideChar; dwContextHelpId: DWORD): DWORD; stdcall; external 'ntlanman.dll' Name 'I_SystemFocusDialog'; function ComputerBrowser(hWndParent: HWND; wCompName: PWideChar; dwBufLen: DWORD): Boolean; var dwError: DWORD; begin Result := False; dwError := SystemFocusDialog(hWndParent, FOCUSDLG_SERVERS_DOMAINS or FOCUSDLG_BROWSE_ALL_DOMAINS, wCompName, dwBufLen, Result, nil, 0); if dwError <> NO_ERROR then Exit; end; procedure TForm1.Button1Click(Sender: TObject); var wCompName: array [0..MAX_COMPUTERNAME_LENGTH + 1] of WideChar; begin if ComputerBrowser(0, wCompName, MAX_COMPUTERNAME_LENGTH + 1) then ShowMessage(wCompName) else ShowMessage('no computer selected'); end; Der Dialog steckt in der ntlanman.dll. Ich habe es getestet und es geht. Das wäre doch genau das richtige für dein Programm!!!! |
Ich habe gerade den "Computer auswählen" Dialog eingebaut und mir wurde berichtet, dass man da auch alle Freigebaben sieht, war also nicht so das wahre.
Gott sei dank habe ich es gleich so flexible gemacht, dass ich deinen Code das innerhalb zwei Minuten einbauen kann. Wie bist du schnell zu erreichen, um es zu testen? |
Hallo,
bin gerade dabei, einen peer to peer-Messenger fürs LAN zu entwerfen. Dabei fungiert der erste Rechner auf dem das Prog gestartet wird immer als Server und die später kommen sind Clients und übernehmen auch die Serverfunktion, falls der erste wieder rausgeht. Im Prinzip funktioniert das ganze schon, leider muß ich immer die Rechner im Netz von Hand eingeben und auch der Code von Sharky ist insofern nervig, als daß das Prog im Autostart steht und eigentlich keine Benutzereingabe nötig sein soll. Ich habe mir jetzt folgenden Quellcode zusammengekl***, leider hat dieser einen Fehler und meine Delphi-Hilfe kennt den Befehl WNetEnumResource nicht.
Code:
Kann mir jemand helfen? :roll:
Procedure TRecipForm.FormCreate(Sender: TObject);
Procedure Enum(h: THandle); Var I : Integer; nRes,cbBuf : Integer; he : THandle; Nr : Array [0..99] Of TNetResource; Begin nRes:=100; cbBuf:=Sizeof(Nr); FillChar(Nr,SizeOf(Nr),0); WNetEnumResource(h,nRes,@Nr,cbBuf); //hier liegt das Problem!!! For I:=0 To nRes-1 Do Begin If (Nr[I].dwDisplayType In [RESOURCEDISPLAYTYPE_DOMAIN, RESOURCEDISPLAYTYPE_SERVER]) And Assigned(Nr[i].lpRemoteName) Then cbRecip.Items.Add(Nr[i].lpRemoteName); If Nr[i].dwDisplayType In [RESOURCEDISPLAYTYPE_NETWORK, RESOURCEDISPLAYTYPE_DOMAIN] Then Begin WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_DISK, RESOURCEUSAGE_CONTAINER,@Nr[I],he); Enum(he); WNetCloseEnum(he); End; End; End; Var he : THandle; Begin cbRecip.Items.Clear; WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_DISK, RESOURCEUSAGE_CONTAINER, nil, he); Enum(he); WNetCloseEnum(he); End; P.S. Wo im Netz kann man Hilfe (möglichst auf deutsch) zu den WNet...-Befehlen finden? - So bin ich übrigens auf Euer Forum gestoßen :bounce2: |
Hoi, und Herzlich Willkommen.
Bei WNetEnumResource handelt es sich um einen Befehl der WinAPi. Diese Befehle kann man auf ![]() |
Delphi hat da für auch keine pas-Dateien. Du hast zwei Möglichkieten: Entweder übersetzt du dir die nötigen Header selber, oder nimmst die Jedi-Übersetzungen.
|
:dancer: Danke für den TIP!!!
Also für alle, die es jetzt wissen wollen: nRes,cbBuf : Integer; ist natürlich falsch! Richtigerweise müssen beide DWord sein und dann geht das ganze auch super. Also nochmals vielen Dank. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:32 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