news 2026/10/29 11:18:52

Windows Server 2016网卡驱动安装、离线注入与调优避坑

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Windows Server 2016网卡驱动安装、离线注入与调优避坑

简介:这份 Intel 网卡驱动合集面向在 Windows Server 2016 上部署、重装或维护 Intel 板载网卡的装机与运维人员,对应 Intel Network Connections Software Version 26.3,重点解决系统安装后网卡未识别、驱动缺失、设备管理器出现黄色感叹号或版本不匹配造成的网络不通问题,覆盖 Ethernet Connection I217-LM、I217-V、I218-LM、I218-V、I219-LM、I219-V 等常见型号,也可用于旧平台升级和机房物理机维护时快速补齐网络驱动。压缩包共 110 个文件,约 29.02MB,内含 exe 安装程序、htm 说明页面、gif 与 png 界面图示、css 样式及 pdf、txt 文档,便于按型号查找驱动、了解安装向导并核对支持列表与注意事项。已有 7935 人学习下载,说明该版本在实际装机场景中具有一定参考价值。读者可借助安装程序完成驱动部署,结合帮助文档与图示确认适用硬件、安装流程和基本排错方向,减少因网卡驱动缺失导致的反复重启、网络中断与兼容性排查时间,提升服务器交付和日常维护效率。

1. 一台返修机引出的问题

去年帮人收拾一台返修的 2U 机器,系统盘是别人做好的 Windows Server 2016 镜像,开机进系统,设备管理器里挂着两个黄色感叹号,网络连接列表里连一块网卡都看不到。远程进不去,只能抱着显示器蹲在机柜前面。这类故障十有八九与系统本身无关:Windows Server 2016 的内核停在 1607 那个年代,自带驱动库只覆盖到那个时间点前后出厂的少数 server intel 网卡型号,之后的 I350 改版、X540/X550、X710 基本都得手动补驱动。更麻烦的是,很多人把“装上”当成“装好”,网卡灯亮了、IP 配上了就收工,结果跑备份时只有百来兆,回头查半天才发现是巨帧没对齐、RSS 队列只开了一个。下面按我实际的动手顺序走一遍:怎么认出网卡属于哪个驱动家族、INF 包怎么静默装、离线镜像怎么注入、装完之后哪些参数必须调、哪些坑必须提前避开。

2. 先认清网卡:从硬件标识到驱动家族

装驱动这件事,最容易犯的错是“看到 Intel 就去找 Intel 驱动”。同一个厂商下面有五六套互不兼容的驱动家族,INF 装错家族,设备管理器给的反应不是报错,而是“该设备找不到驱动程序”,让人以为包下错了。正确的顺序永远是先拿硬件标识,再倒推家族,最后才去挑包。

2.1 三条路径拿到 VEN/DEV

图形界面那条路最直白:设备管理器里右键带感叹号的设备,属性 → 详细信息 → 硬件 ID,第一行通常长这样PCI\VEN_8086&DEV_1533&SUBSYS_...&REV_01。VEN_8086是厂商编号,DEV_1533才是具体型号,后面那一串子系统 ID 和厂商定制有关,选驱动时用不上,但排错时有用。

有 PowerShell 就别点鼠标,批量场景下更省事:

# 只挑状态异常的网络类设备,感叹号设备一般落在 Error / Unknown 里 Get-PnpDevice -Class Net -Status Error,Unknown,Degraded | Select-Object Status, FriendlyName, InstanceId | Format-List # 把所有网络设备的 VEN/DEV 抠出来,方便一次性对照驱动包 Get-PnpDevice -Class Net | ForEach-Object { if ($_.InstanceId -match 'VEN_([0-9A-F]{4})&DEV_([0-9A-F]{4})') { [pscustomobject]@{ Name = $_.FriendlyName VEN = $Matches[1] DEV = $Matches[2] Stat = $_.Status } } } | Sort-Object VEN, DEV | Format-Table -AutoSize

