gpt4 book ai didi

powershell - 获取静态的接口(interface)及其DNS服务器(未分配dhcp)

转载 作者:行者123 更新时间:2023-12-01 12:03:45 35 4
gpt4 key购买 nike

我正在尝试通过WMI建立静态的网络接口(interface)的DNS服务器(由用户放置)。除了静态部分,我有这个脚本可以工作:

Get-WmiObject Win32_NetworkAdapterConfiguration | Where-Object {$_.DNSServerSearchOrder -ne $null} | Select DnsServerSearchOrder,Index,InterfaceIndex

这将导致如下输出:
DnsServerSearchOrder   Index InterfaceIndex
-------------------- ----- --------------
{192.168.122.1} 1 6
{1.1.1.1} 2 10

带有 192.168.122.1的接口(interface)具有将DNS设置为DHCP的功能,因此该值对我不利。我如何过滤掉dns不是静态的接口(interface)?有任何想法吗?
netsh interface ip show config:
Configuration for interface "Ethernet"
DHCP enabled: Yes
IP Address: 192.168.122.130
Subnet Prefix: 192.168.122.0/24 (mask 255.255.255.0)
Default Gateway: 192.168.122.1
Gateway Metric: 0
InterfaceMetric: 35
DNS servers configured through DHCP: 192.168.122.1
Register with which suffix: Primary only
WINS servers configured through DHCP: None

Configuration for interface "Ethernet 2"
DHCP enabled: Yes
IP Address: 10.0.0.17
Subnet Prefix: 10.0.0.0/24 (mask 255.255.255.0)
Default Gateway: 10.0.0.1
Gateway Metric: 0
InterfaceMetric: 35
Statically Configured DNS Servers: 1.1.1.1
Register with which suffix: Primary only
WINS servers configured through DHCP: None

注意 Statically Configured DNS ServersDNS servers configured through DHCP之间的术语差异。我想我可能会解析此输出,但是如果Windows语言/区域设置已更改,我不确定是否可以依靠此文本,并且如果可能的话,我宁愿使用WMI接口(interface)。

最佳答案

我认为这可能在 System.Net.NetworkInformation namespace中可用,但显然没有。我浏览了一些较低级别的Windows networking APIs,以为肯定它一定存在于其中,但是没有这种运气。在dumpbin上运行 netsh.exe 以查看它正在使用哪种类型的库/函数之后,我确实有了另一种外观的想法:注册表。

碰巧的是,如果您在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces\项下查看注册表,您将看到每个网络接口(interface)的项,其名称为GUID格式。在界面的键中,您将找到两个感兴趣的值:DhcpNameServerNameServer。在由DHCP设置DNS服务器的客户端系统上,DhcpNameServer包含该DNS服务器的IP地址,而NameServer包含一个空的[String]。如果我在保留接口(interface)本身的自动分配地址的同时手动设置DNS服务器,则NameServer包含该手动设置的DNS服务器地址,而DhcpNameServer仍包含由DHCP指定的相同DNS服务器。

