如何用delphi发现局域网上所有的主机并列出其主机名??求教原代码!!

解决方案 »

  1.   

    NetServerEnum參考, 類似
    http://www.csdn.net/develop/Read_Article.asp?id=25532
    改變這個就是
    dwServerType := SV_TYPE_SQLSERVER;    //服务器类型
      

  2.   

    procedure TForm1.Button1Click(Sender: TObject); 
    var 
      dwEntriesRead, dwEntriesTotal: DWORD; 
      ui1, ui2 : Pointer; 
      i : Integer; 
    begin 
      if NetUserEnum(nil, 0, FILTER_NORMAL_ACCOUNT, ui1, MAX_PREFERRED_LENGTH, dwEntriesRead, dwEntriesTotal, nil) = NERR_SUCCESS then 
      begin 
        ui2 := ui1; 
        for i := 0 to dwEntriesRead-1 do 
        begin 
          Listbox1.Items.Add(PUserInfo1(ui1)^.usri1_name); 
          Inc(Integer(ui1), SizeOf(Pointer)); 
        end; 
      end; 
      NetAPIBufferFree(ui2); 
    end; 
      

  3.   

    /*列出局域网上所有工作组*/
    Function GetGroupList( var List : TStringList ) : Boolean;
    type
      TNetResourceArray = ^TNetResource;//网络类型的数组
    Var
      NetResource: TNetResource;
      Buf: Pointer;
      Count,BufSize,Res: DWORD;
      lphEnum: THandle;
      p: TNetResourceArray;
      i,j: SmallInt;
      NetworkTypeList: TList;
    Begin
      Result := False;
      NetworkTypeList := TList.Create;
      List.Clear;
      //获取整个网络中的文件资源的句柄,lphEnum为返回名柄
      Res := WNetOpenEnum( RESOURCE_GLOBALNET, RESOURCETYPE_DISK,
                           RESOURCEUSAGE_CONTAINER, Nil,lphEnum);
      if Res <> NO_ERROR then exit;//Raise Exception(Res);//执行失败
      //获取整个网络中的网络类型信息
      Count := $FFFFFFFF;//不限资源数目
      BufSize := 8192;//缓冲区大小设置为8K
      GetMem(Buf, BufSize);//申请内存,用于获取工作组信息
      Res := WNetEnumResource(lphEnum, Count, Pointer(Buf), BufSize);
         //资源列举完毕                    //执行失败
      if ( Res = ERROR_NO_MORE_ITEMS ) or (Res <> NO_ERROR ) then Exit;
      P := TNetResourceArray(Buf);
      for i := 0 to Count - 1 do//记录各个网络类型的信息
      begin
        NetworkTypeList.Add(p);
        Inc(P);
      end;
      Res := WNetCloseEnum(lphEnum);//关闭一次列举
      if Res <> NO_ERROR then exit;
      for j := 0 to NetworkTypeList.Count-1 do //列出各个网络类型中的所有工作组名称
      begin//列出一个网络类型中的所有工作组名称
        NetResource := TNetResource(NetworkTypeList.Items[J]^);//网络类型信息
        //获取某个网络类型的文件资源的句柄,NetResource为网络类型信息,lphEnum为返回名柄
        Res := WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_DISK,
                            RESOURCEUSAGE_CONTAINER, @NetResource,lphEnum);
        if Res <> NO_ERROR then break;//执行失败
        while true do//列举一个网络类型的所有工作组的信息
        begin
          Count := $FFFFFFFF;//不限资源数目
          BufSize := 8192;//缓冲区大小设置为8K
          GetMem(Buf, BufSize);//申请内存,用于获取工作组信息
          //获取一个网络类型的文件资源信息,
          Res := WNetEnumResource(lphEnum, Count, Pointer(Buf), BufSize);
              //资源列举完毕                   //执行失败
          if ( Res = ERROR_NO_MORE_ITEMS ) or (Res <> NO_ERROR)  then break;
          P := TNetResourceArray(Buf);
          for i := 0 to Count - 1 do//列举各个工作组的信息
          begin
            List.Add( StrPAS( P^.lpRemoteName ));//取得一个工作组的名称
            Inc(P);
          end;
        end;
        Res := WNetCloseEnum(lphEnum);//关闭一次列举
        if Res <> NO_ERROR then break;//执行失败
      end;
      Result := True;
      FreeMem(Buf);
      NetworkTypeList.Destroy;
    End;{=================================================================
      功  能: 列举工作组中所有的计算机
      参  数:
              List: 需要填充的List
      返回值: 成功:  True,并填充List 失败: False;
      备  注:
      版  本:
         1.0  2002/10/03 08:00:00
    =================================================================}
    Function GetUsers(GroupName: string; var List: TStringList): Boolean;
    type
      TNetResourceArray = ^TNetResource;//网络类型的数组
    Var
      i: Integer;
      Buf: Pointer;
      Temp: TNetResourceArray;
      lphEnum: THandle;
      NetResource: TNetResource;
      Count,BufSize,Res: DWord;
    begin
      Result := False;
      List.Clear;
      FillChar(NetResource, SizeOf(NetResource), 0);//初始化网络层次信息
      NetResource.lpRemoteName := @GroupName[1];//指定工作组名称
      NetResource.dwDisplayType := RESOURCEDISPLAYTYPE_SERVER;//类型为服务器(工作组)
      NetResource.dwUsage := RESOURCEUSAGE_CONTAINER;
      NetResource.dwScope := RESOURCETYPE_DISK;//列举文件资源信息
      //获取指定工作组的网络资源句柄
      Res := WNetOpenEnum( RESOURCE_GLOBALNET, RESOURCETYPE_DISK,
                            RESOURCEUSAGE_CONTAINER, @NetResource,lphEnum);
      if Res <> NO_ERROR then Exit; //执行失败
      while True do//列举指定工作组的网络资源
      begin
        Count := $FFFFFFFF;//不限资源数目
        BufSize := 8192;//缓冲区大小设置为8K
        GetMem(Buf, BufSize);//申请内存,用于获取工作组信息
        //获取计算机名称
        Res := WNetEnumResource(lphEnum, Count, Pointer(Buf), BufSize);
        if Res = ERROR_NO_MORE_ITEMS then break;//资源列举完毕
        if (Res <> NO_ERROR) then Exit;//执行失败
        Temp := TNetResourceArray(Buf);
        for i := 0 to Count - 1 do//列举工作组的计算机名称
        begin
          //获取工作组的计算机名称,+2表示删除"\\",如\\wangfajun=>wangfajun
          List.Add(Temp^.lpRemoteName + 2);
          inc(Temp);
        end;
      end;
      Res := WNetCloseEnum(lphEnum);//关闭一次列举
      if Res <> NO_ERROR then exit;//执行失败
      Result := True;
      FreeMem(Buf);
    end;
      

  4.   

    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs,Winsock, StdCtrls, Spin, ExtCtrls;type
      TForm1 = class(TForm)
        Button1: TButton;
        Label1: TLabel;
        Edit_input: TEdit;
        Label3: TLabel;
        Label4: TLabel;
        Label5: TLabel;
        Label6: TLabel;
        Label7: TLabel;
        SpinEdit_start: TSpinEdit;
        SpinEdit_end: TSpinEdit;
        Memo1: TMemo;
        Panel_name: TPanel;
        procedure Button1Click(Sender: TObject);
        function GetComputerName(IP:string):string;
        procedure FormCreate(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}function LocalIP:string;//获取本地IP
    type
      tapinaddr=array[0..10] of pinaddr;
      papinaddr=^tapinaddr;
    var
      phe:phostent;
      pptr:papinaddr;
      buffer:array[0..63] of char;
      i:integer;
      GinitData:TWSADATA;
    begin
      WSAStartup($101,GinitData);
      result:='';
      gethostname(buffer,sizeof(buffer));
      phe:=gethostbyname(buffer);
      if phe=nil then exit;
      pptr:=papinaddr(phe^.h_addr_list);
      i:=0;
      while pptr^[i]<>nil do begin
        result:=strpas(inet_ntoa(pptr^[i]^));
        inc(i);
      end;
      wsacleanup;
    end;function TForm1.GetComputerName(IP:string):string;//给定IP求取电脑名称.
    var
      HostEnt:PHostEnt;
      WSAData:TWSADATA;
      Addr:DWORD;
    begin
      WSAStartup($101,WSAData);
      Addr:=inet_addr(PChar(IP));
      HostEnt:=gethostbyaddr(@Addr,sizeof(Addr),PF_INET);
      if HostEnt<>nil then
         Result:=HostEnt.h_name
      else
         Result:='';
      WSACleanup();
    end;procedure TForm1.Button1Click(Sender: TObject);
    var
       temp,temp_ip,IP_PCname:string;
       i,p:integer;
    begin
       p:=0;
       temp:='';
       temp_ip:='';
       button1.Caption:='Searching computer name...';   memo1.Lines.Clear;
       for i:=spinedit_start.Value to spinedit_end.Value do
        begin
         temp_ip:=edit_input.Text+'.'+inttostr(i);
         IP_PCname:=GetComputerName(temp_ip);
         panel_name.Update;
         if IP_PCname<>'' then begin
            P:=P+1;
            panel_name.Caption:=IntToStr(p)+'  PCS';
            temp:=temp_ip+'        '+IP_PCname;
            memo1.Lines.Add(temp);
         end else begin
            IP_PCname:='No Open';
         end;
       end;
       button1.Caption:='Find computer name'
    end;procedure TForm1.FormCreate(Sender: TObject);
    begin
       label3.Caption:=localIP;
    end;end.