这段脚本的关键在正则里的两个捕获组。VEN_后面固定四位十六进制,DEV_同理,$Matches[1]和$Matches[2]分别拿到厂商和型号。注意Get-PnpDevice -Class Net只列网络类,插上去但驱动完全没加载的设备有时会落到Unknown甚至别的主机类里,所以第一段命令要单独跑一遍确认没有漏网的。至于系统还没装、进不去桌面的机器,就只能在机箱里看网卡挡板上的丝印,或者插一块能识别的网卡先把系统救活。

2.2 驱动家族对照:e1r、ixn、i40e 各管哪一段

拿到 DEV 之后,对照关系大致是下面这张表。INF 文件名里的前缀是最直观的线索,但别把它当铁律——同一个家族在不同版本的驱动包里,文件名会变,.sys的名字也未必和 INF 一致,最终以 INF 里[Manufacturer]段声明的硬件 ID 为准。

驱动家族(INF 前缀)典型芯片端口形态在 Server 2016 上的常见情况
e1rI350 / I354千兆电口、千兆光口存量机器最多,自带库常常缺
ixnX540 / X550万兆电口需要较新的包才支持 2.5G/5G 协商
i40eX710 / XL710万兆光口、万兆电口SR-IOV、VXLAN 卸载依赖它
e1d82574L / 82583千兆电口老平台板载,偶见
e1iI217 / I218 / I219板载千兆消费级定位,Server 上经常装不上

这张表最有用的地方是帮你排除。比如一台机器读到DEV_1533,你手里只有 i40e 的包,那就不用试了,直接去找 e1r 那套。反过来,一台万兆光口的机器你翻出 e1r 的包去装,安装程序可能一路绿灯,装完设备管理器也不报错,但网卡就是不工作——家族对不上,系统照样认,只是不干活。

2.3 自带还是必须补:翻 INF 的 Manufacturer 段

Server 2016 自带一批网络驱动,判断某块卡是否已经在库里,用Get-NetAdapter看不到的卡不代表没驱动,可能只是没插网线被隐藏了。更准的办法是看设备状态:Status是OK就说明驱动在;是Error并且错误代码 28(未安装驱动程序),才需要补包。

真正容易卡住的是 INF 里的ExcludeFromSelect。部分厂商的 INF 会给某些条目打上这个标记,作用是让该设备不出现在“从磁盘安装 → 从列表中选”的对话框里。很多人打开手动安装向导,翻遍列表找不到自己的型号,就断定 INF 是坏的,其实是这个关键字在起作用。命令行装驱动完全不受它影响,这也是我后面一律用pnputil的原因之一。

另一个常被忽略的点是 INF 的装饰段。[Manufacturer]下面如果是%e1rexpress%=e1rexpress.ndi,NTamd64.10.0...16299,那个后缀是目标系统版本范围。Server 2016 是 14393,落不进 16299 开头的区间,安装就会被拒。这种情况不是包坏了,是包太新或者太旧,换一个版本区间的包即可。

提示:改 INF 里的版本号强行装上去,短期能亮,长期会在系统更新后被判定为签名不符,机器重启直接掉网。这条路我试过一次,再也不走。

2.4 版本号:日期比数字更可信

驱动的“新旧”不能只看版本号数字大小。同一颗芯片,厂商可能同时维护 22.x 和 25.x 两条线,前者面向客户端、后者面向服务器,数字小的反而更适合 Server。判断依据看两个字段:DriverDate和DriverVersion,日期相差超过两年的包,除非有明确的兼容性说明,否则优先选日期近的。

# 装完之后看版本和日期,比在设备管理器里翻属性快得多 Get-NetAdapter | Select-Object Name, InterfaceDescription, DriverVersion, DriverDate, LinkSpeed, Status | Format-Table -AutoSize

InterfaceDescription这一列特别值得盯,它来自 INF 里的设备描述字符串,能直接告诉你系统当前挂的是哪一套驱动。如果是Intel(R) I350 Gigabit Network Connection,说明厂商包生效了;如果是Intel(R) Gigabit CT Desktop Adapter之类,多半是系统自带的老包顶在那里,需要手动换掉。

3. 装驱动的三条路:静默、手动、离线注入