基于这些观察,似乎...

  • DhcpNameServer值始终包含DHCP指定的DNS服务器。
  • NameServer值始终包含手动指定的DNS服务器。
  • 当您查询系统的名称服务器时(例如,通过Win32_NetworkAdapterConfiguration.DNSServerSearchOrder属性),结果将包含NameServer的值(如果提供),否则包含DhcpNameServer的值(如果提供)。换句话说,系统会告诉您当前正在使用哪些DNS服务器,而不是如何指定其地址。
  • 要确定接口(interface)是否具有手动分配的DNS服务器,请检查NameServer是否具有非空值。

  • 因此,给定一个ID为 $interfaceID的接口(interface),您可以像下面这样建立其注册表项的路径。

    $interfaceKeyPath = "HKLM:\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces\$interfaceID"

    ...然后检索像这样动态分配和手动分配的名称服务器值...

    Get-ItemProperty -Path $interfaceKeyPath -Name 'DhcpNameServer', 'NameServer'

    剩下的事情就是从哪里获得 $interfaceID的值,尽管有很多技巧,但可以将不需要的接口(interface)排除在外(例如,在Windows 10系统上,我有一个数据包捕获回送适配器和一个虚拟机管理程序适配器,想要从此类查询中排除)。最兼容的方法(可追溯到.NET 2.0)是 Id property NetworkInterface class ...

    [System.Net.NetworkInformation.NetworkInterface]::GetAllNetworkInterfaces() `
    | Select-Object -ExpandProperty 'Id'

    ...虽然唯一有用的 properties on which to filter Name NetworkInterfaceType

    在Windows Vista及更高版本上, Win32_NetworkAdapter class提供了 GUID属性...

    Get-WmiObject -Class 'Win32_NetworkAdapter' -Property 'GUID' -Filter 'PhysicalAdapter = true'

    ...尽管即使在 PhysicalAdapter上进行过滤时,它仍会返回回送和管理程序适配器,并且我看不到任何可用于仅选择硬件适配器的确定性属性或类关系。

    Win32_NetworkAdapterConfiguration class差不多...

    Get-WmiObject -Class 'Win32_NetworkAdapterConfiguration' -Property 'SettingID'

    ...没有任何属性可以过滤掉非硬件甚至非物理适配器。

    在(我认为)Windows 8及更高版本上有 Get-NetConnectionProfile cmdlet ...

    Get-NetConnectionProfile | Select-Object -ExpandProperty 'InstanceID'

    它被记录为获得“与一个或多个物理网络适配器关联的连接配置文件”,并且在我的系统上,它仅返回我的物理适配器。

    还有 Get-NetAdapter cmdlet ...

    Get-NetAdapter -Physical `
    | Where-Object -Property 'EndPointInterface' -NE -Value $true `
    | Select-Object -ExpandProperty 'InterfaceGuid'

    我发现传递 -Physical参数排除了虚拟机管理程序适配器,但没有环回适配器,因此有必要过滤掉 EndPointInterface$true的位置,以消除这种情况。 HardwareInterfaceVirtual属性也可能是您感兴趣的。

    另一个选择是调用 Get-NetAdapterHardwareInfo cmdlet,它似乎知道如何区分真正的硬件适配器,并让它确定 Get-NetAdapter检索哪些适配器...

    Get-NetAdapterHardwareInfo `
    | Get-NetAdapter `
    | Select-Object -ExpandProperty 'InterfaceGuid'

    上面的 Get-Net* cmdlet返回CIM实例,因此,例如,除了 Get-NetAdapter -Physical外,您可以使用类似...

    Get-WmiObject -Namespace 'Root\StandardCimv2' -Class 'MSFT_NetAdapter' `
    -Property 'InterfaceGuid' -Filter 'HardwareInterface = true AND EndPointInterface = false'

    以相同的方式检索 MSFT_NetAdapter 实例。我不太确定使用哪种指南的指南。似乎人们应该更喜欢cmdlet,但是与WMI / CIM不同,它们提供了有限/无参数来有效过滤输出或指定所需的属性,因此您必须在管道中进行操作。不过,我认为值得注意的是,我无法找到这些 MSFT_*类的任何当前文档。他们都说他们不再更新了,除了 MSFT_NetConnectionProfile类,我根本找不到它的任何文档页面。对我来说,微软不希望您依赖这些类的任何确定结构,但是如果cmdlet仅传递这些类实例……我不确定如果什么都没有的话,您如何能够有意义,可靠地与它们交互记录下来。

    另外,请记住,如果可能的话,您将在 want to prefer上使用 Get-CimInstance its ilk Get-WmiObject 。我认为我还没有遇到过一个比将 Get-WmiObject更改为 Get-CimInstance更为复杂的实例,尽管其名称之间的差异(不一定是不好的)。

    关于powershell - 获取静态的接口(interface)及其DNS服务器(未分配dhcp),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59727748/

    35 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com