我需要一个 powershell 2 脚本来获取每个接口的名称和设备名称,就像控制面板中的网络连接中显示的那样。
应该很容易...
$interfaces = Get-WmiObject Win32_NetworkAdapter
$interfaces | foreach {
$friendlyname = $_ | Select-Object -ExpandProperty NetConnectionID
$name = $_ | Select-Object -ExpandProperty Name
"$friendlyname is $name"
}
但是,$name 返回为“Broadcom BCM5709C NetXtreme II GigE (NDIS VBD Client)”,而在控制面板中则显示“Broadcom BCM5709C NetXtreme II GigE (NDIS VBD Client)”#69“,因为有多张卡。我在属性中的任何地方都找不到该号码。
如何在 Windows Server 2008 R2 上的 Powershell 2 中获取与网络连接中显示的完全相同的名称和设备名称?
更新:真正奇怪的是它显示了其他类型网卡的 # 部分 - 组合卡的接口可以正确显示它。我的基于 nvidia 的网卡在我的桌面系统上显示它。也许只有博通卡?有问题的服务器是 Dell R715,带有 4 个板载博通网卡和一个 4 端口博通附加卡。
在更多系统上测试后(以及评论者在其系统上的测试),这似乎是 Broadcom 驱动程序的“功能”。更新驱动程序没有改变任何东西。
有什么方法,除了 Get-WmiObject Win32_NetworkAdapter获取系统中所有网络适配器的名称和设备名称?
答案1
终于找到解决方案了!由于它确实在注册表和设备管理器中正确显示,我们可以从相关的 Win32_PnPEntity 对象中获取它。因此代码变为:
$interfaces = Get-WmiObject Win32_NetworkAdapter
$interfaces | foreach {
$friendlyname = $_ | Select-Object -ExpandProperty NetConnectionID
$name = $_.GetRelated("Win32_PnPEntity") | Select-Object -ExpandProperty Name
"$friendlyname is $name"
}
这与我尝试过的所有系统上的设备管理器和网络连接中的名称完全匹配。
答案2
我不确定这是否是您的整个代码,但使用当前循环,您只是覆盖了$friendlyname
和$name
变量。最后一项可能是没有数字的那一项。以下代码给了我您要查找的结果:
$interfaces = Get-WmiObject Win32_NetworkAdapter
$Outputs = @()
foreach ($Interface in $Interfaces) {
$Output = New-Object -TypeName System.Object
$Output | Add-Member -MemberType NoteProperty -Name FriendlyName -Value $Interface.NetConnectionID
$Output | Add-Member -MemberType NoteProperty -Name Name -Value $Interface.Name
$Outputs += $Output
}
然后您可以使用$outputs | out-grid
它来查看系统上列出的所有内容。
答案3
当我尝试回答 Grant 的问题时,我收到一些错误,表明我试图打印一个空变量。以下是解决方法:
$interfaces = Get-WmiObject Win32_NetworkAdapter
$interfaces | ForEach{
$friendlyname = $_ | ForEach-Object { $_.NetConnectionID }
$name = $_.GetRelated("Win32_PnPEntity") | Select-Object -ExpandProperty Name
# This tests to ensure friendlyname isn't null
if($friendlyname){
"$friendlyname is $name"
}
}