同样是装一个 INF,单机救火、批量部署、系统镜像制作三种场景的做法完全不同。单机追求快,批量追求可重复,镜像追求一次到位不留尾巴。这三条路我都用,选哪条看手上是几台机器。

3.1 pnputil 静默安装:一条命令进驱动库

pnputil是 Server 2016 上最稳的方式,不依赖图形界面,Server Core 也能跑。前提是把驱动包解压到本地磁盘,别放在网络盘或者 U 盘上跑一半拔掉。

# 驱动包解压后的 INF 路径,注意目录里通常还有 .sys / .cat / .dll,一起留着 $inf = "D:\drv\e1r\W2K16_x64\e1r65x64.inf" # 第一步:只登记进驱动库,不绑定设备,适合提前预置 pnputil /add-driver $inf # 第二步:登记并立即尝试匹配当前未识别的设备 pnputil /add-driver $inf /install # 第三步:确认入库结果,oemNN.inf 就是系统给第三方包分配的编号 pnputil /enum-drivers

/add-driver和/install的区别值得说清楚。前者只把包拷进C:\Windows\INF并登记,设备该是感叹号还是感叹号;后者在登记之后立刻触发一次设备匹配。批量场景我一般只用前者,把所有包先灌进去,最后重启一次让系统统一匹配,避免中途反复触发 PnP 扫描拖慢速度。

pnputil /enum-drivers的输出里,Published Name字段就是oem12.inf这种编号,记住它,后面卸载或者回滚要靠这个编号。Original Name才是你原始 INF 的文件名,两者对不上是正常的,别以为装错了。

3.2 Server Core 上没有设备管理器怎么办

Server Core 装完是没有图形界面的,很多人第一反应是“那我怎么装驱动”。答案是根本不需要图形界面,pnputil加 PowerShell 就够,甚至比图形界面更可控。

# 1. 确认设备存在但没驱动 Get-PnpDevice -Class Net | Format-Table Status, FriendlyName, InstanceId -AutoSize # 2. 把整个驱动目录(含子目录)一次性登记,不用逐个指定 INF pnputil /add-driver "D:\drv\e1r\W2K16_x64\*.inf" /subdirs /install # 3. 触发一次硬件扫描,让系统重新匹配 pnputil /scan-devices # 4. 看结果,LinkSpeed 出来就说明链路协商成功 Get-NetAdapter | Format-Table Name, InterfaceDescription, LinkSpeed, Status -AutoSize

/subdirs这个参数是省事的关键,厂商的驱动包往往按W2K16_x64、W2K12_x64、NDIS65分了好几层目录,一个个点进去找 INF 是体力活。加上它之后pnputil会递归扫所有子目录。注意通配符要加引号,否则 PowerShell 会先展开成文件列表再传给pnputil,参数个数一多就报错。

pnputil /scan-devices在 1607 之后的版本才有,Server 2016 正好赶上。如果手上的补丁级别比较老,命令不存在,退而求其次用Get-PnpDevice配合禁用再启用设备也能触发重新匹配。

3.3 镜像离线注入:一次做完,后面都省事

要装几十台同型号的机器,一台台敲命令不现实。正确做法是在装机镜像里把驱动注入进去,系统装完网卡直接就是好的。用 DISM 挂载 WIM 来做,整个过程离线,不会污染当前系统。

# 1. 先看镜像里有几个索引,Server Core 和带桌面的版本各占一个 dism /Get-WimInfo /WimFile:D:\sources\install.wim # 2. 挂载到本地空目录,索引号按上一步的实际输出填 dism /Mount-Wim /WimFile:D:\sources\install.wim /Index:2 /MountDir:C:\mnt # 3. 递归注入整个驱动目录,INF 在子目录里也能被扫到 dism /Image:C:\mnt /Add-Driver /Driver:D:\drv\e1r /Recurse # 4. 核对注入结果,确认包真的进去了 dism /Image:C:\mnt /Get-Drivers # 5. 卸载并提交,不写 /Commit 等于白干 dism /Unmount-Wim /MountDir:C:\mnt /Commit

