C#怎么得到主机名,IP,MAC

一:基础知识

a:

Dns 类

提供简单的域名解析功能。

Dns 类是一个静态类,它从 Internet 域名系统 (DNS) 检索关于特定主机的信息。

在 IPHostEntry 类的实例中返回来自 DNS 查询的主机信息。 如果指定的主机在 DNS 数据库中有多个入口,则

IPHostEntry 包含多个 IP 地址和别名。

b,

Dns.GetHostByName 方法

注意:此 API 现在已过时。

获取指定 DNS 主机名的 DNS 信息。

参数

hostName

类型:System.String

主机的 DNS 名称。

返回值

类型:System.Net.IPHostEntry

一个 IPHostEntry 对象,包含对应于 hostName 中指定的地址的主机信息。

GetHostByName 方法向 Internet DNS 服务器查询主机信息。 如果传递一个空字符串作为主机名,此方法将检索本地计算

机的标准主机名。

若要异步访问 DNS 信息,请使用 BeginGetHostByName 和 EndGetHostByName 方法。

如果把 Ipv6Element.Enabled 属性设置到 true,则返回的 IPHostEntry 实例的 Aliases 属性不由该方法填充,且总为空。

c,

IPHostEntry 类

为 Internet 主机地址信息提供容器类。

IPHostEntry 类将一个域名系统 (DNS) 主机名与一组别名和一组匹配的 IP 地址关联。

IPHostEntry 类作为 Helper 类和 Dns 类一起使用。

d,

IPHostEntry.AddressList 属性

获取或设置与主机关联的 IP 地址列表。

属性值

类型:System.Net.IPAddress[]

一个 IPAddress 类型的数组,包含解析为 Aliases 属性中包含的主机名的 IP 地址。 

e,

