一、通过WMI获取物理适配器序号

NetEnabled: 是否启用了适配器,True为启用,False为禁用;
PhysicalAdapter: 适配器是否物理或逻辑适配器,True为物理,False为逻辑;

 public static List<int> GetUseIndex()
{
List<int> list = new List<int>();
ManagementClass mc = new ManagementClass("Win32_NetworkAdapter");
ManagementObjectCollection moc = mc.GetInstances();
foreach (ManagementObject mo in moc)
{
bool p1 = Convert.ToBoolean(mo["NetEnabled"]);
bool p2 = Convert.ToBoolean(mo["PhysicalAdapter"]);
if (p1 && p2)
{
list.Add(Convert.ToInt32((mo["Index"])));
}
}
return list;
}

二、过滤虚拟网卡、无线网卡

通过“Characteristics”这个值来确定网卡的类型是虚拟网卡还是物理网卡。Characteristics 值在注册表在HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Class\{4d36e972-e325-11ce-bfc1-08002be10318}\【连接索引号】\下,在windows中,Characteristics 的取值如下,Characteristics项可以有1个或多个如下的值(多值应计算总和):【备注:在Windows7和Windows10下确认,Characteristics为dword,不可能多个值,这里的多个值,计算总和暂时未知。】

0x1

NCF_VIRTUAL

说明组件是个虚拟适配器

0x2

NCF_SOFTWARE_ENUMERATED

说明组件是一个软件模拟的适配器

0x4

NCF_PHYSICAL

说明组件是一个物理适配器

0x8

NCF_HIDDEN

说明组件不显示用户接口

0x10

NCF_NO_SERVICE

说明组件没有相关的服务(设备驱动程序)

0x20

NCF_NOT_USER_REMOVABLE

说明不能被用户删除(例如,通过控制面板或设备管理器)

0x40

NCF_MULTIPORT_INSTANCED_ADAPTER

说明组件有多个端口,每个端口作为单独的设备安装。每个端口有自己的hw_id(组件ID) 并可被单独安装,这只适合于EISA适配器

0x80

NCF_HAS_UI

说明组件支持用户接口(例如,Advanced Page或Customer Properties Sheet)

0x400

NCF_FILTER

说明组件是一个过滤器

如果是物理网卡:Characteristics & NCF_PHYSICAL ==NCF_PHYSICAL

判断有线网卡和无线网卡,注册表路径:HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Class\{4d36e972-e325-11ce-bfc1-08002be10318}\【连接索引号】\Ndi\Interfaces

路径下的键值:LowerRange,如果Value包含wifi或者wlan,(验证的两台设备Value=“wlan,ethernet,vwifi”),表示无线网卡,具体代码如下:

        public static bool GetWiredIndex(ref int index, ref string msg)
{
try
{
List<int> allenable = GetUseIndex();
if (allenable.Count == )
{
msg = "未查找到有效网络连接";
return false;
}
List<int> allReal = new List<int>();
foreach (int ii in allenable)
{
var vv = Convert.ToInt32(GetCharacteristics(@"SYSTEM\ControlSet001\Control\Class\{4d36e972-e325-11ce-bfc1-08002be10318}\000" + ii, "Characteristics"));
if ((vv & 0x4) == 0x4)//区分物理网卡、虚拟网卡
{
allReal.Add(ii);
}
}
if (allReal.Count == )
{
msg = "未查找到有效物理网卡";
return false;
} int rv = -;
foreach (int ii in allReal)
{
var vv = GetCharacteristics(@"SYSTEM\ControlSet001\Control\Class\{4d36e972-e325-11ce-bfc1-08002be10318}\000" + ii + @"\Ndi\Interfaces", "LowerRange").ToString();
if (!vv.Contains("wifi") && !vv.Contains("wlan"))
{
rv = ii;
break;
}
}
if (rv == -)
{
msg = "未查找到有效有线网卡";
return false;
}
else
{
index = rv;
return true;
}
}
catch (Exception ex)
{
msg = ex.Message;
return false;
}
} private static object GetCharacteristics(string name, string key)
{
object registData;
using (RegistryKey hkml = Registry.LocalMachine)
{
RegistryKey software = hkml.OpenSubKey(name, true);
registData = software.GetValue(key).ToString();
}
return registData;
}

三、设置有线网卡IP、子网掩码、网关、DNS

 public static bool SetWiredIP(int index, string ip, string subnetMask, string ipGateway, string dns)
{
        
ManagementBaseObject inPar = null;
ManagementBaseObject outPar = null;
ManagementClass mc = new ManagementClass("Win32_NetworkAdapterConfiguration");
ManagementObjectCollection moc = mc.GetInstances();
foreach (ManagementObject mo in moc)
{
if (Convert.ToInt32(mo["Index"]) == index)
{
//设置ip地址和子网掩码
inPar = mo.GetMethodParameters("EnableStatic");
inPar["IPAddress"] = new string[] { ip };
inPar["SubnetMask"] = new string[] { subnetMask };
outPar = mo.InvokeMethod("EnableStatic", inPar, null); //设置网关地址
inPar = mo.GetMethodParameters("SetGateways");
inPar["DefaultIPGateway"] = new string[] { ipGateway };
outPar = mo.InvokeMethod("SetGateways", inPar, null); //设置DNS
inPar = mo.GetMethodParameters("SetDNSServerSearchOrder");
inPar["DNSServerSearchOrder"] = new string[] { dns };
outPar = mo.InvokeMethod("SetDNSServerSearchOrder", inPar, null);
return true;
}
}
return false;
}