第 5 步的/Commit是新手最容易漏的。漏了之后挂载目录被丢弃,前面几分钟全部作废,而且C:\mnt会残留在“已挂载”状态,下次再挂同一个镜像会报目录被占用,得先/Cleanup-Wim。我见过有人反复重试了四五遍,一直以为是驱动包的问题。

PowerShell 里有个等价写法,参数更直观:Add-WindowsDriver -Path C:\mnt -Driver D:\drv\e1r -Recurse。它和dism /Add-Driver是同一套底层,选哪个看习惯。注入完成后别忘了顺手把镜像里的install.wim体积看一眼,加了几十兆是正常的,加了几个 G 说明/Recurse扫到了不该扫的目录,比如把整个D:\drv连同别的平台驱动一起塞进去了。

3.4 装完立刻验证的四件事

驱动装完不等于能用,下面四项我每次都过一遍,前后不超过一分钟。

第一件,设备状态。Get-PnpDevice -Class Net -Status Error返回空,说明没有残留的异常设备。

第二件,链路速率。Get-NetAdapter的LinkSpeed必须是预期值,千兆卡显示100 Mbps就是有问题,别急着怪驱动,先看下面第 5 章的排查。

第三件,驱动来源。DriverProvider是厂商名而不是Microsoft,才说明厂商包真的生效了。

第四件,高级属性是否可读。Get-NetAdapterAdvancedProperty -Name "NIC1"能正常列出几十条属性,说明驱动和 NDIS 的接口是通的;如果报“未找到适配器”或者列表空得离谱,多半是驱动装上了但没完全初始化,重启一次再看。

4. 装完只是开始:队列、巨帧与分载的参数取舍

驱动装对了,网卡能 ping 通,很多人到此为止。但只要这台机器要跑 Hyper-V、要做文件服务、要扛备份流量,默认参数几乎一定要动。这些参数都在网卡的高级属性里,图形界面点得到,PowerShell 更能批量刷。

4.1 RSS 与接收队列:别把队列开满

RSS(接收端缩放)把收包中断分散到多个 CPU 核心上,单队列跑满一个核是千兆网卡最常见的瓶颈。默认值通常保守,尤其在核数多的服务器上。

# 先看驱动允许的最大队列数,不同芯片上限不同 Get-NetAdapterRss -Name "NIC1" | Select-Object Name, Enabled, NumberOfReceiveQueues, MaximumNumberOfProcessors # 队列数不要超过物理核心数,8 核机器给 8 已经足够 Set-NetAdapterRss -Name "NIC1" -Enabled $true -NumberOfReceiveQueues 8

这里有个反直觉的点:队列数不是越大越好。开到 16 而物理核心只有 8 个,多个队列抢同一个核,中断开销反而上升;更糟的是在 Hyper-V 场景下,RSS 和 VMQ 抢同一批核心,会出现“CPU 不高但吞吐上不去”的玄学现象。我的习惯是队列数取物理核心数的一半到全部之间,跑压测看哪个值稳。

4.2 VMQ 与虚拟交换机:开了不一定好

VMQ(虚拟机队列)让每块虚拟网卡有独立的接收队列,减少 vSwitch 里的软件转发开销。听起来很美,实际有两个前提:物理网卡和驱动都支持,并且队列总数够分。

# 打开 VMQ Set-NetAdapterVmq -Name "NIC1" -Enabled $true # 看队列怎么分的,哪个 VM 占了多少 Get-NetAdapterVmqQueue -Name "NIC1" | Format-Table VmName, QueueId, Filters -AutoSize

千兆网卡上开 VMQ 经常是负优化,因为默认队列数少,几台虚拟机就把队列占满,剩下的全走软件路径。万兆卡上才值得开。另外注意,一块网卡被加进 vSwitch 之后,RSS 的设置会被 vSwitch 接管,改之前先把网卡从交换机里摘出来,改完再加回去,否则设置不生效还不报错。

如果用的是 SET(交换机嵌入式组合),组队和 vSwitch 是一步完成的:

