请问怎样获得当前计算机所在的局域网的所有计算机IP或计算机名?
不一定要有答案,大家讨论一下。

解决方案 »

  1.   

    转贴:  呵呵……{=================================================================
      功  能: 列举工作组中所有的计算机
      参  数:
              List: 需要填充的List
      返回值: 成功:  True,并填充List 失败: False;
      备  注:
      版  本:
         1.0  2002/10/03 08:00:00
    =================================================================}
    Function TPub.NetGetUsers(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;
      

  2.   

    1.
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;type
      PnetResourceArr = ^TNetResource;
      TForm1 = class(TForm)
        ListBox1: TListBox;
        ListBox2: TListBox;
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
        procedure ListBox1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
        procedure GetServerList(List:TStrings);
        procedure GetUserList(fServer:string;List:TStrings);
      end;var
      Form1: TForm1;implementation{$R *.dfm}{ TForm1 }procedure TForm1.GetServerList(List: TStrings);
    Type{$H+}PMyRec = ^MyRec;MyRec = RecorddwScope : Integer;dwType : Integer;dwDisplayType : Integer;dwUsage : Integer;LocalName : String;RemoteName : String;Comment : String;Provider : String;End;{H-}VarNetResource : TNetResource;TempRec : PMyRec;Buf : Pointer;Count,BufSize,Res : DWORD;lphEnum : THandle;p : PNetResourceArr;i,j : SmallInt;NetworkTypeList : TList;begin// Result := False;NetworkTypeList := TList.Create;List.BeginUpdate;List.Clear;GetMem(Buf, 8192);TryRes := WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_DISK, RESOURCEUSAGE_CONTAINER, Nil,lphEnum);If Res <> 0 Then Raise Exception(Res);Count := $FFFFFFFF;BufSize := 8192;Res := WNetEnumResource(lphEnum, Count, Pointer(Buf), BufSize);If Res = ERROR_NO_MORE_ITEMS Then Exit;If (Res <> 0) Then Raise Exception(Res);P := PNetResourceArr(Buf);For I := 0 To Count - 1 DoBeginNew(TempRec);TempRec^.dwScope := P^.dwScope;TempRec^.dwType := P^.dwType ;TempRec^.dwDisplayType := P^.dwDisplayType ;TempRec^.dwUsage := P^.dwUsage ;TempRec^.LocalName := StrPas(P^.lpLocalName);TempRec^.RemoteName := StrPas(P^.lpRemoteName);TempRec^.Comment := StrPas(P^.lpComment);TempRec^.Provider := StrPas(P^.lpProvider);NetworkTypeList.Add(TempRec);Inc(P);End;Res := WNetCloseEnum(lphEnum);If Res <> 0 Then Raise Exception(Res);For J := 0 To NetworkTypeList.Count-1 DoBeginTempRec := NetworkTypeList.Items[J];NetResource := TNetResource(TempRec^);Res := WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_DISK, RESOURCEUSAGE_CONTAINER, @NetResource,lphEnum);If Res <> 0 Then Raise Exception(Res);While true DoBeginCount := $FFFFFFFF;BufSize := 8192;Res := WNetEnumResource(lphEnum, Count, Pointer(Buf), BufSize);If Res = ERROR_NO_MORE_ITEMS Then Break;If (Res <> 0) Then Raise Exception(Res);P := PNetResourceArr(Buf);For I := 0 To Count - 1 DoBeginList.Add(P^.lpRemoteName);Inc(P);End;End;End;Res := WNetCloseEnum(lphEnum);If Res <> 0 Then Raise Exception(Res);//Result := True;FinallyFreeMem(Buf);NetworkTypeList.Destroy;End;List.EndUpdate;end;procedure TForm1.GetUserList(fServer: string; List: TStrings);
    VarNetResource : TNetResource;Buf : Pointer;Count,BufSize,Res : DWord;Ind : Integer;lphEnum : THandle;Temp : PNetResourceArr;Begin
    List.Clear;GetMem(Buf, 8192);TryFillChar(NetResource, SizeOf(NetResource), 0);NetResource.lpRemoteName := @fServer[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 <> 0 Then Exit;While True DoBeginCount := $FFFFFFFF;BufSize := 8192;Res := WNetEnumResource(lphEnum, Count, Pointer(Buf), BufSize);If Res = ERROR_NO_MORE_ITEMS Then Exit;If (Res <> 0) then Exit;Temp := PNetResourceArr(Buf);For Ind := 0 to Count - 1 doBeginList.Add(Temp^.lpRemoteName + 2); { Add all the network usernames to List StringList }Inc(Temp);End;End;Res := WNetCloseEnum(lphEnum);If Res <> 0 Then Raise Exception(Res);// Result := True;FinallyFreeMem(Buf);End;End;procedure TForm1.Button1Click(Sender: TObject);
    begin
      form1.GetServerList(form1.ListBox1.Items);
    end;procedure TForm1.ListBox1Click(Sender: TObject);
    begin
      form1.GetUserList(form1.ListBox1.Items.Strings[form1.ListBox1.Itemindex],form1.ListBox2.Items);
    end;end.
      

  3.   

    1.
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;type
      PnetResourceArr = ^TNetResource;
      TForm1 = class(TForm)
        ListBox1: TListBox;
        ListBox2: TListBox;
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
        procedure ListBox1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
        procedure GetServerList(List:TStrings);
        procedure GetUserList(fServer:string;List:TStrings);
      end;var
      Form1: TForm1;implementation{$R *.dfm}{ TForm1 }procedure TForm1.GetServerList(List: TStrings);
    Type{$H+}PMyRec = ^MyRec;MyRec = RecorddwScope : Integer;dwType : Integer;dwDisplayType : Integer;dwUsage : Integer;LocalName : String;RemoteName : String;Comment : String;Provider : String;End;{H-}VarNetResource : TNetResource;TempRec : PMyRec;Buf : Pointer;Count,BufSize,Res : DWORD;lphEnum : THandle;p : PNetResourceArr;i,j : SmallInt;NetworkTypeList : TList;begin// Result := False;NetworkTypeList := TList.Create;List.BeginUpdate;List.Clear;GetMem(Buf, 8192);TryRes := WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_DISK, RESOURCEUSAGE_CONTAINER, Nil,lphEnum);If Res <> 0 Then Raise Exception(Res);Count := $FFFFFFFF;BufSize := 8192;Res := WNetEnumResource(lphEnum, Count, Pointer(Buf), BufSize);If Res = ERROR_NO_MORE_ITEMS Then Exit;If (Res <> 0) Then Raise Exception(Res);P := PNetResourceArr(Buf);For I := 0 To Count - 1 DoBeginNew(TempRec);TempRec^.dwScope := P^.dwScope;TempRec^.dwType := P^.dwType ;TempRec^.dwDisplayType := P^.dwDisplayType ;TempRec^.dwUsage := P^.dwUsage ;TempRec^.LocalName := StrPas(P^.lpLocalName);TempRec^.RemoteName := StrPas(P^.lpRemoteName);TempRec^.Comment := StrPas(P^.lpComment);TempRec^.Provider := StrPas(P^.lpProvider);NetworkTypeList.Add(TempRec);Inc(P);End;Res := WNetCloseEnum(lphEnum);If Res <> 0 Then Raise Exception(Res);For J := 0 To NetworkTypeList.Count-1 DoBeginTempRec := NetworkTypeList.Items[J];NetResource := TNetResource(TempRec^);Res := WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_DISK, RESOURCEUSAGE_CONTAINER, @NetResource,lphEnum);If Res <> 0 Then Raise Exception(Res);While true DoBeginCount := $FFFFFFFF;BufSize := 8192;Res := WNetEnumResource(lphEnum, Count, Pointer(Buf), BufSize);If Res = ERROR_NO_MORE_ITEMS Then Break;If (Res <> 0) Then Raise Exception(Res);P := PNetResourceArr(Buf);For I := 0 To Count - 1 DoBeginList.Add(P^.lpRemoteName);Inc(P);End;End;End;Res := WNetCloseEnum(lphEnum);If Res <> 0 Then Raise Exception(Res);//Result := True;FinallyFreeMem(Buf);NetworkTypeList.Destroy;End;List.EndUpdate;end;procedure TForm1.GetUserList(fServer: string; List: TStrings);
    VarNetResource : TNetResource;Buf : Pointer;Count,BufSize,Res : DWord;Ind : Integer;lphEnum : THandle;Temp : PNetResourceArr;Begin
    List.Clear;GetMem(Buf, 8192);TryFillChar(NetResource, SizeOf(NetResource), 0);NetResource.lpRemoteName := @fServer[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 <> 0 Then Exit;While True DoBeginCount := $FFFFFFFF;BufSize := 8192;Res := WNetEnumResource(lphEnum, Count, Pointer(Buf), BufSize);If Res = ERROR_NO_MORE_ITEMS Then Exit;If (Res <> 0) then Exit;Temp := PNetResourceArr(Buf);For Ind := 0 to Count - 1 doBeginList.Add(Temp^.lpRemoteName + 2); { Add all the network usernames to List StringList }Inc(Temp);End;End;Res := WNetCloseEnum(lphEnum);If Res <> 0 Then Raise Exception(Res);// Result := True;FinallyFreeMem(Buf);End;End;procedure TForm1.Button1Click(Sender: TObject);
    begin
      form1.GetServerList(form1.ListBox1.Items);
    end;procedure TForm1.ListBox1Click(Sender: TObject);
    begin
      form1.GetUserList(form1.ListBox1.Items.Strings[form1.ListBox1.Itemindex],form1.ListBox2.Items);
    end;end.
      

  4.   

    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;type
      PnetResourceArr = ^TNetResource;
      TForm1 = class(TForm)
        ListBox1: TListBox;
        ListBox2: TListBox;
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
        procedure ListBox1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
        procedure GetServerList(List:TStrings);
        procedure GetUserList(fServer:string;List:TStrings);
      end;var
      Form1: TForm1;implementation{$R *.dfm}{ TForm1 }procedure TForm1.GetServerList(List: TStrings);
    Type{$H+}PMyRec = ^MyRec;MyRec = RecorddwScope : Integer;dwType : Integer;dwDisplayType : Integer;dwUsage : Integer;LocalName : String;RemoteName : String;Comment : String;Provider : String;End;{H-}VarNetResource : TNetResource;TempRec : PMyRec;Buf : Pointer;Count,BufSize,Res : DWORD;lphEnum : THandle;p : PNetResourceArr;i,j : SmallInt;NetworkTypeList : TList;begin// Result := False;NetworkTypeList := TList.Create;List.BeginUpdate;List.Clear;GetMem(Buf, 8192);TryRes := WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_DISK, RESOURCEUSAGE_CONTAINER, Nil,lphEnum);If Res <> 0 Then Raise Exception(Res);Count := $FFFFFFFF;BufSize := 8192;Res := WNetEnumResource(lphEnum, Count, Pointer(Buf), BufSize);If Res = ERROR_NO_MORE_ITEMS Then Exit;If (Res <> 0) Then Raise Exception(Res);P := PNetResourceArr(Buf);For I := 0 To Count - 1 DoBeginNew(TempRec);TempRec^.dwScope := P^.dwScope;TempRec^.dwType := P^.dwType ;TempRec^.dwDisplayType := P^.dwDisplayType ;TempRec^.dwUsage := P^.dwUsage ;TempRec^.LocalName := StrPas(P^.lpLocalName);TempRec^.RemoteName := StrPas(P^.lpRemoteName);TempRec^.Comment := StrPas(P^.lpComment);TempRec^.Provider := StrPas(P^.lpProvider);NetworkTypeList.Add(TempRec);Inc(P);End;Res := WNetCloseEnum(lphEnum);If Res <> 0 Then Raise Exception(Res);For J := 0 To NetworkTypeList.Count-1 DoBeginTempRec := NetworkTypeList.Items[J];NetResource := TNetResource(TempRec^);Res := WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_DISK, RESOURCEUSAGE_CONTAINER, @NetResource,lphEnum);If Res <> 0 Then Raise Exception(Res);While true DoBeginCount := $FFFFFFFF;BufSize := 8192;Res := WNetEnumResource(lphEnum, Count, Pointer(Buf), BufSize);If Res = ERROR_NO_MORE_ITEMS Then Break;If (Res <> 0) Then Raise Exception(Res);P := PNetResourceArr(Buf);For I := 0 To Count - 1 DoBeginList.Add(P^.lpRemoteName);Inc(P);End;End;End;Res := WNetCloseEnum(lphEnum);If Res <> 0 Then Raise Exception(Res);//Result := True;FinallyFreeMem(Buf);NetworkTypeList.Destroy;End;List.EndUpdate;end;procedure TForm1.GetUserList(fServer: string; List: TStrings);
    VarNetResource : TNetResource;Buf : Pointer;Count,BufSize,Res : DWord;Ind : Integer;lphEnum : THandle;Temp : PNetResourceArr;Begin
    List.Clear;GetMem(Buf, 8192);TryFillChar(NetResource, SizeOf(NetResource), 0);NetResource.lpRemoteName := @fServer[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 <> 0 Then Exit;While True DoBeginCount := $FFFFFFFF;BufSize := 8192;Res := WNetEnumResource(lphEnum, Count, Pointer(Buf), BufSize);If Res = ERROR_NO_MORE_ITEMS Then Exit;If (Res <> 0) then Exit;Temp := PNetResourceArr(Buf);For Ind := 0 to Count - 1 doBeginList.Add(Temp^.lpRemoteName + 2); { Add all the network usernames to List StringList }Inc(Temp);End;End;Res := WNetCloseEnum(lphEnum);If Res <> 0 Then Raise Exception(Res);// Result := True;FinallyFreeMem(Buf);End;End;procedure TForm1.Button1Click(Sender: TObject);
    begin
      form1.GetServerList(form1.ListBox1.Items);
    end;procedure TForm1.ListBox1Click(Sender: TObject);
    begin
      form1.GetUserList(form1.ListBox1.Items.Strings[form1.ListBox1.Itemindex],form1.ListBox2.Items);
    end;end.
      

  5.   

    根据主机名获得ip地址unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs,WinSock, StdCtrls;type
      TForm1 = class(TForm)
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
        function HostToIP(Name: string; var Ip: string): Boolean;
      end;var
      Form1: TForm1;implementation{$R *.dfm}{ TForm1 }function TForm1.HostToIP(Name: string; var Ip: string): Boolean;
    var
      wsdata : TWSAData;
      hostName : array [0..255] of char;
      hostEnt : PHostEnt;
      addr : PChar;
    begin
      WSAStartup ($0101, wsdata);
      try
        gethostname (hostName, sizeof (hostName));
        StrPCopy(hostName, Name);
        hostEnt := gethostbyname (hostName);
        if Assigned (hostEnt) then
          if Assigned (hostEnt^.h_addr_list) then
          begin
            addr := hostEnt^.h_addr_list^;
            if Assigned (addr) then
            begin
              IP := Format ('%d.%d.%d.%d', [byte (addr [0]),
              byte (addr [1]), byte (addr [2]), byte (addr [3])]);
              Result := True;
            end
            else
              Result := False;
          end
          else
            Result := False
        else
        begin
          Result := False;
        end;
      finally
        WSACleanup;
      end;
    end;procedure TForm1.Button1Click(Sender: TObject);
    var
      IP: string;
      DNS: string;
    begin
      DNS := InputBox('输入DNS域名', '主机名称:', '');
      if HostToIp(DNS, IP) then
        showmessage(IP);
    end;end.
      

  6.   

    思路:
    1。得到本机的IP和子网掩码 eg: 192.168.1.18  掩码 255.255.255.0
    2。计算子网的IP范围       eg: 192.168.1.1-192.168.1.254
    3。逐个IP检查,可以使用多线程
      

  7.   

    呵呵,我也有啊
      //得到本机的局域网Ip地址
      Function GetLocalIp(var LocalIp:string): Boolean;
      //通过Ip返回机器名
      Function GetNameByIPAddr(IPAddr: string; var MacName: string): Boolean ;
      //获取网络中SQLServer列表
      Function GetSQLServerList(var List: Tstringlist): Boolean;
      //获取网络中的所有网络类型
      Function GetNetList(var List: Tstringlist): Boolean;
      //获取网络中的工作组
      Function GetGroupList(var List: TStringList): Boolean;
      //获取工作组中所有计算机
      Function GetUsers(GroupName: string; var List: TStringList): Boolean;
      //获取网络中的资源
      Function GetUserResource(IpAddr: string; var List: TStringList): Boolean;
      //映射网络驱动器
      Function NetAddConnection(NetPath: Pchar; PassWord: Pchar;LocalPath: Pchar): Boolean;
      //检测网络状态
      Function CheckNet(IpAddr:string): Boolean;
      //检测机器是否登入网络
      Function CheckMacAttachNet: Boolean;  //判断Ip协议有没有安装   这个函数有问题
      Function IsIPInstalled : boolean;
      //检测机器是否上网
      Function InternetConnected: Boolean;//关闭网络连接  
      function NetCloseAll:boolean;