在PowerShell中获取ip详细信息

时间:2016-08-10 20:59:47

标签: powershell-v2.0

我试图从服务器上设置ipconfig获取所有IPv4地址。

感谢Chris分享有关获取IP详细信息的方法的信息/解决方案。

工作解决方案:

Get-WmiObject @params | Select-Object NetConnectionID, `
        @{Name='IPAddress'; Expression={
            $_.GetRelated('Win32_NetworkAdapterConfiguration') | ForEach-Object {
                [IPAddress[]]$_.IPAddress | Where-Object { $_.AddressFamily -eq 'InterNetwork' }
            }
        }}

1 个答案:

答案 0 :(得分:1)

继上面的评论之后,这些示例使用WMI来提取接口名称和IPv4地址。

根据什么是最重要的,有不同的方法可以得出这个。也就是说,选择具有最方便过滤风格的版本。

Win32_NetworkAdapterConfiguration和IPEnabled = TRUE

如果您对所有支持IP的接口感兴趣,则非常有用。

Get-CimInstance Win32_NetworkAdapterConfiguration -Filter "IPEnabled='TRUE'" |
    Select-Object @{n='NetConnectionID';e={ ($_ | Get-CimAssociatedInstance -ResultClassName Win32_NetworkAdapter).NetConnectionID }},
                  @{n='IPAddress';e={ [IPAddress[]]$_.IPAddress | Where-Object AddressFamily -eq 'InterNetwork' }}

Win32_NetworkAdapter和命名界面

如果您需要按名称定位接口并获取IP,也许最好。

Get-CimInstance Win32_NetworkAdapter -Filter "NetConnectionID='Ethernet'" |
    Select-Object NetConnectionID,
                @{n='IPAddress';e={
                    [IPAddress[]]($_ | Get-CimAssociatedInstance -ResultClassName Win32_NetworkAdapterConfiguration).IPAddress |
                        Where-Object AddressFamily -eq 'InterNetwork'
                }}

获取-WmiObject可以

Get-WmiObject已被取代,但如果你更喜欢它的语法,那么这是第一个例子。

Get-WmiObject Win32_NetworkAdapterConfiguration -Filter "IPEnabled='TRUE'" |
    Select-Object @{n='NetConnectionID';e={ $_.GetRelated("Win32_NetworkAdapter") | ForEach-Object { $_.NetConnectionID } }},
                  @{n='IPAddress';e={ [IPAddress[]]$_.IPAddress | Where-Object { $_.AddressFamily -eq 'InterNetwork' } }}

使用System.Net.NetworkInformation

由于WMI不是唯一的方法,因此只需很少的工作就可以直接访问。

$Name = 'MGT'
[System.Net.NetworkInformation.NetworkInterface]::GetAllNetworkInterfaces() |
    Where-Object Name -eq $Name |
    Select-Object Name,
            @{n='IPAddress';e={ $_.GetIPProperties().UnicastAddresses.Address |
                Where-Object AddressFamily -eq 'Internetwork'
            }}

Get-NetworkInterface功能(兼容PowerShell 2)

此功能允许您按名称选择网络接口,以便检查IP地址。默认情况下,它返回所有命名接口的信息。

function Get-NetworkInterface {
    param(
        [String]$Name = '*',

        [String]$ComputerName
    )

    $params = @{
        Class = 'Win32_NetworkAdapter'
    }
    if ($Name.IndexOf('*') -gt -1) {
        $Name = $Name -replace '\*', '%'
        $params.Add('Filter', "NetConnectionID LIKE '$Name'")
    } else {
        $params.Add('Filter', "NetConnectionID='$Name'")
    }
    if ($ComputerName -ne '') {
        $params.Add('ComputerName', $ComputerName)
    }

    Get-WmiObject @params | Select-Object NetConnectionID, `
        @{Name='IPAddress'; Expression={
            $_.GetRelated('Win32_NetworkAdapterConfiguration') | ForEach-Object {
                [IPAddress[]]$_.IPAddress | Where-Object { $_.AddressFamily -eq 'InterNetwork' }
            }
        }}
}

操作验证

此部分不兼容PowerShell 2。在这种情况下,您可以利用单元测试框架pester来执行配置验证。

它显示了我如何想象您可以使用上述功能来验证IP配置。

Import-Module Pester
Describe 'SomeServer' {
    $ComputerName = 'SomeServer'

    Context 'Network configuration' {
        It 'Should have the management interface set to 10.1.2.3' {
            (Get-NetworkInterface -Name 'MGMT' -ComputerName 'SomeServer').IPAddress | Should Be '10.1.2.3'
        }
    }
}