# 两块万兆卡直接组成 SET 交换机,同时承载管理口和虚拟机流量 New-VMSwitch -Name "vSwitch-NIC" -NetAdapterName "NIC1","NIC2" ` -EnableEmbeddedTeaming $true -AllowManagementOS $true # 需要 SR-IOV 的话,BIOS 里先开 VT-d,再打开交换机的 Iov 开关 Set-VMSwitch -Name "vSwitch-NIC" -EnableIov $true Set-VMNetworkAdapter -VMName "App01" -IovWeight 1

SR-IOV 这三步缺一不可。BIOS 里 VT-d 没开,EnableIov会直接报错;开了 VT-d 但驱动不支持,命令成功但虚拟机拿不到 VF,表现是虚拟机里网卡速率正常但 CPU 占用压不下来。老式的 LBFO 组队和 SET 不能混用,一台机器上只能选一种。

4.3 巨帧:端到端对齐才算数

巨帧能把 MTU 从 1500 提到 9000,大包传输时减少中断次数,文件服务和备份场景收益明显。配置本身一行命令:

# 注册表关键字统一是 *JumboPacket,值填 9014 而不是 9000 Set-NetAdapterAdvancedProperty -Name "NIC1" -RegistryKeyword "*JumboPacket" -RegistryValue 9014 # 改完确认一下是否真的生效 Get-NetAdapterAdvancedProperty -Name "NIC1" -RegistryKeyword "*JumboPacket"

为什么填 9014 而不是 9000?因为以太网帧头 14 字节、VLAN tag 4 字节,加上 9000 的负载正好 9014,驱动按整帧长度算。填 9000 有些驱动会拒绝,有些会接受但实际按 8986 生效,两边对不上。

真正的问题不在本机,而在链路两端。巨帧是端到端属性:服务器、交换机端口、对端服务器,任何一跳还是 1500,大包就会被丢弃或者分片,表现是“小文件正常、大文件卡死”。验证方法很土但有效,用不分片的 ping 逐级试:

# 8972 + 28 字节 ICMP 头 = 9000,通了说明这一跳的 MTU 是够的 ping -f -l 8972 192.168.10.1 # 对端如果只能到 1472,说明它还停在 1500 ping -f -l 1472 192.168.10.1

4.4 分载与节能:什么时候必须关

分载(LSO、校验和分载)能显著降低 CPU 占用,普通文件服务建议全开。但有两种情况必须关:一是做网络抓包或者流量分析,分载会让抓到的包校验和不对、大包被合并,分析工具直接懵;二是某些老版本虚拟化平台上跑负载均衡,分载和虚拟交换机配合不好会出现丢包。

$n = "NIC1" # 关闭大包分载(LSOv2),抓包和排障时用 Set-NetAdapterAdvancedProperty -Name $n -RegistryKeyword "*LsoV2IPv4" -RegistryValue 0 # 校验和分载:0 全关,1 仅发送,2 仅接收,3 收发都开 Set-NetAdapterAdvancedProperty -Name $n -RegistryKeyword "*TCPUDPChecksumOffloadIPv4" -RegistryValue 3 # 节能以太网和绿色以太网在机房里是纯负担,一律关掉 Get-NetAdapterAdvancedProperty -Name $n | Where-Object { $_.DisplayName -match "Energy|Green|节能" } | ForEach-Object { Set-NetAdapterAdvancedProperty -Name $n -DisplayName $_.DisplayName -DisplayValue "Disabled" }

节能以太网(EEE)在交换机端口协商不标准的环境下,会造成链路频繁 up/down,日志里刷一堆Network link is disconnected。这类问题极难查,因为白天正常夜里掉线,最后往往是把 EEE 关了才消停。上面那段用DisplayName匹配中文和英文两种描述,是因为不同版本的驱动包里选项名称不一样,写死字符串很容易在别的机器上失效。

5. 避坑与排查:五个翻车现场

下面五条都是我在机房里真碰过的,按出现频率从高到低排。每条都按“现象 → 原因 → 解决”走,遇到对得上的直接照做,对不上的也能缩小范围。

5.1 装完设备管理器还是感叹号,错误代码 28 或 10

