在 Windows 服务器和 Hyper-V 主机上,网卡高级属性直接影响网络吞吐和稳定性。像巨型帧、接收侧缩放(RSS)、中断调节、流控制这些参数,如果只靠设备管理器手动调整,不仅效率低,而且难以在大量主机上保持一致。PowerShell 的 NetAdapter 模块提供了 Set-NetAdapter 和 Set-NetAdapterAdvancedProperty 等命令,可以把这些操作脚本化。二者经常被混为一谈,但职责并不完全相同:Set-NetAdapter 主要用于设置网卡的基本属性,例如名称、MAC 地址、VLAN ID 和电源管理;而高级属性需要使用 Get-NetAdapterAdvancedProperty 和 Set-NetAdapterAdvancedProperty 来读取和修改。理解这个区别,是正确编写脚本的前提。

一、Set-NetAdapter 与高级属性命令的关系
Set-NetAdapter 属于 NetAdapter 模块,Windows Server 2012 R2、Windows 8.1 及更高版本默认提供该模块。运行 Get-Command -Module NetAdapter 可以看到相关命令。Set-NetAdapter 可以修改网卡名称、VLAN ID、MAC 地址等参数。例如把网卡改名为 Mgmt-NIC 的命令如下:
# 将名为 Ethernet0 的网卡重命名为 Mgmt-NIC Set-NetAdapter -Name "Ethernet0" -NewName "Mgmt-NIC" # 设置 VLAN ID 为 100 Set-NetAdapter -Name "Mgmt-NIC" -VlanID 100
上面的代码里,-Name 参数用于定位网卡,可以使用通配符,例如 Set-NetAdapter -Name "Ethernet*" -VlanID 100。需要注意的是,Set-NetAdapter 的 -VlanID 参数只适用于支持 VLAN 的网卡和驱动,部分虚拟网卡或旧驱动可能不支持。
而高级属性存储在网卡驱动的高级属性表中,不同厂商的参数名称可能完全不同。例如 Intel 网卡和 Broadcom 网卡对巨型帧的显示名称可能都是 Jumbo Packet,但注册表键值并不相同。通过 Get-NetAdapterAdvancedProperty 可以统一读取这些属性,避免直接接触注册表。该命令返回的每一行包含网卡名称、注册表关键字、显示名称和当前值。例如查询所有网卡的高级属性:
# 查看所有网卡的高级属性 Get-NetAdapterAdvancedProperty | Format-Table Name, DisplayName, DisplayValue -AutoSize # 查看指定网卡的高级属性 Get-NetAdapterAdvancedProperty -Name "Ethernet0" | Sort-Object DisplayName
从输出中可以看到 DisplayName 与 DisplayValue 两列,DisplayName 是图形界面中显示的名称,DisplayValue 是当前生效的值。修改这些值时,使用 Set-NetAdapterAdvancedProperty,而不是 Set-NetAdapter。这个区别在查阅微软文档时经常造成误解,很多脚本示例中的 Set-NetAdapter 只是用来设置网卡基本属性,高级属性需要单独的 cmdlet。
二、常见高级属性的查看与修改
不同硬件的网卡高级属性数量差异很大,但有几个参数在服务器环境中几乎都会涉及。第一个是巨型帧(Jumbo Packet)。在 iSCSI、存储网络和高吞吐场景下,启用 9000 字节的巨型帧可以降低 CPU 开销并提升大块数据传输效率。查询和修改命令如下:
# 查看巨型帧当前设置
Get-NetAdapterAdvancedProperty -Name "Ethernet0" |
Where-Object DisplayName -like "*Jumbo*" |
Format-List Name, DisplayName, DisplayValue
# 将巨型帧设置为 9014 字节
Set-NetAdapterAdvancedProperty -Name "Ethernet0" `
-DisplayName "Jumbo Packet" -DisplayValue "9014 Bytes"这里需要注意 DisplayValue 必须与驱动提供的选项完全匹配。如果写成 9014 或 Jumbo 9014 可能会报错。可以先通过 Get-NetAdapterAdvancedProperty 查看该属性的 ValidDisplayValues 列表,确认可选值后再写入。修改完成后建议使用 Restart-NetAdapter 重启网卡让配置生效,不过部分属性会立即生效,是否重启取决于驱动实现。
第二个常见属性是接收侧缩放(RSS)。RSS 允许网卡将数据流分配到多个 CPU 核心,提高多核服务器的网络处理能力。在高并发场景下,如果发现某个 CPU 核心占用过高,可以检查 RSS 是否启用。命令如下:
# 查看 RSS 状态
Get-NetAdapterAdvancedProperty -Name "Ethernet0" |
Where-Object DisplayName -like "*RSS*"
# 启用 RSS
Set-NetAdapterAdvancedProperty -Name "Ethernet0" `
-DisplayName "Receive Side Scaling" -DisplayValue "Enabled"RSS 的 DisplayName 在不同驱动中可能显示为 Receive Side Scaling、RSS 或 接收方扩展,使用通配符 *RSS* 可以较好地匹配。第三个是流控制(Flow Control)。在万兆网卡与交换机互联时,如果交换机端口启用了暂停帧,但网卡未启用流控制,可能出现丢包;反之如果两侧配置不一致,也可能导致性能下降。查询和修改流控制的示例:
# 查看流控制属性
Get-NetAdapterAdvancedProperty -Name "Ethernet0" |
Where-Object DisplayName -like "*Flow*"
# 设置流控制为关闭
Set-NetAdapterAdvancedProperty -Name "Ethernet0" `
-DisplayName "Flow Control" -DisplayValue "Disabled"除了这些,VLAN 相关属性、中断调节(Interrupt Moderation)、节能以太网(Energy Efficient Ethernet)也经常需要调整。对于虚拟化主机,建议关闭节能以太网以减少延迟抖动;对于文件服务器,可以保留中断调节来降低 CPU 中断负载。关键是先通过命令查看当前值和可选值,再结合业务需求做修改,而不是照搬网上的参数。
三、批量配置与回滚策略
单台机器上使用命令修改高级属性并不比图形界面快多少,但脚本化的优势在于批量操作。例如给所有 10G 网卡启用 RSS,可以结合 Get-NetAdapter 的过滤条件,一次性完成:
# 获取所有 10Gbps 的物理网卡并启用 RSS
$adapters = Get-NetAdapter -Physical |
Where-Object { $_.LinkSpeed -like "10 Gbps" }
foreach ($adapter in $adapters) {
Set-NetAdapterAdvancedProperty -Name $adapter.Name `
-DisplayName "Receive Side Scaling" -DisplayValue "Enabled"
Write-Output "已配置网卡: $($adapter.Name)"
}批量修改前,强烈建议先导出当前配置。虽然 NetAdapter 模块没有直接导出所有高级属性的命令,但可以把查询结果保存为 CSV 文件,方便出问题时对照恢复。导出示例:
# 导出所有网卡高级属性到 CSV Get-NetAdapterAdvancedProperty | Export-Csv -Path C:\NetAdapter\advanced-backup.csv -NoTypeInformation -Encoding UTF8 # 导出所有网卡基本属性 Get-NetAdapter | Export-Csv -Path C:\NetAdapter\adapter-backup.csv -NoTypeInformation -Encoding UTF8
上面脚本中使用了 C:\NetAdapter\ 和 C:\NetAdapter\ 路径,导出前需要确保该目录已存在,否则 Export-Csv 会报错。可以先执行 New-Item -ItemType Directory -Path C:\NetAdapter -Force 创建目录。恢复时,可以读取 CSV 文件中的 DisplayName 和 DisplayValue 进行回滚。不过由于不同网卡驱动差异,最好针对每张网卡保存独立备份,并记录驱动版本。
在远程管理场景中,Set-NetAdapter 系列命令都支持 -CimSession 参数,可以集中管理多台服务器。例如:
# 在远程服务器上查看网卡高级属性
$session = New-CimSession -ComputerName "HyperV-01"
Get-NetAdapterAdvancedProperty -CimSession $session -Name "Ethernet0"
# 在远程服务器上修改巨型帧
Set-NetAdapterAdvancedProperty -CimSession $session -Name "Ethernet0" `
-DisplayName "Jumbo Packet" -DisplayValue "9014 Bytes"使用 CIM 会话时,需要确保本地主机与目标服务器之间的 WinRM 已开启,并且当前账号具备管理员权限。如果遇到访问被拒绝,可以先运行 Enable-PSRemoting -Force 或检查防火墙规则。对于 Hyper-V 虚拟交换机绑定的虚拟网卡,部分高级属性由虚拟交换机管理,不建议直接修改,否则可能影响整个虚拟网络。
四、配置生效与常见问题排查
修改完网卡高级属性后,不同的参数生效时间并不一致。像 RSS、中断调节等参数通常立即生效,而巨型帧、流控制等涉及硬件卸载的配置可能需要重启网卡或重启服务器。可以通过 Restart-NetAdapter 来重启指定网卡:
# 重启网卡使配置生效 Restart-NetAdapter -Name "Ethernet0" -Confirm:$false
注意,在某些生产环境中重启网卡会短暂中断网络,如果是远程管理,务必确认不会因网卡重启导致会话断开。可以先用计划任务或带外管理口准备备用连接。重启后再次运行 Get-NetAdapterAdvancedProperty 确认新值是否保留。
另一个常见问题是 DisplayValue 不匹配。修改失败时错误信息通常为 Parameter set cannot be processed 或 No matching display value。此时不要盲目猜测,应使用以下命令查看该属性的所有合法值:
# 获取指定属性的合法值列表
$prop = Get-NetAdapterAdvancedProperty -Name "Ethernet0" |
Where-Object DisplayName -like "*Jumbo*"
$prop.ValidDisplayValues输出可能是一个数组,例如 1514 Bytes、4088 Bytes、9014 Bytes。从中复制一个准确的值填入 Set-NetAdapterAdvancedProperty 的 -DisplayValue 参数即可。这个步骤可以避免很多因为参数输入不规范导致的失败。
此外,某些第三方网卡驱动没有正确注册 WMI 提供程序,导致 Get-NetAdapterAdvancedProperty 看不到任何属性。此时可以先尝试更新网卡驱动到最新版本,或者使用厂商提供的 PowerShell 模块。对于 Intel 网卡,可以使用 IntelNetCmdlets 模块查看和修改高级属性,但命令风格与 NetAdapter 模块不同。建议优先使用系统自带模块,保持脚本的可移植性。

