| 利用dns類和WMI規範擷取IP及MAC地址 在C#編程中,要擷取主機名稱和主機IP地址,是比較容易的.它提供的Dns類,可以輕鬆的取得主機名稱和IP地址. 樣本: string strHostName = Dns.GetHostName(); //得到原生主機名稱 IPHostEntry ipEntry = Dns.GetHostByName(strHostName); //取得本機IP string strAddr = ipEntry.AddressList[0].ToString(); //假設本地主機為單網卡 在這段代碼中使用了兩個類,一個是Dns類,另一個為IPHostEntry類,二者都存在於命名空間System.Net中. Dns類主要是從網域名稱系統(DNS)中檢索關於特定主機的資訊,上面的代碼第一行就從本地的DNS中檢索出本地主機名稱. IPHostEntry類則將一個網域名稱系統或主機名稱與一組IP地址相關聯,它與DNS類一起使用,用於擷取主機的IP地址組. 要擷取遠程主機的IP地址,其方法也是大同小異. 在擷取了IP地址後,如果還需要取得網卡的MAC地址,就需要進一步探究了. 這裡又分兩種情況,一是本機MAC地址,二是遠程主機MAC地址.二者的擷取是完全不同的. 在擷取原生MAC地址時,可以使用WMI規範,通過SELECT語句提取MAC地址.在.NET架構中,WMI規範的實現定義在System.Management命名空間中. ManagementObjectSearcher類用於根據指定的查詢檢索管理對象的集合 ManagementObjectCollection類為管理對象的集合,下例中由檢索對象返回管理對象集合賦值給它. 樣本: ManagementObjectSearcher query =new ManagementObjectSearcher("SELECT * FROM Win32_NetworkAdapterConfiguration") ; ManagementObjectCollection queryCollection = query.Get(); foreach( ManagementObject mo in queryCollection ) { if(mo["IPEnabled"].ToString() == "True") mac = mo["MacAddress"].ToString(); } 擷取遠程主機的MAC地址時,需要借用API函數SendARP.該函數使用ARP協議,向目的主機發送ARP包,利用返回並儲存在快取中的IP和MAC地址對,從而擷取遠程主機的MAC地址. 樣本: Int32 ldest= inet_addr(remoteIP); //目的ip Int32 lhost= inet_addr(localIP); //本地ip try { Int64 macinfo = new Int64(); Int32 len = 6; int res = SendARP(ldest,0, ref macinfo, ref len); //發送ARP包 return Convert.ToString(macinfo,16); } catch(Exception err) { Console.WriteLine("Error:{0}",err.Message); } return 0.ToString(); 但使用該方式擷取MAC時有一個很大的限制,就是只能擷取同網段的遠程主機MAC地址.因為在標準網路通訊協定下,ARP包是不能跨網段傳輸的,故想通過ARP協議是無法查詢跨網段裝置MAC地址的。 樣本程式: using System.Net; using System; using System.Management; using System.Runtime.InteropServices; public class getIP { [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); //擷取原生IP public string getLocalIP() { string strHostName = Dns.GetHostName(); //得到原生主機名稱 IPHostEntry ipEntry = Dns.GetHostByName(strHostName); //取得本機IP string strAddr = ipEntry.AddressList[0].ToString(); return(strAddr); } //擷取原生MAC public string getLocalMac() { string mac = null; ManagementObjectSearcher query =new ManagementObjectSearcher("SELECT * FROM Win32_NetworkAdapterConfiguration") ; ManagementObjectCollection queryCollection = query.Get(); foreach( ManagementObject mo in queryCollection ) { if(mo["IPEnabled"].ToString() == "True") mac = mo["MacAddress"].ToString(); } return(mac); } //擷取遠程主機IP public string[] getRemoteIP(string RemoteHostName) { IPHostEntry ipEntry = Dns.GetHostByName(RemoteHostName); IPAddress[] IpAddr = ipEntry.AddressList; string[] strAddr = new string[IpAddr.Length]; for (int i=0;i<IPADDR.LENGTH;I++) { strAddr[i] = IpAddr[i].ToString(); } return(strAddr); } //擷取遠程主機MAC public string getRemoteMac(string localIP, string remoteIP) { Int32 ldest= inet_addr(remoteIP); //目的ip Int32 lhost= inet_addr(localIP); //本地ip try { Int64 macinfo = new Int64(); Int32 len = 6; int res = SendARP(ldest,0, ref macinfo, ref len); return Convert.ToString(macinfo,16); } catch(Exception err) { Console.WriteLine("Error:{0}",err.Message); } return 0.ToString(); } public static void Main(string[] args) { getIP gi = new getIP(); Console.WriteLine("本地網卡資訊:"); Console.WriteLine(gi.getLocalIP() + " - " + gi.getLocalMac()); Console.WriteLine("\n\r遠程網卡資訊:"); string[] temp = gi.getRemoteIP("scmobile-tj2"); for(int i=0;i<TEMP.LENGTH;I++) { Console.WriteLine(temp[i]); } Console.WriteLine(gi.getRemoteMac("192.168.0.3","192.168.0.1")); } } |