WMI设置有线网卡IP地址的更多相关文章

  1. linux配置网卡IP地址命令详细介绍及一些常用网络配置命令

    linux配置网卡IP地址命令详细介绍及一些常用网络配置命令2010-- 个评论 收藏 我要投稿 Linux命令行下配置IP地址不像图形界面下那么方 便,完全需要我们手动配置,下面就给大家介绍几种配置 ...

  2. CentOS 网络设置修改 指定IP地址 DNS 网关(转)

    CentOS 网络设置修改 指定IP地址 DNS 网关(实测 笔记)   环境: 系统硬件:vmware vsphere (CPU:2*4核,内存2G) 系统版本:Centos-6.5-x86_64 ...

  3. 刚写好的读取多网卡IP地址的函数

    虽然现在一机多网卡已经很普遍(像Notebook带有线.无线.蓝芽等),但是找一个现成的能够一次过读出所有网卡IP地址的函数实在是难,无奈自己写了一个,好东西谁用谁知道. //uses WinSock ...

  4. ubuntu Server 设置主机静态 ip地址

    ubuntu Server 设置主机静态 ip地址 1:先输入 ifconfig 查看当前网络配置 2:然后关闭 eth0 网卡 sudo ifdown eth0 3:配置静态ip sudo vim ...

  5. 从ip addr add和ifconfig的区别看linux网卡ip地址的结构

    今天一个老外在邮件列表上问了一个问题,就是ip addr add和ifconfig的区别,我给他进行了解答,可能因为英语不好吧,解答的很简单,因此我还是要在这里详细说明一下.其实它们之间没有什么区别, ...

  6. 网吧局域网里的设置外网IP地址、设置内网IP地址、限制内网速度和路由器共享

    现在啊,网吧的需求越来越高,同时在经济比较充裕的情况下,作为网吧的老板可能希望打造全千兆的网吧,让每个进入网吧的人都能充分体验高速的感觉,当然更重要的是在同行竞争中处于上游,特别是对网络游戏爱好者的吸 ...

  7. Azure经典门户创建VM,如何设置使用静态IP地址?

    使用 Azure 经典管理门户中创建的虚拟机,无法使用静态IP 地址,在管理界面没有该设置.在新的管理门户中虽然有使用静态IP的设置,但是选项是灰色,无法修改,提示错误:This virtual ma ...

  8. Lodop获取客户端主网卡ip地址是0.0.0.0

    LODOP技术手册的GET_SYSTEM_INFO篇,LODOP可以用语句获取到客户端很多信息,NetworkAdapter.1.IPAddress是主网卡IP地址,通常情况下是没问题的,不过如果当前 ...

  9. 为同一部电脑设置2个IP地址

    为同一部电脑设置2个IP地址 在HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Class\NetTrans下 点击0000.0001,000 ...

随机推荐

  1. java 字符串笔记

    java字符串当中有三个关于字符串对象的类. String 首先谈论下他们各自的含义: 1.String含义为引用数据类型,是字符串常量.是不可变的对象,(显然线程安全)在每次对string类型进行改 ...

  2. C++隐藏任务栏图标

    在VC编程中,有时候我们需要将我们的程序在任务栏上的显示隐藏起来,我试过几种方法,下面我介绍一下我知道的三种方法. 第一种方法是设置窗口WS_EX_TOOLWINDOW扩展样式,通过在OnInitDi ...

  3. js'基础-1

    ---恢复内容开始--- ----------- 1.return <!DOCTYPE html><html lang="en"><head>  ...

  4. Unity 新手入门 如何理解协程 IEnumerator yield

    Unity 新手入门 如何理解协程 IEnumerator 本文包含两个部分,前半部分是通俗解释一下Unity中的协程,后半部分讲讲C#的IEnumerator迭代器 协程是什么,能干什么? 为了能通 ...

  5. Java中BufferedReader、InputStreamReader、Scanner和System.in区别

    Java中获取键盘输入值的方法以前写算法都是C/C++写的,现在用Java写,虽然算法是独立于语言的,但是Java从键盘获取输入确实有些不一样.在C/C++中我们可以用scanf和cin来获取用户从键 ...

  6. 猴子吃桃问题(Java递归实现)

    猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个,第二天早上又将剩下的桃子吃掉一半,又多吃了一个.以后每天早上都吃了前一天剩下的一半零一个.到第10天早上想再吃时,见只剩下 ...

  7. SQL表的自身关联

    SQL表的自身关联 有如下两个数据表: tprt表,组合基本信息表,每个组合有对应的投管人和托管人: tmanager表,管理人信息表,管理人类别由o_type区分: 具体表信息如下所示: tprt表 ...

  8. Python模块1

    序列化模块: 将原本的字典.列表等内容转换成一个字符串的过程就叫做序列化. 序列化的目的 1.以某种存储形式使自定义对象持久化: 2.将对象从一个地方传递到另一个地方. 3.使程序更具维护性. jso ...

  9. 64位 windows2008 R2 上安装32位oracle 10g 的方法

    首先,我们要解除oracle安装的windows版本检测1.编辑安装包内文件  database\stage\prereq\db\refhost.xml 在 <OPERATING_SYSTEM& ...

  10. flask-login模块

    flask-login为flask提供了用户会话管理.他处理了日常的登入,登出并且长时间记住用户的会话. 1.在会话中存储当前活跃的用户ID,让你能够自由地登入和登出. 2.让你限制登入或登出用户可以 ...