现象:pnputil提示安装成功,设备管理器里依旧黄叹号,属性里错误代码 28(驱动未安装)或者 10(设备无法启动)。

原因:代码 28 基本是 INF 里的硬件 ID 没覆盖到你手上的子型号,尤其是带SUBSYS的 OEM 定制卡,厂商改过子系统 ID,公版 INF 认不出来。代码 10 更多是驱动家族装错——e1r 的包装到了 i40e 的卡上,系统接受注册但不初始化设备。

解决:先用 2.1 那段脚本把VEN/DEV抠出来,去驱动包的 INF 里全文搜这个 ID,搜不到就是包不对,换家族。搜得到但依然 28,把SUBSYS后面那四位也带上搜一次,确认 INF 里的完整条目是否包含你的子系统号。代码 10 则要回滚:pnputil /enum-drivers找到对应的oemNN.inf,pnputil /delete-driver oemNN.inf /uninstall /force清干净,重启,再装正确的那套。

5.2 驱动装上了,链路只有 100 Mbps

现象:设备管理器干干净净,Get-NetAdapter显示LinkSpeed是100 Mbps,交换机那头明明是千兆口。

原因:九成是线缆或者水晶头的问题。超五类线跑千兆要求八芯全通,有一对线序接错或者接触不良,PHY 会自动降速到百兆保证连通,这是设计行为不是故障。剩下的一成是网卡高级属性里把“速度和双工”强制设成了 100M 全双工,或者节能以太网把链路反复拉低。

解决:先换一根确定好的成品线,最快排除。线没问题就看高级属性:

Get-NetAdapterAdvancedProperty -Name "NIC1" | Where-Object { $_.DisplayName -match "Speed|Duplex|速度" } | Format-Table DisplayName, DisplayValue, RegistryKeyword -AutoSize

如果Speed & Duplex的值不是Auto Negotiation,改回自动。两边都强制的话,一端强制千兆一端自动,自协商失败也会降速,这种“半强制”配置在老旧交换机上特别常见。

5.3 重启之后驱动被换回系统自带的老版本

现象:手动装完厂商包,版本号是新的,过几天重启或者打完补丁,DriverVersion又变回老版本,网卡功能少了几个选项。

原因:Windows Update 里的可选驱动更新把厂商包顶掉了,Server 2016 默认会从 WU 拉驱动。也有可能是设备管理器里残留了旧版本的oemNN.inf,PnP 匹配时优先选了排名更高的那个。

解决:两条都要做。先清残留,把同名家族的旧oemNN.inf全删掉,只留新的;再关掉驱动自动更新,组策略里“设备安装限制 → 阻止安装与这些设备 ID 匹配的设备”虽然能精确控制,但维护成本高,我一般直接改注册表关搜索顺序:

# 让系统在安装驱动时不去 Windows Update 找包 $k = "HKLM:\SOFTWARE\Policies\Microsoft\Windows\DriverSearching" New-Item -Path $k -Force | Out-Null Set-ItemProperty -Path $k -Name "SearchOrderConfig" -Value 0 -Type DWord

改完重启生效。注意这是机器级策略,做镜像的时候顺手写进去能省掉后面一堆麻烦。

5.4 装了厂商的网卡管理套件,Hyper-V 起不来

现象:装完驱动顺手把配套的网络管理工具也装了,重启后 Hyper-V 虚拟机全部失联,vSwitch 显示“未连接”。

原因:这类套件自带一套组队(Team)实现,和 Windows 自带的 LBFO、SET 是竞争关系。两套组队同时接管同一块物理网卡,vSwitch 绑定的那块“网卡”就变成了一个悬空对象。

解决:在“添加/删除程序”里卸掉组队组件,保留纯驱动部分。判断标准很简单——装了套件之后Get-NetLbfoTeam和套件自己的管理界面都能看到同一块卡,就是冲突了。我现在的做法是只装 INF 驱动,管理套件一个都不装,需要组队就用New-NetLbfoTeam或者 SET,全在 PowerShell 里可控可查。

# 确认当前有没有组队对象,以及成员卡 Get-NetLbfoTeam | Format-Table Name, TeamMembers, TeamingMode, Status -AutoSize

