private void button1_Click(object sender, System.EventArgs e)
{
this.button1.Enabled=false;
string mystartIP="192.168.0.";
string myip;
int s,end;
string name,mymac;
for(s=1;s<=255;s++)
{
myip=mystartIP +s.ToString();
//转换IP地址
IPAddress myscanip=IPAddress.Parse(myip);
try
{
System.Windows.Forms.Application.DoEvents();
IPHostEntry myscanhost=Dns.GetHostByAddress(myscanip);
name=myscanhost.HostName.ToString();
this.listBox1.Items.Add(myip +" " +name);
}
catch(Exception myerror)
{
}
}
} 这样写程度太慢了~ 还有就是如果我指定一个IP断:比如:192。168。1。113--192。168。1。116 114 115 是在线的` 但我一个也找不到,说什么机器积极什么来着 就获取不到了` 请教DX 我要怎么写才能获取当前局域网内在线的机器IP和 MAC地址呢
另外这个文章不知道你能用到不:
http://hi.baidu.com/dangzhang/blog/item/846c36faff57a518a9d3115f.html
这个是在web下获取客户端及服务器端所有信息的。PS:
你可以多看看msdn里的net命名空间。
模仿arp攻击。。
我没做过,提供一种思路
首先虚拟广播报文,把自己的ip和mac设置为 网关。发送此广播报文,这样局域网内所有的流量都会蜂拥而至到你的机器上,你再分析报文,取出IP\MAC。
这个肯定要用多线程。
建立一种合理的数据结构用来存储报文,再建立一种数据结构存储IP和MAC。
循环开始根据tcp\ip报文的结构,检索报文,得到IP/MAC的地址。
如果ip/mac地址不在存放IP/MAC地址的数据结构中(遍历该数据结构),
则把地址存入数据结构。
循环结束。
显示IP/MAC列表。此种方法对于使用防止ARP攻击工具(如360和anti-arp)的机器不适应,因为当该机器收到广播报文的时候,会提示有arp攻击产生。PS:期待高人的解决方案。
@echo off &setlocal enabledelayedexpansion
title 局域网空闲IP查询@bbs.bathome.cn
Rem '/*========获取本机的IP地址(局域网)=========*/
echo 正在获取本机的IP地址,请稍等...
for /f "tokens=3 skip=2 delims=: " %%i in ('nbtstat -n') do (
set "IP_addr=%%i"
set IP_addr=!IP_addr:~1,-1!
echo 本机IP为:!IP_addr!
goto :next
) :next
for /f "delims=. tokens=1,2,3,4" %%i in ("%IP_addr%") do set IP_fd=%%i.%%j.%%k
Rem '/*========获取计算机名============*/
echo.&echo 正在获取局域网内计算机名,请稍等...
echo 处于网段 %IP_fd%.* 的计算机有:&echo.
for /f "delims=" %%i in ('net view') do (
set "var=%%i"
rem ----------获取计算机名称------------
if "!var:~0,2!"=="\\" (
set "var=!var:~2!"
echo !var!
Rem ----------ping计算机名--------------
ping -n 1 !var!>nul
)
)
echo.&echo -----------------------------
Rem '/*========提取arp缓存=========*/
echo.&echo 正在获取局域网内计算机IP,请稍等...& echo.
for /f "skip=3 tokens=1,* delims= " %%i in ('arp -a') do echo IP: %%i 已经使用 echo.&echo -----------------------------
echo 程序完成,谢谢使用!
pause>nul
利用网关所维护的IP\MAC表。
步骤:
1.PING目标机器
2.读取本机arp缓存(用arp -a就可以看到IP和MAC的对应了)。
public string GetMac(string IP)
{
string dirResults = "";
ProcessStartInfo psi = new ProcessStartInfo();
Process proc = new Process();
psi.FileName = "nbtstat";
psi.RedirectStandardInput = false;
psi.RedirectStandardOutput = true;
psi.Arguments = "-A " + IP;
psi.UseShellExecute = false;
proc = Process.Start(psi);
dirResults = proc.StandardOutput.ReadToEnd();
proc.WaitForExit();
dirResults = dirResults.Replace("\r", "").Replace("\n", "").Replace("\t", "");
Regex reg = new Regex("Mac[ ]{0,}Address[ ]{0,}=[ ]{0,}(?<key>((.)*?))__MAC", RegexOptions.IgnoreCase | RegexOptions.Compiled);
Match mc = reg.Match(dirResults + "__MAC"); if (mc.Success)
{ return mc.Groups["key"].Value; }
else
{
reg = new Regex("Host not found", RegexOptions.IgnoreCase | RegexOptions.Compiled);
mc = reg.Match(dirResults);
if (mc.Success)
{
return "Host not found!";
}
else
{ return ""; }
}
}
“
还有一个比较土的办法:
利用网关所维护的IP\MAC表。
步骤:
1.PING目标机器
2.读取本机arp缓存(用arp -a就可以看到IP和MAC的对应了)。
”
我写了个例程:using System;
using System.Collections.Generic;
using System.Text;
using System.Diagnostics;
using System.ComponentModel;
using System.Threading;
namespace IpMacScan
{
class Program
{
static void Main(string[] args)
{
for(int i=1;i<255;i++)
{
Process.Start("ping"," 192.168.1."+i.ToString());
Thread.Sleep(100);
} Process.Start("arp"," -a >c:\\ip.txt");
}
}
}
Interface: 192.168.1.45 --- 0x3
Internet Address Physical Address Type
192.168.1.10 00-1e-90-29-0e-af dynamic
192.168.1.88 00-e0-4c-75-5d-96 dynamic
192.168.1.193 00-0d-88-f5-65-00 dynamic
192.168.1.200 00-14-22-b8-36-20 dynamic
192.168.1.208 00-01-fb-00-82-b0 dynamic
192.168.1.213 00-1c-23-0a-38-08 dynamic
192.168.1.214 00-1c-23-31-70-be dynamic
192.168.1.217 00-17-31-81-c1-77 dynamic
192.168.1.219 00-1d-0f-0e-c9-73 dynamic
192.168.1.223 00-1d-7d-94-4e-49 dynamic
192.168.1.226 00-16-d3-47-32-6e dynamic
192.168.1.227 08-10-74-13-4f-c5 dynamic
192.168.1.229 00-1d-7d-94-4e-2c dynamic
192.168.1.239 00-1e-e5-5a-0f-3a dynamic
192.168.1.247 00-1a-4b-5e-12-ba dynamic
192.168.1.250 00-14-78-97-c7-9a dynamic
192.168.1.253 00-19-e0-f7-09-01 dynamic
Interface: 192.168.1.45 --- 0x3
Internet Address Physical Address Type
192.168.1.10 00-1e-90-29-0e-af dynamic
192.168.1.88 00-e0-4c-75-5d-96 dynamic
192.168.1.193 00-0d-88-f5-65-00 dynamic
192.168.1.200 00-14-22-b8-36-20 dynamic
192.168.1.208 00-01-fb-00-82-b0 dynamic
192.168.1.213 00-1c-23-0a-38-08 dynamic
192.168.1.214 00-1c-23-31-70-be dynamic
192.168.1.217 00-17-31-81-c1-77 dynamic
192.168.1.219 00-1d-0f-0e-c9-73 dynamic
192.168.1.223 00-1d-7d-94-4e-49 dynamic
192.168.1.226 00-16-d3-47-32-6e dynamic
192.168.1.227 08-10-74-13-4f-c5 dynamic
192.168.1.229 00-1d-7d-94-4e-2c dynamic
192.168.1.239 00-1e-e5-5a-0f-3a dynamic
192.168.1.247 00-1a-4b-5e-12-ba dynamic
192.168.1.250 00-14-78-97-c7-9a dynamic
192.168.1.253 00-19-e0-f7-09-01 dynamic
Interface: 192.168.1.45 --- 0x3
Internet Address Physical Address Type
192.168.1.10 00-1e-90-29-0e-af dynamic
192.168.1.88 00-e0-4c-75-5d-96 dynamic
192.168.1.193 00-0d-88-f5-65-00 dynamic
192.168.1.200 00-14-22-b8-36-20 dynamic
192.168.1.208 00-01-fb-00-82-b0 dynamic
192.168.1.213 00-1c-23-0a-38-08 dynamic
192.168.1.214 00-1c-23-31-70-be dynamic
192.168.1.217 00-17-31-81-c1-77 dynamic
192.168.1.219 00-1d-0f-0e-c9-73 dynamic
192.168.1.223 00-1d-7d-94-4e-49 dynamic
192.168.1.226 00-16-d3-47-32-6e dynamic
192.168.1.227 08-10-74-13-4f-c5 dynamic
192.168.1.229 00-1d-7d-94-4e-2c dynamic
192.168.1.239 00-1e-e5-5a-0f-3a dynamic
192.168.1.247 00-1a-4b-5e-12-ba dynamic
192.168.1.250 00-14-78-97-c7-9a dynamic
192.168.1.253 00-19-e0-f7-09-01 dynamic
http://blog.csdn.net/wzuomin/archive/2007/06/14/1652558.aspx
希望对你有帮助
那个ping目标机器,然后读取arp缓存的办法我觉得还是比较简单的。
我说的是局玉网里面当前开机的机器`不开机的不取他的IP 和MAC地址`是这样的
/// 获取远程计算机的MAC地址(不管目标IP机器是否在线,都能很快的返回结果)
/// </summary>
/// <param name="ipRemote">远程机器的IP</param>
/// <param name="ipLocal">本机的IP</param>
/// <returns>如果返回值为无效长度或为"00:00:00:00:00:00",则表示目标IP的机器没有开机或开启了防火墙类软件,否则返回目标IP机器的MAC地址</returns>
static public string onGetRemoteMAC(string ipRemote,string ipLocal)
{
Int32 ldest= inet_addr(ipRemote);//目的地的ip
Int32 lhost= inet_addr(ipLocal);//本地的ip
Int64 mac=0;
Int64 len=6;
string macString="";
try
{
//使用SendARP取得MAC地址
int ii=SendARP(ldest,lhost, ref mac, ref len);
//把得到的值转成十六进制
string macTmp=mac.ToString("X12");
string[] macArray=new string[6];
for (int i=0;i<6;i++)
macArray[i]=macTmp.Substring(2*i,2); for (int i=5;i>=0;i--)
{
macString=macString+macArray[i];
if (i>0)
macString=macString+":";
}
}
catch(Exception exc)
{
Yj_CommonVar.onShowMessagebox(exc);
}
return macString;
}/// <summary>
/// 根据IP地址获取主机名(注意:如果指定的hostName不在线则可能需要花费较长时间才能返回)
/// </summary>
/// <param name="removeIP"></param>
/// <returns></returns>
static public string onGetHostNameByIP(string removeIP)
{
string hostNameStr="";
try
{
IPAddress ip=IPAddress.Parse(removeIP);
IPHostEntry hostName=Dns.GetHostByAddress(ip);
hostNameStr=hostName.HostName;
}
catch
{
hostNameStr="";
}
return hostNameStr;
}private ArrayList ipArr=new ArrayList();
private void onStartScan()
{
this.bScan.Enabled=false;
string localIP=Yj_CommonVar.CurrInIP;
string ipStartStr=teStartIP.Text.Split('.')[0]+"."+teStartIP.Text.Split('.')[1]+"."+teStartIP.Text.Split('.')[2]+".";
int startIp=Convert.ToInt32(teStartIP.Text.Split('.')[3]);
int endIp=Convert.ToInt32(teEndIP.Text.Split('.')[3]);
for(int i=startIp;i<=endIp;i++)
{
string ipStr=ipStartStr+i.ToString();
if (ipArr.Contains(ipStr))
{
ipArr.Remove(ipStr);
DataRow drN=ds.Tables[0].NewRow();
DateTime startDT=DateTime.Now;
string removeMac=Yj_NetTools.onGetRemoteMAC(ipStr,localIP);
drN["IP"]=ipStr;
if (removeMac.Length>0 && removeMac!="00:00:00:00:00:00")
{
string hostName=Yj_NetTools.onGetHostNameByIP(ipStr);
drN["HOSTNAME"]=hostName;
drN["ISONLINE"]=true;
drN["MAC"]=removeMac;
}
else
drN["ISONLINE"]=false;
TimeSpan ts=DateTime.Now-startDT;
drN["USETIME"]=(ts.Milliseconds<10?"<10":ts.Milliseconds.ToString());
ds.Tables[0].Rows.Add(drN);
Yj_CommonVar.onSendMessageUpdateMainStatusPro(ipArr.Count);
}
}
this.bScan.Enabled=true;
}
private void bScan_Click(object sender, System.EventArgs e)
{
#region 构建数据表
DataTable dt=new DataTable("IPList");
dt=Yj_CommonVar.onAddIdAndRowNoColumns(dt);
dt.Columns.Add("ISONLINE",typeof(bool));
dt.Columns.Add("IP",typeof(string));
dt.Columns.Add("HOSTNAME",typeof(string));
dt.Columns.Add("MAC",typeof(string));
dt.Columns.Add("USETIME",typeof(string));
DataColumn[] priKeys=new DataColumn[1];
priKeys[0]=dt.Columns["IP"];
dt.PrimaryKey=priKeys;
this.onInitGridViewData(dt);
#endregion string ipStartStr=teStartIP.Text.Split('.')[0]+"."+teStartIP.Text.Split('.')[1]+"."+teStartIP.Text.Split('.')[2]+".";
int startIp=Convert.ToInt32(teStartIP.Text.Split('.')[3]);
int endIp=Convert.ToInt32(teEndIP.Text.Split('.')[3]);
for(int i=startIp;i<=endIp;i++)
ipArr.Add(ipStartStr+i.ToString());
int j=0;
Yj_CommonVar.onSendMessageUpdateMainStatusPro(endIp-startIp,endIp-startIp);
while (j<Convert.ToInt32(seThreadNum.Text))
{
Thread _Scan_=new Thread(new ThreadStart(onStartScan));
_Scan_.Start();
j++;
}
}
什么叫在线机器啊,不明白!哈哈
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.Net;
using System.Net.Sockets;
using System.DirectoryServices;namespace ipcheck
...{
//private System.ComponentModel.Container components = null;
public partial class MainForm : Form
...{
public MainForm()
...{
InitializeComponent();
}
[DllImport("Iphlpapi.dll")]
private static extern int SendARP(Int32 dest, Int32 host, ref Int64 mac, ref Int32 length);
[DllImport("Ws2_32.dll")]
private static extern Int32 inet_addr(string ip);
private string macAddress,ipAddress; private bool canPing = false;
private string GetMacAddress() // 得到指定IP的MAC地址
...{
Int32 ldest = 0;
try
...{
ldest = inet_addr(ipAddress);
}
catch (Exception iperr)
...{
MessageBox.Show(iperr.Message);
}
Int64 macinfo = new Int64();
Int32 len = 6;
try
...{
int res = SendARP(ldest, 0, ref macinfo, ref len);
}
catch (Exception err)
...{
// throw new Exception("在解析MAC地址过程发生了错误!");
MessageBox.Show(err.Message);
}
string originalMACAddress = macinfo.ToString("X4");
if (originalMACAddress != "0000" && originalMACAddress.Length == 12)
...{ //合法MAC地址
string mac1, mac2, mac3, mac4, mac5, mac6;
mac1 = originalMACAddress.Substring(10, 2);
mac2 = originalMACAddress.Substring(8, 2);
mac3 = originalMACAddress.Substring(6, 2);
mac4 = originalMACAddress.Substring(4, 2);
mac5 = originalMACAddress.Substring(2, 2);
mac6 = originalMACAddress.Substring(0, 2);
macAddress = mac1 + "-" + mac2 + "-" + mac3 + "-" + mac4 + "-" + mac5 + "-" + mac6;
canPing = true;
}
else
...{
macAddress = "无法探测到MAC地址";
canPing = false;
}
return macAddress;
}
private void tbar_ButtonClick(object sender, ToolBarButtonClickEventArgs e)
...{
switch (e.Button.Name)
...{
case "Btn_search":
int i = 0;
DirectoryEntry root = new DirectoryEntry("WinNT:");
DirectoryEntries domains = root.Children;
domains.SchemaFilter.Add("domain");
foreach (DirectoryEntry domain in domains)
...{
this.g_list.Items.Add(domain.Name.ToString());
DirectoryEntries computers = domain.Children;
computers.SchemaFilter.Add("computer");
foreach (DirectoryEntry computer in computers)
...{
this.Grid_view.Rows.Add();
this.Grid_view.Rows[i].Cells[0].Value = i + 1;
this.Grid_view.Rows[i].Cells[1].Value = computer.Name.ToString();
IPHostEntry iphe = null;
try
...{
iphe = Dns.GetHostByName(computer.Name.ToString());
this.Grid_view.Rows[i].Cells[2].Value = iphe.AddressList[0].ToString();
ipAddress = iphe.AddressList[0].ToString();
this.Grid_view.Rows[i].Cells[3].Value = GetMacAddress(); }
catch
...{
continue;
}
this.Grid_view.Rows[i].Cells[4].Value = domain.Name.ToString();
i++;
}
}
break;
}
}
}
}
这个看一下吧