Announcement

Collapse
No announcement yet.

Im Netz verfügbare Rechner anzeigen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Im Netz verfügbare Rechner anzeigen

    Hallo Zusammen,

    Gibt es eine Möglichkeit alle im Netzwerk verfügbaren Rechner mit Name und IP-Adresse aufzulisten?

    Danke für Eure Hilfe

  • #2
    Hi,

    hier n Beispiel das helfen sollte. Mit der IP weis ich grad auch nicht aber sicherlich kann man das rausfinden indem man Google fragt oder die MSDN.

    procedure TForm1.FormShow(Sender: TObject);
    Var
    hEnum, hEnum2 :THandle;
    aBuf, aBuf2 :Array[0..63] Of TNetResource;
    iBufSize :dWORD;
    I, J, iEntries, iEntries2 :dWORD;
    Begin
    Try
    Caption:= Caption + ' - Getting containers...';
    Screen.Cursor:= crHourGlass;
    Try
    { do the enumeration of containers }
    If WnetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_ANY, 0, Nil, hEnum) <> NO_ERROR Then
    Exit;
    { now enumerate the containers }
    iBufSize:= SizeOf(aBuf);
    iEntries:= 64;
    While WNetEnumResource(hEnum, iEntries, @aBuf[0], iBufSize) = NO_ERROR Do
    Begin
    For I := 0 To (iEntries - 1) Do
    Begin
    If ((aBuf[I].dwUsage And RESOURCEUSAGE_CONTAINER) = RESOURCEUSAGE_CONTAINER) And
    (Pos('Microsoft Windows', String(aBuf[I].lpRemoteName)) = 1) Then
    Begin
    { enum workgroups and domains }
    Try
    If WnetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_ANY, 0, @aBuf[I], hEnum2) <> NO_ERROR Then
    Begin
    Showmessage('Error enumerating Microsoft Network Resources!');
    Exit;
    End;
    iBufSize:= SizeOf(aBuf2);
    iEntries2:= 64;
    While WNetEnumResource(hEnum2, iEntries2, @aBuf2[0], iBufSize) = NO_ERROR Do
    Begin
    For J:= 0 To (iEntries2 - 1) Do
    Begin
    lbContainers.Items.Add(String(abuf2[J].lpRemoteName));
    iEntries2:= 64;
    End;
    End;
    Finally
    WNetCloseEnum(hEnum2);
    End;
    End;
    End;
    iEntries := 64;
    End;
    Finally
    WnetCloseEnum(hEnum);
    End;
    Finally
    Caption:= 'Computer Browser';
    Screen.Cursor:= crDefault;
    End;
    End;

    procedure TForm1.lbContainersClick(Sender: TObject);
    Var
    hEnum :THandle;
    aBUf :Array[0..63] Of TNetResource;
    iBufSize :dWORD;
    I, iEntries :dWORD;
    rNetRez :TNetResource;
    Begin
    If Form1.lbContainers.ItemIndex > -1 Then
    Begin
    { enumerate computers within this container }
    Form1.lbMachines.Clear;
    Try
    Screen.Cursor:= crHourGlass;
    With rNetRez Do
    Begin
    dwScope:= RESOURCE_GLOBALNET;
    dwType:= RESOURCETYPE_ANY;
    dwDisplayType:= RESOURCEDISPLAYTYPE_GENERIC;
    dwUsage:= RESOURCEUSAGE_CONNECTABLE;
    lpLocalName:= Nil;
    lpRemoteName:= PChar(lbContainers.Items[lbContainers.ItemIndex]);
    lpComment:= Nil;
    lpProvider:= Nil;
    End;
    If WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_ANY, 0, @rNetRez, hEnum) <> NO_ERROR Then
    Begin
    ShowMessage('Could not open container: ' + String(rNetRez.lpRemoteName) + ' Error was: 0x' + IntToHex(GetLastError(), 8));
    Exit;
    End;
    iBufsize:= SizeOf(aBuf);
    iEntries:= 64;
    While WNetEnumResource(hEnum, iEntries, @aBuf[0], iBufSize) = NO_ERROR Do
    Begin
    For I:= 0 To (iEntries -1) Do
    Begin
    lbMachines.Items.Add(String(aBuf[I].lpRemoteName));
    iEntries:= 64;
    End;
    End;
    Finally
    WnetCloseEnum(hEnum);
    Screen.Cursor:= crDefault;
    End;
    End;
    End

    Comment


    • #3
      Hallo Tobias,

      vielen Dank für Deine Hilfe, hat alles gut geklappt. Die Ermittlung der IP-Adresse habe ich mit GetHostByName gelöst.

      Eigentlich würde ich ja lieber GetAddressByName verwenden, finde allerdings die unit nicht, in der die Funktion deklariert ist

      Comment


      • #4
        Hallo Ich danke auch erstmal für das Beispiel. Hätte noch mal eine Frage: Funktioniert das nur für eine Domäne oder auch für Arbeitsgruppen. Meine Arbeitsgruppe wird angezeigt, nur wenn ich auf diese nicht die entsprechenden Arbeitsplätze dazu ..

        Gibt es auch dafür eine Lösung

        Comment


        • #5
          Hallo Markus,

          Hier die Möglichkeit mit addressByNAme: Unit WinSock

          uses
          WinSock;

          function GetIpAddressByName(const Lines:TStrings; const AHost: String): Boolean;
          type
          PPInAddr= ^PInAddr;
          var
          WSA: TWSAData;
          HostInfo: PHostEnt;
          Addr: PPInAddr;
          begin
          Result:=False;
          if WSAStartUp($101, WSA) = 0 then
          begin
          try
          HostInfo:= getHostByName(PChar(AHost));
          Result:=HostInfo<>nil;
          if Result then
          begin
          Addr:=Pointer(HostInfo^.h_addr_list);
          if (Addr<>nil) AND (Addr^<>nil) then
          begin
          Repeat
          Lines.Add(StrPas(inet_ntoa(Addr^^)) ) ;
          inc(Addr);
          Until Addr^=nil;
          end;
          end;
          finally
          WSACleanup;
          end;
          end;
          end;

          procedure TForm1.Button1Click(Sender: TObject);
          begin
          if GetIpAddressByName(Listbox1.Items, 'www.google.de') then
          Showmessage('OK')
          else
          ShowMessage('Fehler');
          end;

          Comment

          Working...
          X