5.5 一开巨帧,整个网段断断续续

现象:给一台文件服务器开了 9014 巨帧,它自己访问外网正常,但同网段其他机器访问它的大文件经常超时,重启交换机才好一阵。

原因:巨帧要求路径上每一跳 MTU 都 ≥ 9000。服务器开了,交换机端口没开,交换机收到 9000 字节的帧会直接丢弃,且不返回 ICMP 分片需要,于是表现为“能 ping 通、大文件传不动”。更隐蔽的是有些交换机的巨帧配置是按端口组生效的,只改了一个端口。

解决:要么全链路统一开,要么退回去。我的建议是只在存储网络、备份网络这种端到端自己完全可控的独立网段上开巨帧,业务网段老老实实 1500。已经开了的要回滚,先服务器改回 1514,再逐台交换机核对,别只改一边。验证用 4.3 里那个不分片 ping,从服务器往每个方向打一遍,全部通才算配好。

6. 进阶:把驱动和配置做成一次交付

单台机器手工装没问题,十几台机器重复劳动就容易出错。我现在的做法是写一个部署脚本,把“识别硬件 → 匹配 INF → 安装 → 刷参数 → 自检”串成一条链,跑完输出一份日志,出问题直接看日志不用回忆当时点了什么。

核心思路是按硬件 ID 匹配,而不是按文件名字符串猜:

# Deploy-Nic.ps1 —— 遍历驱动目录,按 PCI 硬件 ID 匹配本机设备并安装 param( [Parameter(Mandatory)][string]$DriverRoot, # 驱动根目录,可含多套 INF [string]$LogPath = "C:\nic-deploy.log" ) Start-Transcript -Path $LogPath -Force # 1. 本机所有网络设备的 VEN/DEV $local = Get-PnpDevice -Class Net | ForEach-Object { if ($_.InstanceId -match 'VEN_([0-9A-F]{4})&DEV_([0-9A-F]{4})') { [pscustomobject]@{ Ven = $Matches[1]; Dev = $Matches[2]; Name = $_.FriendlyName } } } # 2. 逐个 INF 读出它声明的 PCI 硬件 ID,与本机设备取交集 Get-ChildItem -Path $DriverRoot -Filter *.inf -Recurse | ForEach-Object { $ids = Select-String -Path $_.FullName -Pattern 'PCI\\VEN_[0-9A-Fa-f]{4}&DEV_[0-9A-Fa-f]{4}' -AllMatches | ForEach-Object { $_.Matches.Value.ToUpper() } | Sort-Object -Unique foreach ($id in $ids) { $ven = ($id -split 'VEN_')[1].Substring(0,4) $dev = ($id -split 'DEV_')[1].Substring(0,4) if ($local | Where-Object { $_.Ven -eq $ven -and $_.Dev -eq $dev }) { Write-Host "匹配到 $($_.Name) -> $id,开始安装" -ForegroundColor Green pnputil /add-driver $_.FullName /install } } } # 3. 等待设备初始化,再统一刷一遍关键参数 Start-Sleep -Seconds 5 Get-NetAdapter -Physical | Where-Object Status -eq "Up" | ForEach-Object { $n = $_.Name Set-NetAdapterAdvancedProperty -Name $n -RegistryKeyword "*JumboPacket" -RegistryValue 1514 -ErrorAction SilentlyContinue Set-NetAdapterAdvancedProperty -Name $n -RegistryKeyword "*LsoV2IPv4" -RegistryValue 1 -ErrorAction SilentlyContinue Set-NetAdapterRss -Name $n -Enabled $true -ErrorAction SilentlyContinue } # 4. 自检输出 Get-NetAdapter | Format-Table Name, InterfaceDescription, DriverVersion, LinkSpeed, Status -AutoSize Stop-Transcript

