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/)
-   -   Alle Computer im LAN anzeigen, die online sind (https://www.delphipraxis.net/172108-alle-computer-im-lan-anzeigen-die-online-sind.html)

hesch21 13. Dez 2012 08:55

Alle Computer im LAN anzeigen, die online sind
 
Hallo allerseits

ich schlage mich wieder mal mit einem Problem rum. Ein Programm sollte an alle Rechner, die im LAN Online sind, eine Meldung versenden können. Das funktioniert mit den Indy-Komponenten bestens, nur wie komme ich an eine Liste aller Computer, welche Online sind?
Eigentlich hätte ich eine DB-Tabelle aus dem AD aller Rechner, aber wenn ich einfach aufs Geratewohl mit den Indy versuche, einen Connect abzusetzen, geht das viel zu lange, bis bei nicht erreichbaren Rechnern was zurück kommt. Alle anpingen ist ebenfalls grauenhaft langsam.
Wohlverstanden, wir reden von Netzwerken von unter Umständen über 1000 Rechnern.
Ich bin dann auf WNetOpenEnum gestossen und habe mir folgendes Programm zusammen geschustert (resp. zum grössten Teil zusammengeklaut):
Code:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Mask, JvExMask, JvSpin;

type
  TForm1 = class(TForm)
    ListBox1: TListBox;
    Button1: TButton;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Button2: TButton;
    T3: TEdit;
    T1: TEdit;
    T2: TEdit;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
type
  PNetResourceArray = ^TNetResourceArray;  
  TNetResourceArray = array[0..100] of TNetResource;  
Function CreateNetResourceList(ResourceType: DWord;
                               NetResource: PNetResource;
                               out Entries: DWord;  
                               out List: PNetResourceArray): Boolean;  
var EnumHandle: THandle;
    BufSize: DWord;  
    Res: DWord;
begin  
  Result := False;
  List   := Nil;
  Entries := 0;
  if WNetOpenEnum(RESOURCE_GLOBALNET, ResourceType,0,NetResource,EnumHandle) = NO_ERROR then
     begin
     try
       BufSize := $4000;  // 16 kByte
       GetMem(List, BufSize);
       try
         repeat
           Entries := DWord(-1);
           FillChar(List^, BufSize, 0);
           Res := WNetEnumResource(EnumHandle, Entries, List, BufSize);
           if Res = ERROR_MORE_DATA then
              ReAllocMem(List, BufSize);
         until Res <> ERROR_MORE_DATA;
         Result := Res = NO_ERROR;
         if not Result then
            begin
            FreeMem(List);
            List := Nil;
            Entries := 0;
            end;
       except
         FreeMem(List);
         raise;
       end;
     finally
       WNetCloseEnum(EnumHandle);
     end;
     end;
end;

procedure ScanNetworkResources(ResourceType, DisplayType: DWord; List: TStrings);

procedure ScanLevel(NetResource: PNetResource);
var Entries        : DWord;
var NetResourceList : PNetResourceArray;
var i              : Integer;
begin
  if CreateNetResourceList(ResourceType, NetResource, Entries, NetResourceList) then
     try
       for i := 0 to Integer(Entries) - 1 do
           begin
           if (DisplayType = RESOURCEDISPLAYTYPE_GENERIC) or
              (NetResourceList[i].dwDisplayType = DisplayType) then
              begin
              List.AddObject(NetResourceList[i].lpRemoteName,
              Pointer(NetResourceList[i].dwDisplayType));
              end;
              if (NetResourceList[i].dwUsage and RESOURCEUSAGE_CONTAINER) <> 0 then
                 ScanLevel(@NetResourceList[i]);
           end;
     finally
       FreeMem(NetResourceList);
     end;
end;

begin
  ScanLevel(Nil);
end;

procedure TForm1.Button1Click(Sender: TObject);
var LB : TStringList;
var S1  : TDateTime;
begin
  T1.Text := FormatDateTime('hh:nn:ss', Now());
  T1.Repaint;
  S1 := Now();
  LB := TStringList.Create;
  ScanNetworkResources(RESOURCETYPE_DISK, RESOURCEDISPLAYTYPE_SERVER, LB);
  ListBox1.Items.Text := LB.Text;
  LB.Free;
  T2.Text := FormatDateTime('hh:nn:ss', Now());
  T3.Text := FormatDateTime('hh:nn:ss', Now() - S1);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
 Close;
end;

end.
Auf dem Form sind zwei Buttons, eine Listbox und die drei Edit-Felder T1, T2 und T3 für die Zeitanzeige. Jetzt braucht doch auch dieses Programm in meinem Netz um sieben Rechner zu finden geschlagene 2 Minuten und 13 Sekunden. Geht gar nicht !

Mach ich was falsch oder ist das einfach so? Hat jemand eine bessere Idee?

Sir Rufo 13. Dez 2012 09:18

AW: Alle Computer im LAN anzeigen, die online sind
 
Auf den gesuchten Rechnern muss doch ein Programm laufen, dem du etwas schickst.
Ist das ein Programm von dir?

Dann sollte dieses Programm sich melden und nicht umgekehrt.

mjustin 13. Dez 2012 09:53

AW: Alle Computer im LAN anzeigen, die online sind
 
Zitat:

Zitat von hesch21 (Beitrag 1195337)
Mach ich was falsch oder ist das einfach so? Hat jemand eine bessere Idee?

Das Thema kam in den letzten Wochen einige Male, unter dem Stichwort IP Multicast habe ich ein paar Artikel geschrieben wie die aktiven Rechner sich bemerkbar machen können.

user0815 13. Dez 2012 10:07

AW: Alle Computer im LAN anzeigen, die online sind
 
OT - http://rh-software.com/ siehe dort: Network


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