Obtendo o nome do dispositivo da interface de rede no powershell

4

Eu precisava de um script powershell 2 para obter o nome e o nome do dispositivo de cada interface, como é mostrado nas conexões de rede no painel de controle.

Deve ser fácil ...

$interfaces = Get-WmiObject Win32_NetworkAdapter
$interfaces | foreach {
    $friendlyname = $_ | Select-Object -ExpandProperty NetConnectionID
    $name = $_ | Select-Object -ExpandProperty Name
    "$friendlyname is $name"
}

No entanto, $ name retorna como "Broadcom BCM5709C NetXtreme II GigE (Cliente NDIS VBD)", enquanto no painel de controle mostra "Broadcom BCM5709C NetXtreme II GigE (Cliente NDIS VBD) # 69 " porque existem vários cartões. Não consigo encontrar esse número em nenhum lugar nas propriedades.

Como posso obter o nome e o nome do dispositivo, exatamente como mostrado nas conexões de rede, no PowerHell 2 no Windows Server 2008 r2?

Atualização: O mais estranho é que ele mostra a parte # para outros tipos de placas de rede - as interfaces para cartões agrupados mostram isso corretamente. Meus nvidia baseados mostram isso no meu sistema desktop. Talvez seja apenas os cartões de banda larga? O servidor em questão é um Dell R715, com 4 broadcomics onboard e uma placa addon broadcom de 4 portas.

Após o teste em mais alguns sistemas (e testes de comentários em seus sistemas), parece ser um "recurso" dos drivers da broadcom. A atualização dos drivers não alterou nada.

De que formas existem, além de Get-WmiObject Win32_NetworkAdapter para obter o nome e o nome do dispositivo de todos os adaptadores de rede em um sistema?

    
por Grant 13.09.2012 / 22:00

3 respostas

5

Finalmente, encontrei a solução! Como ele é exibido corretamente no registro e no gerenciador de dispositivos, podemos obtê-lo do objeto Win32_PnPEntity relacionado. Então o código se torna:

$interfaces = Get-WmiObject Win32_NetworkAdapter
$interfaces | foreach {
    $friendlyname = $_ | Select-Object -ExpandProperty NetConnectionID
    $name = $_.GetRelated("Win32_PnPEntity") | Select-Object -ExpandProperty Name
    "$friendlyname is $name"
}

Isso combina perfeitamente com os nomes no gerenciador de dispositivos e nas conexões de rede em todos os sistemas em que o testei.

    
por 14.09.2012 / 21:41
2

Não tenho certeza se esse é todo o seu código, mas com seu loop atual, você está escrevendo apenas sobre as variáveis $friendlyname e $name . Pode ser que o último item tenha sido aquele sem o número nele. O código a seguir me deu os resultados que você está procurando:

$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
}

Você pode usar $outputs | out-grid para ver tudo o que foi listado em seu sistema.

    
por 14.09.2012 / 00:58
0

Ao tentar a resposta de Grant, recebi alguns erros indicando que eu estava tentando imprimir uma variável nula. Esta é a solução alternativa:

$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"
    }
}
    
por 02.10.2015 / 18:00

Tags