几个参数值得按自己的环境调。$DriverRoot指向的是解压后的驱动根目录,把 e1r、ixn、i40e 三套都扔进去也没问题,脚本会自己匹配,不会装错家族。-ErrorAction SilentlyContinue在刷参数时是必要的,因为不同芯片支持的高级属性不一样,同一段命令在千兆卡上会因为没有巨帧属性而报错,静默跳过不影响其它设置。第 3 步的Start-Sleep别删,设备刚枚举完的时候Get-NetAdapter有时还读不到,等五秒能省掉很多“命令跑完了但什么都没改”的困惑。

装完我会做一张交付表,随机器一起存档,后面出问题直接对表:

检查项命令合格标准
设备状态Get-PnpDevice -Class Net -Status Error返回为空
驱动来源Get-NetAdapter的DriverProvider厂商名,非 Microsoft
链路速率Get-NetAdapter的LinkSpeed与交换机端口一致
RSS 队列Get-NetAdapterRss的NumberOfReceiveQueues≤ 物理核心数
巨帧Get-NetAdapterAdvancedProperty查*JumboPacket全链路一致

这套流程是被坑出来的。早几年我给一个机房批量装机器,图快只装了驱动没记版本,三个月后其中一台的网卡开始丢包,换线换交换机折腾了一整天,最后才发现是 Windows Update 把它换成了自带的老包,跟别的机器版本差了两年。从那以后我每次装完驱动都会把DriverVersion和DriverDate抄进交付表,改过的高级属性也一并写上,宁可多花五分钟。希望帮到你。

本文还有配套的精品资源,点击获取

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/29 11:18:47

深入理解贝尔曼公式:强化学习的核心数学工具

1. 贝尔曼公式的本质理解贝尔曼公式(Bellman Equation)是强化学习领域最核心的数学工具之一,它用递归的方式定义了状态的价值函数。我第一次接触这个概念时,被它简洁而深刻的表达方式所震撼——看似简单的等式背后,蕴含…

作者头像 李华
网站建设 2026/10/29 11:18:10

智慧文旅景区方案PPT制作:42页说服型汇报设计全攻略

简介:一份面向景区管委会、文旅局、集成商及规划院的智慧景区解决方案PPT,围绕政策趋势、游客服务、综合管理、营销与大数据等业务模块,从行业分析、发展趋势、客户生态到方案设计、核心产品与落地拓扑,系统梳理了智慧文旅的整体建…

作者头像 李华
网站建设 2026/10/29 11:17:37

PyTorch UNet多类别语义分割工程实战:从调色板mask到mIoU评估

简介:面向希望在 PyTorch 中完成多类别语义分割实践的开发者与学习者,内容围绕 U-Net 的编码器与解码器构建、跳跃连接、多通道输出、交叉熵损失以及训练评估流程展开,适合医学影像、遥感图像等像素级分类场景的入门学习与代码复现。压缩包共…

作者头像 李华
网站建设 2026/10/29 11:17:17

二进制文件查看与安全修改:HexEdit、偏移表与字节序实战

简介:HexEdit 是一套托管于 GitHub 的开源十六进制编辑器工程源码,面向需要直接查看、搜索和修改二进制文件的开发者、逆向工程与安全分析人员,也适合游戏数值调试、损坏文件修复等字节级编辑场景。压缩包共收录 220 个文件,约 52…

作者头像 李华
网站建设 2026/10/29 11:16:03

FileZilla Server 0.9.39汉化绿色版部署指南:从解压到外网访问

简介:这份资源是 FileZilla Server 0.9.39 的汉化绿色版,面向需要在 Windows 环境下快速搭建 FTP 服务的运维人员、开发者与小型团队。它免安装、解压即用,省去配置系统服务的繁琐步骤,适合临时文件共享、内网传输或本地测试等场景…

作者头像 李华
网站建设 2026/10/29 11:15:18

Windows 上开发 Expo iOS,用 KXBuild 本地生成工程、真机调试与打包 ipa

这篇从新建一个 Expo 工程开始,在 Windows 本机生成 iOS 工程,装到 iPhone 上跑开发版,最后打出能上传 App Store Connect 的 ipa。你需要 Apple 开发者账号、一台 iPhone 和数据线,并且已经安装 KXBuild。第一次走完大约一小时&a…

作者头像 李华