在Windows机器上检测IPv6是否已启用

3
我正在编写一个PowerShell脚本,它将作为我们服务器的构建合规性测试。其中一件事情是检测IPv6网络是否已被禁用。
WMI表明这个信息可以在Win32_NetworkAdapterConfiguration的IPAddress属性中找到,但可能是IPv6或IPv4。这并不能给我一个“是/否”的答案,我希望能够找到这个答案。
其他注意事项是,我不想通过直接访问注册表来获取详细信息,也不想从像ipconfig这样的命令输出中进行提取。
鉴于我们的环境有2003/2008机器的混合,有谁能想到一种测试IPv6的方法吗?
干杯!

如果参考http://msdn.microsoft.com/en-us/library/aa822883(VS.85).aspx,使用WMI检测IPv6的唯一方法是查看找到的IP地址,但即使如此,在Win2003上也无法使用。据我所知,只能通过检查netsh输出(或其他工具)或查找注册表来解决。 - undefined
8个回答

8
您可以使用.NET方式:
Write-Host 'OS Supports IPv6: ' $( [System.Net.Sockets.Socket]::OSSupportsIPv6 )

如果可以创建IPv6数据报套接字,则此属性将为true。该属性也受全局machine.config文件的影响,因此IPv6状态可能不总是准确的。

编辑:要在远程计算机上测试此功能,仍然可以使用PowerShell,但必须安装PowerShell 2.0并启用WinRM。

如果满足这两个条件,则可能可以使用Invoke-Command实现。


我认为在大多数情况下,即使某些适配器已禁用,这个应该是正确的。 - undefined
1
这个解决方案过于乐观——它只会告诉你操作系统是否支持,而不会告诉你任何适配器上是否实际启用了该功能。请参考下面的解决方案以确定后者。 - undefined

5

事实上,我的同事提出了一种不错的方法 - 有点笨重但可行。:)

$IPV6 = $false
$arrInterfaces = (Get-WmiObject -class Win32_NetworkAdapterConfiguration -filter "ipenabled = TRUE").IPAddress

foreach ($i in $arrInterfaces) {$IPV6 = $IPV6 -or $i.contains(":")}

write-host $IPV6

4

2
如果您想特别检查IPv6是否已启用并正常工作,我建议最好的方法是尝试连接到一个测试主机。这样,您不仅可以测试某些特定的软件设置,还可以找出所有路由配置以及周围所有内容都正常工作的情况。

2

我知道这是一个旧的帖子,但我需要检查同样的事情。

要检查特定适配器的 IPv6 绑定,请使用:

 Get-NetAdapterBinding -Name 'NameOfNic' -ComponentID ms_tcpip6

这将为您提供该适配器的启用状态。

如果你只想获取那个状态,你可以使用:

 (Get-NetAdapterBinding -Name 'NameOfNic' -ComponentID ms_tcpip6).Enabled

希望这能帮到您。我已经确认这个方法可以回溯到2012年。learn.microsoft.com没有列出比2012 / Win8更早的版本。

我也需要检查和OP一样的事情,你的解决方案可能有效,但是Get-NetAdapterBinding没有-ComputerName开关,这使得在想要扫描所有计算机的脚本中使用这个命令非常麻烦。 - undefined
如果服务器上启用了WinRM,请为每台机器输入一个PSsession,可能通过csv或列表循环,使用此命令并将其输出到网络共享的txt文件中。 - undefined

1

我没有测试过,但是.NET Socket类有一个OSSupportsIPv6属性。所以大致上应该是这样的:

[System.Net.Sockets]::OSSupportsIPv6

文档中说:“如果操作系统和网络适配器支持IPv6协议,则为true;否则为false。” 我不确定这是否意味着该值基于操作系统的能力,还是基于其配置。我在本地帮助中查找了这个问题,所以我没有MSDN链接可用。应该不难找到。

1

这可能不是你想要做的,但似乎是最好的方法,就是查看netsh interface提供的输出。

你可能想要在这里查找你需要的内容。虽然你的实现会更简单,但只需迭代netsh interface ipv6 show interfaces的结果即可,如果找到接口,则某处启用了它,如果没有找到,则未启用。


0
我使用 Powershell Get-NetAdapterBinding 命令来查找 IPv6 的状态。
$adapterStatus = Get-NetAdapterBinding | Where-Object {$_.ComponentID -eq "ms_tcpip6"} | Select-Object Name, ComponentID, Enabled
$Ipv6Enabled = $true

$adapterStatus | ForEach-Object {
    if( -not ($_.Enabled)){
        Write-Output("{0} adapter IPv6 is disabled on {1}." -f $_.Name, $env:COMPUTERNAME)
        $Ipv6Enabled = $false
    }
}

if($Ipv6Enabled){ 
    Write-Output("All ethernet adapters have IPv6 Enabled.")
}

你也可以使用 PsSessions 进入远程计算机并将其作为脚本块运行,然后将其输出到网络共享上的 txt 文件中。

例如,要启用所有网络适配器的 IPv6,您可以将对象导入 Enable-NetAdapterBinding 中。

Get-NetAdapterBinding -ComponentID ms_tcpip6 | Enable-NetAdapterBinding

这里是文档。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接