Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Domain-Server auflisten (https://www.delphipraxis.net/2656-domain-server-auflisten.html)

Luckie 31. Jan 2003 13:40


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

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?

Sharky 31. Jan 2003 15:20

Re: Domain-Server auflisten
 
Hai Luckie,

ich habe bei Torry diesen Code gefunden:

Delphi-Quellcode:
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;
Die Funktion ComputerBrowser listet dir alle Domainen und die Computer in ihr auf.

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

Luckie 31. Jan 2003 15:24

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?

Schwedenbitter 22. Mär 2003 13:00

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:
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;
Kann mir jemand helfen? :roll:

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:

RomanK 22. Mär 2003 13:13

Hoi, und Herzlich Willkommen.
Bei WNetEnumResource handelt es sich um einen Befehl der WinAPi.
Diese Befehle kann man auf http://msdn.microsoft.com nachlesen, allerdings englisch. Wenn du das öfters machst dann lad dir das PSDK runter, link im Forum suchen.

Luckie 22. Mär 2003 13:55

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.

Schwedenbitter 22. Mär 2003 18:22

: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