#Requires -Version 5.1 <# JbTecWiz Support Centre -- generated fix script Fault : Websites do not load but the IP address pings -- DNS resolution failure Fix : Clear the resolver cache and the poisoned entries in it Source: https://jbtecwiz.com/support/win-net-dns-only Run as : Elevated PowerShell Expect : 10 minutes Risk : low Reversible : yes WHEN THIS IS THE RIGHT FIX Resolution works for some names and not others, or a name resolves to an address that was correct last week. HOW TO UNDO IT None needed. If you removed a hosts entry, it was recorded above before deleting. This script walks the fix one step at a time and asks before each one. Steps with no command are things you do yourself -- it prints those and waits. Run with -DryRun to print without executing. -------------------------------------------------------------------- NO WARRANTY - USE AT YOUR OWN RISK This script is provided by JbTecWiz as-is and with no warranty of any kind, express or implied. You run it entirely at your own risk. JbTecWiz accepts no liability for any loss or damage arising from its use, including but not limited to data loss, downtime, or configuration changes that turn out to be wrong for your system. You are responsible for reading this script before running it, for satisfying yourself that it suits the machine in front of you, and for having a working backup first. Some steps cannot be undone. -------------------------------------------------------------------- #> [CmdletBinding()] param( # Print every step and command without running anything. [switch]$DryRun, # Do not ask before each step. Read the script first if you use this. [switch]$Unattended ) $ErrorActionPreference = 'Stop' $script:Failed = 0 function Write-Rule { param([string]$Text) Write-Host '' Write-Host ('-' * 70) -ForegroundColor DarkGray if ($Text) { Write-Host $Text -ForegroundColor Cyan } } function Show-Prose { param([string]$Text, [string]$Colour = "Gray") if (-not $Text) { return } $words = $Text -split "\s+"; $line = " " foreach ($w in $words) { if (($line.Length + $w.Length) -gt 74) { Write-Host $line -ForegroundColor $Colour; $line = " " } $line += "$w " } if ($line.Trim()) { Write-Host $line -ForegroundColor $Colour } } function Invoke-Step { param( [int]$Number, [string]$Do, [string]$Why, [scriptblock]$Command, [switch]$Manual, [string]$Shell = "powershell" ) Write-Rule " Step $Number of 4" Show-Prose $Do "White" if ($Why) { Write-Host ""; Show-Prose $Why "DarkGray" } if ($Manual) { Write-Host '' Write-Host ' -> Do this yourself, then press Enter to carry on.' -ForegroundColor Yellow if (-not $Unattended -and -not $DryRun) { [void](Read-Host) } return } Write-Host '' foreach ($l in ($Command.ToString().Trim() -split "`n")) { Write-Host (" " + $l.Trim()) -ForegroundColor Green } Write-Host '' if ($DryRun) { Write-Host " (dry run -- not executed)" -ForegroundColor DarkGray; return } if (-not $Unattended) { $a = Read-Host " Run this step? [Y]es / [S]kip / [Q]uit" if ($a -match "^[Qq]") { Write-Host " Stopped at your request."; exit 0 } if ($a -match "^[Ss]") { Write-Host " Skipped." -ForegroundColor DarkGray; return } } try { & $Command } catch { $script:Failed++ Write-Host (" Step $Number failed: " + $_.Exception.Message) -ForegroundColor Red Show-Prose "The rest of the fix may depend on this. Read the write-up before carrying on." "Red" if (-not $Unattended) { $c = Read-Host " Carry on anyway? [y/N]" if ($c -notmatch "^[Yy]") { exit 1 } } } } Write-Rule Write-Host ' Websites do not load but the IP address pings -- DNS resolution failure' -ForegroundColor White Write-Host ' Clear the resolver cache and the poisoned entries in it' -ForegroundColor Cyan Write-Host '' Write-Host ' Risk: low Reversible 10 minutes' Write-Host '' Show-Prose 'No warranty. Use at your own risk - JbTecWiz accepts no liability. Read it before you run it, and have a backup.' 'DarkYellow' Write-Rule if (-not $Unattended -and -not $DryRun) { $go = Read-Host ' Ready? [y/N]' if ($go -notmatch "^[Yy]") { Write-Host " Nothing was changed."; exit 0 } } Invoke-Step -Number 1 -Do 'Look at what is actually cached before clearing it -- this often names the culprit.' -Command { Get-DnsClientCache | Where-Object Entry -notlike '*.local' | Select-Object -First 30 Entry,Data,TimeToLive } Invoke-Step -Number 2 -Do 'Check the hosts file. An entry here beats DNS entirely and survives every cache flush.' -Why 'Old testing entries and adware both live here, and nothing in the network stack will tell you they exist.' -Command { Get-Content $env:WINDIR\System32\drivers\etc\hosts | Where-Object { $_ -notmatch '^\s*#' -and $_.Trim() } } Invoke-Step -Number 3 -Do 'Flush and re-register.' -Command { Clear-DnsClientCache ipconfig /registerdns } Invoke-Step -Number 4 -Do 'Ask the configured server directly, then ask a public one, and compare.' -Command { Resolve-DnsName jbtecwiz.com Resolve-DnsName jbtecwiz.com -Server 1.1.1.1 } Write-Rule " Confirm it worked" Show-Prose 'Both queries return the same address and browsing works.' 'White' Write-Host '' if (-not $DryRun) { Resolve-DnsName outlook.office365.com | Select-Object -First 3 Name,Type,IPAddress } Write-Rule if ($script:Failed -gt 0) { Write-Host (" Finished with " + $script:Failed + " failed step(s).") -ForegroundColor Yellow Show-Prose 'Read the full write-up at https://jbtecwiz.com/support/win-net-dns-only' 'Yellow' } else { Write-Host ' Finished.' -ForegroundColor Green } Write-Host '' Show-Prose 'To undo: None needed. If you removed a hosts entry, it was recorded above before deleting.' 'DarkGray' Write-Rule