在 Windows 中,可以使用 PowerShell 來實現多個 DNS 自動切換的功能。雖然 Windows 本身不提供一個直接的自動切換 DNS 的功能,但可以透過定期檢測網路狀態,結合指令碼修改 DNS 設定,達到類似的效果。

suv789發表於2024-11-11

在 Windows 中,可以使用 PowerShell 來實現多個 DNS 自動切換的功能。雖然 Windows 本身不提供一個直接的自動切換 DNS 的功能,但可以透過定期檢測網路狀態,結合指令碼修改 DNS 設定,達到類似的效果。

以下是實現多 DNS 自動切換的 PowerShell 指令碼思路和方法。

思路

  1. 設定多個 DNS 伺服器,例如主 DNS 和備用 DNS。
  2. 定期檢測網路連通性或 DNS 解析的可用性。
  3. 如果主 DNS 無法正常解析域名,則自動切換到備用 DNS。
  4. 可以透過修改 Get-DnsClientServerAddressSet-DnsClientServerAddress 命令來動態修改 DNS 設定。

示例 PowerShell 指令碼:自動切換 DNS

這個指令碼會定期檢查主 DNS 是否可用,若不可用,則切換到備用 DNS。

powershellCopy Code
# 配置 DNS 伺服器
$primaryDNS = "8.8.8.8"  # 主 DNS (Google DNS)
$secondaryDNS = "8.8.4.4"  # 備用 DNS (Google DNS)
$interfaceAlias = "Ethernet"  # 網路介面卡的別名,例如 "Ethernet" 或 "Wi-Fi"
$targetHost = "www.google.com"  # 用來測試 DNS 解析的目標域名

# 檢查 DNS 解析是否可用
function Test-DnsResolution {
    param(
        [string]$dnsServer,
        [string]$host
    )
    
    try {
        # 使用指定的 DNS 伺服器解析目標域名
        $resolved = Resolve-DnsName -Name $host -Server $dnsServer -ErrorAction Stop
        return $true
    }
    catch {
        return $false
    }
}

# 設定 DNS
function Set-Dns {
    param(
        [string]$dnsServer
    )
    
    # 設定指定 DNS 伺服器
    Set-DnsClientServerAddress -InterfaceAlias $interfaceAlias -ServerAddresses $dnsServer
    Write-Host "DNS 設定為: $dnsServer"
}

# 檢查並切換 DNS
function Switch-Dns {
    $primaryDnsAvailable = Test-DnsResolution -dnsServer $primaryDNS -host $targetHost
    if ($primaryDnsAvailable) {
        Write-Host "主 DNS 可用,保持主 DNS: $primaryDNS"
        # 設定主 DNS
        Set-Dns -dnsServer $primaryDNS
    }
    else {
        Write-Host "主 DNS 不可用,切換到備用 DNS: $secondaryDNS"
        # 設定備用 DNS
        Set-Dns -dnsServer $secondaryDNS
    }
}

# 定時每 30 秒檢查一次並根據可用性切換 DNS
while ($true) {
    Switch-Dns
    Start-Sleep -Seconds 30  # 每 30 秒檢查一次
}

關鍵部分說明:

  1. Test-DnsResolution:

    • 使用 Resolve-DnsName 命令來測試給定 DNS 是否可以解析目標域名(例如,www.google.com)。
    • 如果 DNS 伺服器無法解析域名,函式返回 false,表示該 DNS 不可用。
  2. Set-Dns:

    • 使用 Set-DnsClientServerAddress 命令來設定網路介面卡的 DNS 伺服器。
    • 該命令將修改指定介面(如 EthernetWi-Fi)的 DNS 設定。
  3. Switch-Dns:

    • 根據 Test-DnsResolution 的結果,判斷主 DNS 是否可用。如果主 DNS 不可用,則切換到備用 DNS。
    • 如果主 DNS 可用,則繼續使用主 DNS。
  4. 定時迴圈:

    • while ($true) 迴圈會持續執行,並每隔 30 秒檢查一次 DNS 解析是否可用。
    • Start-Sleep -Seconds 30 控制檢查頻率。

如何使用:

  1. 設定網路介面卡名稱

    • $interfaceAlias 變數中,設定你想要操作的網路介面卡名稱。通常是 "Ethernet""Wi-Fi"。你可以透過 Get-NetAdapter 命令檢視當前的網路介面卡名稱。
  2. 執行指令碼

    • 開啟 PowerShell,確保以管理員身份執行,因為修改 DNS 設定需要管理員許可權。
    • 將指令碼貼上到 PowerShell 視窗並執行。
  3. 指令碼效果

    • 指令碼會定期檢查 DNS 可用性,如果主 DNS 不可用,則自動切換到備用 DNS,確保網路連線不受影響。

注意事項:

  1. DNS 伺服器的可用性

    • 這裡的測試方法依賴於目標域名解析的成功與否。如果目標 DNS 伺服器存在防火牆或其他安全策略,可能會阻止 ICMP 或 DNS 請求,因此測試可能會失敗。
  2. 防火牆設定

    • 確保你的防火牆允許 ICMP 請求(ping)和 DNS 查詢。否則,指令碼可能無法正確檢測 DNS 是否可用。
  3. 管理員許可權

    • 修改 DNS 設定需要管理員許可權,確保 PowerShell 以管理員身份執行。

進階用法:

如果你希望根據不同的網路環境(例如連線的 Wi-Fi 網路不同)自動切換 DNS,可以透過修改 Switch-Dns 函式來判斷當前網路,並根據不同的網路設定不同的 DNS 伺服器。

透過這種方式,使用 PowerShell 動態切換 DNS 是可行的,並且可以實現一定程度的自動化與靈活性。


在 PowerShell 中動態切換 DNS 可以透過指令碼來實現。你可以根據網路連線的狀態、響應時間、DNS 可用性等條件來自動切換不同的 DNS 伺服器。以下是一個更為簡化且功能完善的 PowerShell 指令碼,可以根據需要動態切換 DNS。

思路:

  1. 檢查當前 DNS 是否有效。
  2. 如果 DNS 無效,切換到備用 DNS。
  3. 設定主 DNS 和備用 DNS。
  4. 定時監控 DNS 的可用性,若主 DNS 不可用,切換到備用 DNS。

PowerShell 指令碼:動態切換 DNS

powershellCopy Code
# 配置主 DNS 和備用 DNS
$primaryDNS = "8.8.8.8"  # 主 DNS (Google DNS)
$secondaryDNS = "8.8.4.4"  # 備用 DNS (Google DNS)
$interfaceAlias = "Ethernet"  # 網路介面卡名稱 (可根據需要修改為 "Wi-Fi" 或其他)
$targetHost = "www.google.com"  # 用於測試 DNS 解析的目標地址

# 檢查 DNS 是否可用
function Test-DnsResolution {
    param(
        [string]$dnsServer,
        [string]$host
    )
    
    try {
        # 嘗試使用指定的 DNS 解析域名
        Resolve-DnsName -Name $host -Server $dnsServer -ErrorAction Stop | Out-Null
        return $true
    }
    catch {
        return $false
    }
}

# 設定新的 DNS 伺服器
function Set-Dns {
    param(
        [string]$dnsServer
    )
    
    # 設定指定 DNS 伺服器
    Set-DnsClientServerAddress -InterfaceAlias $interfaceAlias -ServerAddresses $dnsServer
    Write-Host "DNS 設定為: $dnsServer"
}

# 檢查並切換 DNS
function Switch-Dns {
    # 檢查主 DNS 是否可用
    $primaryDnsAvailable = Test-DnsResolution -dnsServer $primaryDNS -host $targetHost
    if ($primaryDnsAvailable) {
        Write-Host "主 DNS 可用,繼續使用主 DNS: $primaryDNS"
        # 設定主 DNS
        Set-Dns -dnsServer $primaryDNS
    }
    else {
        Write-Host "主 DNS 不可用,切換到備用 DNS: $secondaryDNS"
        # 設定備用 DNS
        Set-Dns -dnsServer $secondaryDNS
    }
}

# 定時檢查並切換 DNS
while ($true) {
    Switch-Dns  # 檢查並切換 DNS
    Start-Sleep -Seconds 60  # 每 60 秒檢查一次
}

關鍵部分解釋:

  1. Test-DnsResolution

    • 使用 Resolve-DnsName 命令嘗試解析給定的主機($targetHost)。如果解析成功,表示 DNS 可用,返回 true;如果失敗,則返回 false
  2. Set-Dns

    • 使用 Set-DnsClientServerAddress 命令來設定指定網路介面(例如,EthernetWi-Fi)的 DNS 伺服器地址。設定成功後,會列印出當前的 DNS 地址。
  3. Switch-Dns

    • 該函式首先檢查主 DNS 是否可用。如果主 DNS 可用,則保持主 DNS;如果主 DNS 不可用,則切換到備用 DNS。
  4. 定時檢查

    • 使用 while ($true) 迴圈,定時每 60 秒檢查 DNS 是否有效,如果無效,則進行切換。

    • Start-Sleep -Seconds 60 讓指令碼每 60 秒檢查一次。

如何使用:

  1. 修改介面卡名稱

    • 在指令碼中,$interfaceAlias 指定了網路介面卡的名稱(例如,EthernetWi-Fi)。你可以透過執行 Get-NetAdapter 命令檢視當前網路介面卡名稱。
  2. 執行指令碼

    • 開啟 PowerShell 視窗,以管理員身份執行指令碼(需要管理員許可權來修改 DNS 設定)。
    • 複製指令碼並貼上到 PowerShell 視窗中,按 Enter 執行。
  3. 測試指令碼效果

    • 指令碼會每 60 秒檢查一次 DNS 是否可用。如果主 DNS 不可用,則會自動切換到備用 DNS。

自定義:

  • 如果需要新增多個備用 DNS,可以修改指令碼,新增更多的 DNS 檢查邏輯。例如,可以擴充套件 Test-DnsResolution 來檢查多個 DNS 伺服器。
  • 可以根據實際需求修改檢測間隔時間(例如,將 Start-Sleep -Seconds 60 改為 30 秒、120 秒等)。

注意事項:

  • 管理員許可權:更改 DNS 設定需要管理員許可權,因此請確保 PowerShell 以管理員身份執行。
  • DNS 解析失敗:如果目標主機(例如 www.google.com)無法解析,可能是因為網路環境中的 DNS 被遮蔽,或者目標主機本身無法訪問。在這種情況下,指令碼會切換到備用 DNS。

透過這種方式,你可以自動切換 DNS,確保網路的穩定性。


相關文章