& 运算符(C# 参考)

& 运算符既可作为一元运算符也可作为二元运算符。

一元 & 运算符返回操作数的地址(要求 unsafe 上下文)。

为整型和 bool 类型预定义了二进制 & 运算符。 对于整型,& 计算操作数的逻辑按位“与”。 对于 bool 操作数,& 计算操

作数的逻辑“与”;也就是说,当且仅当两个操作数均为 true 时,结果才为 true。

& 运算符计算两个运算符,与第一个操作数的值无关。

f,

System.Management 命名空间

提供对一组丰富的管理信息和管理事件(它们是关于符合 Windows Management Instrumentation (WMI) 基础结构的系统、

设备和应用程序的)的访问。 应用程序和服务可以使用从 ManagementObjectSearcher 和 ManagementQuery 派生的类,

查询感兴趣的管理信息(例如在磁盘上还剩多少可用空间、当前 CPU 利用率是多少、某一应用程序正连接到哪一数据库等

等);或者应用程序和服务可以使用 ManagementEventWatcher 类预订各种管理事件。 这些可访问的数据可以来自分布式

环境中托管的和非托管的组件。

g,

ManagementClass 类

表示公共信息模型 (CIM) 管理类。 管理类是一个 WMI 类,如 Win32_LogicalDisk 和 Win32_Process,前者表示磁盘驱动

器,后者表示进程(如 Notepad.exe)。 通过该类的成员,可以使用特定的 WMI 类路径访问 WMI 数据。 有关更多信息,

请参见“Windows Management Instrumentation”文档中的“Win32 Classes”(Win32 类)

h,

ManagementClass 构造函数 (String)

初始化 ManagementClass 类的一个新实例,将其初始化到给定路径。 该类表示 WMI 中的一个公共信息模型 (CIM) 管理类,如 Win32_LogicalDisk 和 Win32_Process,前者表示磁盘驱动器,后者表示进程(如 Notepad.exe)。 有关更多信息,请参见“Windows Management Instrumentation”文档中的“Win32 Classes”(Win32 类)

.NET Framework 安全性

完全信任直接调用方。 此成员不能由部分信任的代码使用。 

i,

ManagementObjectCollection 类

表示通过 WMI 检索到的管理对象的不同集合。 此集合中的对象为从 ManagementBaseObject 派生的类型,包括

ManagementObject 和 ManagementClass。 通过 ManagementObjectSearcher 对象执行 WMI 查询,或者通过表示指定

类型的 ManagementClass 检索该类型管理对象的枚举,可得到此集合。 此外,这也可能是以指定方式与特定管理对象相关的

管理对象集合 — 在这种情况下,此集合可以通过诸如 GetRelated() 之类的方法检索到。 此集合可以通过

ManagementObjectCollection.ManagementObjectEnumerator 遍历,并且能够针对各种管理任务对集合中的对象进行检查

或操作。 

j,

ManagementClass.GetInstances 方法

返回该类的所有实例的集合。

返回值

类型:System.Management.ManagementObjectCollection

表示该类的实例的 ManagementObject 对象的集合。

.NET Framework 安全性

完全信任直接调用方。 此成员不能由部分信任的代码使用。

k,

ManagementObject 类

表示 WMI 实例。

l,

ManagementBaseObject.Item 属性

通过 [] 符获取对属性值的访问。 此属性是 ManagementBaseObject 类的索引器。 您可以使用由某个类型定义的默认索引属

性,但不能显式定义自己的属性。 但是,在某个类上指定 expando 特性将自动提供一个类型为 Object、索引类型为 String

的默认索引属性。

参数

propertyName

类型:System.String

相关的属性的名称。

属性值

类型:System.Object

返回一个 Object 值,该值包含特定类属性的管理对象

属性值

一个对象实例,它包含所请求的属性的值。

.NET Framework 安全性

完全信任直接调用方。 此成员不能由部分信任的代码使用。

m,

Dns.GetHostEntry 方法 (String)

将主机名或 IP 地址解析为 IPHostEntry 实例。

参数

hostNameOrAddress

类型:System.String

要解析的主机名或 IP 地址。

返回值

类型:System.Net.IPHostEntry

一个 IPHostEntry 实例,包含有关 hostNameOrAddress 中指定的主机的地址信息。 

GetHostEntry 方法在 DNS 服务器中查询与某个主机名或 IP 地址关联的 IP 地址。

当传递一个空字符串作为主机名时,此方法返回本地主机的 IPv4 地址。

如果未能找到主机名,则会返回值为 11001 的 SocketException 异常(Windows 套接字错误

WSAHOST_NOT_FOUND)。 如果 DNS 服务器不响应,则会返回此异常。 如果名称不是正式的主机名或别名,或者在查询的数据库中找不到它,则也会返回此异常。

如果 hostNameOrAddress 参数包含 Any 或 IPv6Any,还会返回 ArgumentException 异常。

GetHostEntry 方法假设如果 IP 字符串在应用程序所需的 hostNameOrAddress 参数中传递,则返回设置了所有属性的IPHostEntry 实例。 这些属性包括:AddressList、Aliases 和 HostName。 因此,当传递 IP 字符串时,实现GetHostEntry 方法将执行以下行为:

1.  该方法尝试分析地址。 如果 hostNameOrAddress 参数包含合法 IP 字符串,则第一阶段将成功。

2.  使用 IP 字符串的 IP 地址的进行反向查找,尝试获取主机名。 此结果设置为 HostName 属性。

3.  再次使用此反向查找到的主机名,获取与该主机名相关联、且设置为 AddressList 属性的所有可能的 IP 地址。

对于 IPv4 字符串,以上三个步骤可能全部成功。 但是,可能返回实际属于其他主机的某个 IPv4 地址的过时 DNS 记录。

这可能导致步骤 3 失败,并引发异常(该 IPv4 地址具有 DNS PTR 记录,但没有 DNS A 记录)。

对于 IPv6,上面的步骤 2 可能失败,因为大多数 IPv6 部署不注册 IPv6 地址的反向 (PTR) 记录。 因此,此方法可能将

IPv6 字符串返回为 HostName 属性中的完全限定域 (FQDN) 主机名。

根据不同的 IP 字符串,GetHostAddresses 方法有不同的行为。 如果上面的步骤 1 成功(成功分析为 IP 地址),则立即

将该地址作为结果返回, 不会尝试进行反向查找。

如果本地计算机上没有安装 IPv6,就会从 GetHostEntry 方法的结果中筛选掉 IPv6 地址。 结果,只要生成 IPv6 结果可用

于参数 hostNameOrAddress,就可能返回一个空的 IPHostEntry 实例。

返回的 Aliases 属性(属于 IPHostEntry 实例)不会由该方法填充,并且始终为空。

当应用程序中启用了网络跟踪时,此成员会发出跟踪信息。

n,

IPAddress.AddressFamily 属性

获取 IP 地址的地址族。

属性值

类型:System.Net.Sockets.AddressFamily

对于 IPv4,返回 InterNetwork;对于 IPv6,返回 InterNetworkV6。

o,

IPAddress 类

提供网际协议 (IP) 地址。

IPAddress 类包含计算机在 IP 网络上的地址。

二:截图,代码

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.Management;//

namespace MyQQ
{
    public partial class Form3 : Form
    {
        public Form3()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            string s = "", mac = "";
            //
            //使用dns得到本地主机名
            //
            string hostInfo = Dns.GetHostName();//使用到dns类

            lstbx_ip.Items.Add("IP地址" + "             " + "MAC地址");
            //得到主机名下的所有ip
            IPAddress[] addressList = Dns.GetHostEntry(hostInfo).AddressList;
            IPAddress localaddress = null;
            foreach (IPAddress _ip in addressList)
            {
                if (_ip.AddressFamily.ToString().ToUpper() == "INTERNETWORK")//判断是否是ipv4其中可以是ipv6
                {
                    localaddress = _ip;
                }
            }

            //下面方法过时了
            //IPAddress[] addressList = Dns.GetHostByName (hostInfo).AddressList;
            //for (int i = 0; i < addressList.Length; i++)
            //{
            //    s += addressList[i].ToString();
            //    lstbx_ip.Items.Add(s);
            //}
            //
            //获取MAC地址
            //


            ManagementClass mc;
            mc = new ManagementClass("Win32_NetworkAdapterConfiguration");//ManagementObjectCollection 类表示通过 WMI 检索到的管理对象的不同集合。 
            ManagementObjectCollection moc = mc.GetInstances();//ManagementClass.GetInstances 方法返回该类的所有实例的集合。

            foreach (ManagementObject mo in moc)
            {
                
                if (mo["IPEnabled"].ToString() == "True")
                    mac = mo["MacAddress"].ToString();
                
            }
            s = localaddress.ToString();
            lstbx_ip.Items.Add(s +"     "+ mac);

        }
    }
}
原文地址:https://www.cnblogs.com/hongmaju/p/3678064.html