全分送出寻找一个扫描 计算机名 ip 和mac的程序 并把扫描到的数据放入数据库
程序只有一个服务端。没有客户端的那种。我看别的软件都可以实现。
高手们帮帮忙。

解决方案 »

  1.   

    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs,nb30, StdCtrls;type
       PASTAT = ^TASTAT;
       TASTAT = record
       adapter : TAdapterStatus;
       name_buf : TNameBuffer;
    end;  TForm1 = class(TForm)
        Button1: TButton;
        Edit1: TEdit;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
        function Getmac:string;
        function MacStr():String;
        function PartitionString(StrV,PrtSymbol: string): TStringList;
      end;var
      Form1: TForm1;
    implementation{$R *.dfm}function TForm1.Getmac:string;
    var
       ncb : TNCB;
       s:string;
       adapt :TASTAT;
       lanaEnum : TLanaEnum;
       i, j, m : integer;
       strPart, strMac : string;
    begin
    FillChar(ncb, SizeOf(TNCB), 0);
       ncb.ncb_command := Char(NCBEnum);
       ncb.ncb_buffer := PChar(@lanaEnum);
       ncb.ncb_length := SizeOf(TLanaEnum);
       s:=Netbios(@ncb);
       for i := 0 to integer(lanaEnum.length)-1 do
       begin
         FillChar(ncb, SizeOf(TNCB), 0);
         ncb.ncb_command := Char(NCBReset);
         ncb.ncb_lana_num := lanaEnum.lana[i];
         Netbios(@ncb);
         Netbios(@ncb);
         FillChar(ncb, SizeOf(TNCB), 0);
         ncb.ncb_command := Chr(NCBAstat);
         ncb.ncb_lana_num := lanaEnum.lana[i];
         //ncb.ncb_callname := '*                ';
         StrCopy(ncb.ncb_callname,pchar('*                '));
         ncb.ncb_buffer := PChar(@adapt);
         ncb.ncb_length := SizeOf(TASTAT);
         m:=0;
         if (Win32Platform = VER_PLATFORM_WIN32_NT) then
         m:=1;
         if m=1 then
         begin
         if Netbios(@ncb) = Chr(0) then
           strMac := '';
           for j := 0 to 5 do
           begin
             strPart := IntToHex(integer(adapt.adapter.adapter_address[j]), 2);
             strMac := strMac + strPart + '-';
           end;
           SetLength(strMac, Length(strMac)-1);
         end;
       if m=0 then
         if Netbios(@ncb) <> Chr(0) then
         begin
           strMac := '';
           for j := 0 to 5 do
           begin
             strPart := IntToHex(integer(adapt.adapter.adapter_address[j]), 2);
             strMac := strMac + strPart + '-';
           end;
           SetLength(strMac, Length(strMac)-1);
         end;
       end;
    result:=strmac;
    end;function TForm1.PartitionString(StrV,PrtSymbol: string): TStringList;
    var
       iTemp: integer;
    begin
       result := TStringList.Create;
       iTemp := pos(PrtSymbol,StrV);
       while iTemp>0 do begin
         if iTemp>1 then result.Append(copy(StrV,1,iTemp-1));
         delete(StrV,1,iTemp+length(PrtSymbol)-1);
         iTemp := pos(PrtSymbol,StrV);
       end;
       if Strv<>'' then result.Append(StrV);
    end;
    function TForm1.MacStr():String;
    var
       Str:TStrings;
       i:Integer;
       MacStr:String;
    begin
       MacStr:='';
       Str:=TStringList.Create;
       Str:=PartitionString(Getmac,'-');
       for i:=0 to Str.Count-1 do
         MacStr:=MacStr+Str[i];
       Result:=MacStr;
    end;procedure TForm1.Button1Click(Sender: TObject);
    begin
    Edit1.text:=MacStr;//集成和非集成网卡
    end;end.
      

  2.   

    做一个arp请求的包就可以了,设置好ip段,全段的ip都发arp请求,有响应的就可以知道ip和mac了;
    至于计算机名得看其他计算机支持与否了。
      

  3.   

    3楼的代码好像无用!!!这个是搜索局网计算机信息的程序!!!你的代码 点button没反应!!
      

  4.   

    阿太  帮帮忙行不.!!!arp请求的包不会弄
      

  5.   

    发arp包也可以
    还有个思路,设置IP段,用icmp探测机器是否开机,然后根据IP获得mac及计算机名
      

  6.   

    楼上的用icmp不大可靠,因为现在很多都有防火墙,封了icmp包,但是arp基本上不会给封的,除非有
    arp欺骗或者不想联网了。
      

  7.   

    有本书叫做《Visual C++网络程序设计实例详解》,里面有说到ARP扫描的,你可以看看,网上应该有代码,你找找看。
      

  8.   

    留下你的Email,我给你Winpcap的,很快的,大概只要一秒钟
      

  9.   

    呵呵,我要,[email protected]
      

  10.   

    计算机名和IP地址都很容易能够获取到,只是MAC获取的麻烦些,不过用ARP很容易实现的
      

  11.   

    这个是用ARP获取MAC的,其他的功能我想没什么好说的,有本叫 《delphi网络通信协议分析与应用实现》里面有你想要的东西
    另外给个参考http://www.delphibbs.com/keylife/iblog_show.asp?xid=28527
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;type
      TMacAddress = array[1..8] of byte;
      PTMibIPNetRow = ^TMibIPNetRow;
      TMibIPNetRow = packed record
        dwIndex: DWord;
        dwPhysAddrLen: DWord;
        bPhysAddr: TMACAddress;
        dwAddr: DWord;
        dwType: DWord;
      end;
      //
      PTMibIPNetTable = ^TMibIPNetTable;
      TMibIPNetTable = packed record
        dwNumEntries: DWORD;
        Table: array [0..0] of TMibIPNetRow;
      end;  TForm1 = class(TForm)
        Memo1: TMemo;
        Button1: TButton;
        Edit1: TEdit;
        procedure Button1Click(Sender: TObject);
        procedure FormCreate(Sender: TObject);
      private
        { Private declarations }
        procedure Get_ARPTable( List: TStrings );
        function MacAddr2Str( MacAddr: TMacAddress; size: integer ): string;
        function IpAddr2Str( IPAddr: DWORD ): string;
        function Str2IpAddr( IPStr: string ): DWORD;
        function NextToken( var s: string; Separator: string ): string;
      public
        { Public declarations }
      end;const
        ARPEntryType  : array[1..4] of string = ( 'Other', 'Invalid', 'Dynamic', 'Static');
    var
      Form1: TForm1;implementation{$R *.dfm}
    function GetRTTAndHopCount( DestIPAddress: DWORD; HopCount: PULONG; MaxHops: ULONG; RTT: PULONG ): BOOL;  stdCall; external 'IPHLPAPI.DLL';
    function GetIpNetTable( pIpNetTable: PTMibIPNetTable; pdwSize: PULONG;  bOrder: BOOL ): DWORD; stdcall; external 'IPHLPAPI.DLL';procedure TForm1.Get_ARPTable( List: TStrings );
    var
        IPNetRow      : TMibIPNetRow;
        TableSize     : DWORD;
        NumEntries    : DWORD;
        ErrorCode     : DWORD;
        i             : integer;
        pBuf          : PChar;
    begin
        NumEntries := 0;
        if not Assigned( List ) then EXIT;
        List.Clear;
        //首先取得列表所需内存的大小
        TableSize := 0;
        pBuf := nil;
        ErrorCode := GetIPNetTable( PTMIBIpNetTable( pBuf ), @TableSize, false );
        if ErrorCode = ERROR_NO_DATA then
        begin
            List.Add( ' ARP-cache empty.' );
            EXIT;
        end;
        //取得列表
        GetMem( pBuf, TableSize );
        ErrorCode := GetIpNetTable( PTMIBIPNetTable( pBuf ), @TableSize, false );
        if ErrorCode = NO_ERROR then
        begin
            NumEntries := PTMIBIPNetTable( pBuf )^.dwNumEntries;
            if NumEntries > 0 then
            begin
                inc( pBuf, SizeOf( DWORD ) );
                for i := 1 to NumEntries do
                begin
                    IPNetRow := PTMIBIPNetRow( PBuf )^;
                    with IPNetRow do
                    List.Add( Format( '%8x | %12s | %16s| %10s',
                        [dwIndex, MacAddr2Str( bPhysAddr, dwPhysAddrLen ),
                        IPAddr2Str( dwAddr ), ARPEntryType[dwType]]));
                    inc( pBuf, SizeOf( IPNetRow ) );
                end;
            end
            else
                List.Add( ' ARP-cache empty.' );
        end
        else
            List.Add( SysErrorMessage( ErrorCode ) );
        dec( pBuf, SizeOf( DWORD ) + NumEntries * SizeOf( IPNetRow ) );
        FreeMem( pBuf );
    end;function TForm1.MacAddr2Str( MacAddr: TMacAddress; size: integer ): string;
    var
      i             : integer;
    begin
      if Size = 0 then
      begin
        Result := '00-00-00-00-00-00';
        EXIT;
      end
      else Result := '';
      //
      for i := 1 to Size do
        Result := Result + IntToHex( MacAddr[i], 2 ) + '-';
      Delete( Result, Length( Result ), 1 );
    end;
    // -----------------------------------------------------------------------------
    function TForm1.IpAddr2Str( IPAddr: DWORD ): string;
    var
      i             : integer;
    begin
      Result := '';
      for i := 1 to 4 do
      begin
        Result := Result + Format( '%3d.', [IPAddr and $FF] );
        IPAddr := IPAddr shr 8;
      end;
      Delete( Result, Length( Result ), 1 );
    end;procedure TForm1.Button1Click(Sender: TObject);
    var
        IPadr         : Int64;
        Rtt, HopCount : longint;
    begin
      TButton(Sender).Enabled := False;
      Rtt := 0;
      HopCount := 0;
      IPadr := Str2IpAddr( Trim(Edit1.Text) ); // inet_addr 函数
      if GetRTTAndHopCount( IPadr, @HopCount, 3, @RTT )  then
        Get_ARPTable(Memo1.Lines)
      else
        Memo1.Lines.Add('超时')
       TButton(Sender).Enabled  := True;
    end;function TForm1.Str2IpAddr( IPStr: string ): DWORD;
    var
      i             : integer;
      Num           : DWORD;
      intRec : Integer;
    begin
      Result := 0;
      for i := 1 to 4 do
      try
        intRec := StrToInt( NextToken( IPStr, '.') );
        Num := DWORD((intRec) shl 24);
        Result := DWORD( Result shr 8 ) or Num;
      except
        Result := 0;
      end;
    end;function TForm1.NextToken( var s: string; Separator: string ): string;
    var
      Sep_Pos       : Integer;
    begin
      Result := '';
      if length( s ) > 0 then begin
        Sep_Pos := pos( Separator, s );
        if Sep_Pos > 0 then begin
          Result := copy( s, 1, Pred( Sep_Pos ) );
          Delete( s, 1, Sep_Pos );
        end
        else begin
          Result := s;
          s := '';
        end;
      end;
    end;procedure TForm1.FormCreate(Sender: TObject);
    begin
      Edit1.Text := '192.168.1.1';
    end;end.
      

  12.   

    sdn13907486733
    [email protected]
    给我一个吧   谢谢了!