Get-DnsClient、Get-DnsClientServerAddressを使う前に、端末がどの実装を呼び、どの対象を読むかを確認してください。PowerShellでDNSクライアントの情報を取得する:Get-DnsClientコマンドの5つの具体的な利用例の結論は「Get-DnsClientはinterfaceのDNS suffixやregistration設定を返しますが、DNS server addressはGet-DnsClientServerAddressで取得します。旧例の(Get-DnsClient).ServerAddressesは正しいpropertyではありません。」。DnsClient moduleが利用できるWindowsでinterface単位のsuffixとserver addressを分けて読む環境で、未確認の変更を避けるための順番を示します。
稼働adapterとDNS client設定を対応付ける
DNSクライアント調査では、稼働中インターフェースごとにInterfaceIndex、接続固有サフィックス、DNSサーバーアドレスを対応付けます。Resolve-DnsNameで対象名のAまたはAAAA応答とエラー種別を記録し、キャッシュ結果と明示した問い合わせを区別します。問い合わせ先を証跡へ残す例では、構成済みアドレスを$serverへ格納して-Serverへ渡し、計算プロパティQueriedServerとして入力値を併記します。設定変更は行わず、VPNや複数NICによる優先順位も併記します。
- Get-NetAdapterでinterface alias、Index、Statusを確認する
- Get-DnsClientでsuffixとregistrationを読む
- Get-DnsClientServerAddressでIPv4/IPv6 serverを取得する
- Resolve-DnsNameで実際のquery結果とserverを確認する
interfaceごとのDNS server listを読む
有効interfaceのDNS client設定
Get-DnsClient | Where-Object InterfaceAlias -in (Get-NetAdapter | Where-Object Status -eq 'Up').Name |
Select-Object InterfaceAlias,InterfaceIndex,ConnectionSpecificSuffix,RegisterThisConnectionsAddress
adapter名とIndexを併記し、仮想・VPN・物理interfaceを区別します。
DNS server addressを取得
Get-DnsClientServerAddress -AddressFamily IPv4 |
Select-Object InterfaceAlias,InterfaceIndex,ServerAddresses
ServerAddressesはこのcmdletのpropertyです。空配列やDHCP取得を勝手に障害と断定しません。
一つのinterfaceへ限定
Get-DnsClient -InterfaceAlias 'Ethernet'
Get-DnsClientServerAddress -InterfaceAlias 'Ethernet'
aliasは端末で異なるためGet-NetAdapterで実名を確認します。substring一致で別adapterを巻き込みません。
名前解決を検証
$dnsConfig = Get-DnsClientServerAddress -AddressFamily IPv4 |
Where-Object { $_.ServerAddresses.Count -gt 0 } |
Select-Object -First 1
$server = @($dnsConfig.ServerAddresses)[0]
if (-not $server) { throw 'No configured IPv4 DNS server was found.' }
Resolve-DnsName -Name 'www.microsoft.com' -Type A -Server $server -DnsOnly -ErrorAction Stop |
Select-Object Name,Type,IPAddress,TTL,@{n='QueriedServer';e={$server}}
業務domainの確認では期待recordとsplit DNSを考慮します。public名の成功だけで社内DNS正常とは判断しません。
policy情報を読む
Get-DnsClientNrptPolicy -Effective | Select-Object Namespace,NameServers,DirectAccessEnabled
NRPTはquery routeへ影響します。結果がある環境では通常server addressだけでなくpolicyも確認します。
NRPT policyと直接指定serverを分ける
取得commandは読み取りです。Set-DnsClientServerAddressやClear-DnsClientCacheは接続や診断状態を変えるため、この記事の基本手順では実行しません。変更が必要なら現在のserver address、DHCP由来か静的か、interface Indexをexportし、out-of-band接続と戻しcommandを準備します。誤設定時は元の静的addressまたはResetServerAddressesで正しいDHCP状態へ戻し、名前解決と業務接続を確認します。
実queryで名前解決経路を確かめる
interfaceごとのsuffix、global suffix search list、server address、NRPT、hosts file、cacheは別要素です。Get-DnsClientだけで全DNS構成を把握できません。VPN接続時はinterface metricやpolicyによりquery先が変わります。IPv4だけを見てIPv6経路を見落とさず、Resolve-DnsNameの応答レコードと、-Serverへ渡した問い合わせ先を調査時刻付きで別々に記録します。QueriedServerは指定した入力値であり、実際の応答元を表す値ではありません。
VPNとsplit DNSの影響を記録する
- Get-DnsClientにServerAddressesがあると思う
- down状態のadapterを現用と誤認する
- IPv4だけ調べる
- VPNとNRPTを見ない
- cache削除を最初の確認にする
設定変更なしでresolverを切り分ける
ipconfig /all、Get-NetIPConfiguration、Get-DnsClientServerAddressを同じInterfaceIndexで照合します。Resolve-DnsNameでpublicと業務domainを一件ずつ確認し、A/AAAA/CNAMEの期待を分けます。変更していない調査では前後のserver addressとNRPTが同一であることを確認します。
client設定と回答serverを一組で検収する
Get-DnsClientはinterface設定、Get-DnsClientServerAddressは構成済みDNSアドレス、Resolve-DnsNameはquery結果を示します。VPN、NRPT、DoH等で設定値と利用経路が異なるため、InterfaceIndexをkeyに有効adapterと構成値を対応付け、明示した問い合わせだけをQueriedServerとして別記します。-Serverを省略して既定のリゾルバーを使った場合、Resolve-DnsNameの結果オブジェクトから実際の応答元を特定することはできません。
Up adapterの設定とA record queryを並べる
$up = (Get-NetAdapter | Where-Object Status -eq 'Up').ifIndex
$dnsConfig = Get-DnsClientServerAddress -AddressFamily IPv4 |
Where-Object { $_.InterfaceIndex -in $up -and $_.ServerAddresses.Count -gt 0 } |
Select-Object -First 1
$dnsConfig | Select-Object InterfaceAlias,InterfaceIndex,ServerAddresses
$server = @($dnsConfig.ServerAddresses)[0]
if (-not $server) { throw 'No configured IPv4 DNS server was found on an active interface.' }
Resolve-DnsName -Name 'www.microsoft.com' -Type A -Server $server -DnsOnly -ErrorAction Stop |
Select-Object Name,Type,IPAddress,@{n='QueriedServer';e={$server}}
DNS応答とresolver障害をrcodeで識別する
- DNS回答あり:Upのinterfaceごとにsuffix/serverを取得し、対象名のA/AAAA応答を確認し、-Serverを使った試験では指定した問い合わせ先(QueriedServer)を併記できる
- 名前が存在しない:NoRecordsは名前不存在やtypeなしとして扱い、network errorと分離する
- resolver・policy error:timeout、SERVFAIL、policy block、access deniedはResolve-DnsNameの例外情報を保存する
public DNSだけの成功で社内名前解決を正常としません。全interfaceのserverを一つに並べて順序を失わず、NRPT適用namespaceとVPN metricを確認します。設定確認だけでDNS cacheやadapterを変更しません。
.invalid名と複数interfaceを試す
try { Resolve-DnsName -Name 'does-not-exist.invalid' -DnsOnly -ErrorAction Stop } catch { [pscustomobject]@{State='ResolutionError';Code=$_.Exception.ErrorCode;Message=$_.Exception.Message} }
正常名、NXDOMAIN、timeout、VPN接続前後、複数interfaceをtestします。InterfaceIndex、server順、suffix、NRPT一致rule、response type/TTL、例外codeを残します。
ServerAddressesは構成済みの問い合わせ先候補です。その値だけでは実際の応答元を証明できません。interface、NRPT、VPN状態を記録し、Resolve-DnsNameの回答とerror codeまで含めて判断します。

コメント