Мне нужен был сценарий PowerShell 2, чтобы получить имя и имя устройства для каждого интерфейса, как показано в сетевых подключениях на панели управления.
Должно быть легко ...
$interfaces = Get-WmiObject Win32_NetworkAdapter
$interfaces | foreach {
$friendlyname = $_ | Select-Object -ExpandProperty NetConnectionID
$name = $_ | Select-Object -ExpandProperty Name
"$friendlyname is $name"
}
Однако имя $ возвращается как «Broadcom BCM5709C NetXtreme II GigE (клиент NDIS VBD)», тогда как в панели управления отображается «Broadcom BCM5709C NetXtreme II GigE (клиент NDIS VBD)». # 69", потому что есть несколько карточек. Я не могу найти этот номер в свойствах.
Как я могу получить и имя, и имя устройства, точно как показано в разделе «Сетевые подключения», в PowerShell 2 на сервере Windows Server 2008 R2?
Обновление: действительно странно то, что здесь показана часть # для других типов сетевых карт - интерфейсы для объединенных карт показывают это правильно. Мои карты на базе nvidia показывают это на моем настольном компьютере. Может дело только в картах Broadcom? Речь идет о сервере Dell R715 с 4 встроенными шинами Broadcom и дополнительной платой Broadcom с 4 портами.
После тестирования еще на некоторых системах (и тестов комментаторов на их системах) это, похоже, является «особенностью» драйверов Broadcom. Обновление драйверов ничего не изменило.
Какие есть пути, помимо Get-WmiObject Win32_NetworkAdapter чтобы получить как имя, так и имя устройства всех сетевых адаптеров в системе?
Наконец-то нашел решение! Поскольку он правильно отображается в реестре и диспетчере устройств, мы можем получить его из связанного объекта 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"
}
Это идеально соответствует именам в диспетчере устройств и сетевых подключениях на всех системах, на которых я это пробовал.
Я не уверен, что это весь ваш код, но в текущем цикле вы просто пишете поверх $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
чтобы увидеть все, что было указано в вашей системе.
При попытке получить ответ от Гранта я получил несколько ошибок, указывающих на то, что я пытался напечатать нулевую переменную. Вот обходной путь:
$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"
}
}
Вот способ перечислить только ФИЗИЧЕСКИЕ имена устройств:
$query = "SELECT * FROM Win32_NetworkAdapter WHERE Manufacturer != 'Microsoft' AND NOT PNPDeviceID LIKE 'ROOT\\%'"
$interfaces = Get-WmiObject -Query $query | Sort index
$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"
}
}
Вывод:
Ethernet is Intel(R) Ethernet Connection (6) Is19-LM
Wi-Fi is Intel(R) Wi-Fi 6 X200 160MHz