<# Reparar la red Herramientas BAIT · https://bait.cl/herramientas/script-reparar-red/ Qué hace (menú): 1. Probar la conexión: ping a la puerta de enlace (router), a 1.1.1.1 (internet) y resolución de google.com (DNS). Al final explica en palabras dónde está el problema. 2. Limpiar la caché DNS. 3. Renovar la dirección IP (suelta y pide una nueva al router). 4. Reiniciar Winsock y TCP/IP (requiere reiniciar el equipo). 5. Restablecer un adaptador de red (lo apaga y lo enciende). 6. Reparación rápida: 2, 3 y 5 seguidos y después prueba la conexión. La prueba de conexión y la limpieza de DNS no necesitan administrador. Las demás sí: el script avisa y ofrece abrirse de nuevo como administrador. Uso: Clic derecho > Ejecutar con PowerShell o bien: powershell -ExecutionPolicy Bypass -File .\reparar-red.ps1 #> $Host.UI.RawUI.WindowTitle = 'Reparar la red (BAIT)' # ---------- utilidades ---------- function Test-Administrador { $principal = New-Object Security.Principal.WindowsPrincipal([Security.Principal.WindowsIdentity]::GetCurrent()) return $principal.IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator) } # Si la opción necesita administrador y no lo somos, ofrece reabrir elevado. Devuelve $true si se puede seguir. function Pedir-Administrador { if (Test-Administrador) { return $true } Write-Host 'Esta opción necesita permisos de administrador.' -ForegroundColor Yellow if ($PSCommandPath -and ((Read-Host '¿Abrir el script de nuevo como administrador? (S/N)') -match '^[sS]')) { Start-Process -FilePath 'powershell.exe' -ArgumentList @('-NoProfile', '-ExecutionPolicy', 'Bypass', '-File', "`"$PSCommandPath`"") -Verb RunAs exit } return $false } function Titulo([string]$Texto) { Write-Host ''; Write-Host "--- $Texto ---" -ForegroundColor Cyan } # ---------- acciones ---------- function Probar-Conexion { Titulo 'Prueba de conexión' # Adaptadores conectados y su IP $config = Get-NetIPConfiguration -ErrorAction SilentlyContinue | Where-Object { $_.NetAdapter.Status -eq 'Up' } foreach ($c in $config) { $ip = ($c.IPv4Address | Select-Object -ExpandProperty IPAddress) -join ', ' Write-Host ("Adaptador: {0} IP: {1}" -f $c.InterfaceAlias, $ip) } $ipApipa = $config | ForEach-Object { $_.IPv4Address.IPAddress } | Where-Object { $_ -like '169.254.*' } # Puerta de enlace: la ruta por defecto con menor métrica $ruta = Get-NetRoute -DestinationPrefix '0.0.0.0/0' -ErrorAction SilentlyContinue | Sort-Object { $_.RouteMetric + $_.InterfaceMetric } | Select-Object -First 1 $gateway = $null if ($ruta) { $gateway = $ruta.NextHop } $okGateway = $false if ($gateway) { $okGateway = Test-Connection -ComputerName $gateway -Count 2 -Quiet -ErrorAction SilentlyContinue Write-Host ("Router ({0}): {1}" -f $gateway, $(if ($okGateway) { 'responde' } else { 'no responde' })) -ForegroundColor $(if ($okGateway) { 'Green' } else { 'Red' }) } else { Write-Host 'Router: no hay puerta de enlace configurada' -ForegroundColor Red } $okInternet = Test-Connection -ComputerName '1.1.1.1' -Count 2 -Quiet -ErrorAction SilentlyContinue Write-Host ("Internet (1.1.1.1): {0}" -f $(if ($okInternet) { 'responde' } else { 'no responde' })) -ForegroundColor $(if ($okInternet) { 'Green' } else { 'Red' }) $okDns = $false try { $res = Resolve-DnsName -Name 'google.com' -Type A -DnsOnly -QuickTimeout -ErrorAction Stop | Where-Object { $_.IPAddress } | Select-Object -First 1 $okDns = [bool]$res } catch { $okDns = $false } Write-Host ("Nombres (google.com): {0}" -f $(if ($okDns) { 'se resuelve' } else { 'no se resuelve' })) -ForegroundColor $(if ($okDns) { 'Green' } else { 'Red' }) # Diagnóstico en palabras Write-Host '' Write-Host 'Diagnóstico:' -ForegroundColor Cyan if (-not $config) { Write-Host 'No hay ningún adaptador de red conectado. Revisa el cable, que el WiFi esté encendido y que no esté el modo avión.' } elseif ($ipApipa) { Write-Host 'El equipo tiene una IP 169.254.x.x: no recibió dirección del router. Prueba la opción 3 (renovar IP) y reinicia el router si sigue igual.' } elseif (-not $gateway) { Write-Host 'El equipo está conectado pero sin puerta de enlace. Renueva la IP (opción 3) o revisa si tiene una IP fija mal configurada.' } elseif (-not $okGateway -and -not $okInternet) { Write-Host 'El equipo no llega al router. Revisa el cable o la señal WiFi, y prueba restablecer el adaptador (opción 5).' } elseif (-not $okInternet) { Write-Host 'Llega al router pero no a internet. El problema probablemente está en el router o en el proveedor: reinicia el router o llama a tu compañía.' } elseif (-not $okDns) { Write-Host 'Hay internet, pero no se pueden resolver nombres de sitios (DNS). Limpia la caché DNS (opción 2) o configura otros DNS, como 1.1.1.1 y 8.8.8.8.' } else { Write-Host 'La conexión funciona: llega al router, a internet y resuelve nombres. Si un sitio puntual no abre, el problema es de ese sitio o del navegador.' -ForegroundColor Green } if ($okInternet -and -not $okGateway) { Write-Host '(El router no respondió al ping, pero hay internet: algunos routers ignoran el ping y no es un problema.)' -ForegroundColor Gray } } function Limpiar-Dns { Titulo 'Limpiar caché DNS' ipconfig /flushdns | Out-Host } function Renovar-Ip { Titulo 'Renovar dirección IP' if (-not (Pedir-Administrador)) { return } Write-Host 'Soltando la IP actual (la conexión se corta unos segundos)...' ipconfig /release | Out-Null Write-Host 'Pidiendo una IP nueva...' ipconfig /renew | Out-Null Get-NetIPConfiguration | Where-Object { $_.NetAdapter.Status -eq 'Up' } | ForEach-Object { Write-Host ("{0}: {1}" -f $_.InterfaceAlias, (($_.IPv4Address | Select-Object -ExpandProperty IPAddress) -join ', ')) -ForegroundColor Green } } function Reiniciar-Pila { Titulo 'Reiniciar Winsock y TCP/IP' if (-not (Pedir-Administrador)) { return } Write-Host 'Esto devuelve la configuración de red de Windows a su estado inicial.' Write-Host 'Si el equipo tiene una IP fija o un proxy configurado a mano, habrá que volver a ponerlos.' -ForegroundColor Yellow Write-Host 'Al terminar hay que REINICIAR el equipo.' -ForegroundColor Yellow if ((Read-Host '¿Continuar? (S/N)') -notmatch '^[sS]') { return } netsh winsock reset | Out-Host netsh int ip reset | Out-Host if ((Read-Host '¿Reiniciar el equipo ahora? Guarda tu trabajo antes. (S/N)') -match '^[sS]') { Restart-Computer -Force } else { Write-Host 'Recuerda reiniciar el equipo para terminar la reparación.' -ForegroundColor Yellow } } function Restablecer-Adaptador([switch]$Todos) { Titulo 'Restablecer adaptador de red' if (-not (Pedir-Administrador)) { return } $adaptadores = @(Get-NetAdapter -Physical -ErrorAction SilentlyContinue | Where-Object { $_.Status -ne 'Disabled' }) if (-not $adaptadores) { Write-Host 'No se encontraron adaptadores de red.' -ForegroundColor Red; return } if ($Todos) { $elegidos = @($adaptadores | Where-Object { $_.Status -eq 'Up' }) if (-not $elegidos) { $elegidos = $adaptadores } } else { for ($i = 0; $i -lt $adaptadores.Count; $i++) { Write-Host ("{0}. {1} ({2}) {3}" -f ($i + 1), $adaptadores[$i].Name, $adaptadores[$i].InterfaceDescription, $adaptadores[$i].Status) } $n = Read-Host 'Número del adaptador (Enter para cancelar)' if (-not $n -or -not ($n -as [int]) -or [int]$n -lt 1 -or [int]$n -gt $adaptadores.Count) { return } $elegidos = @($adaptadores[[int]$n - 1]) } foreach ($a in $elegidos) { Write-Host "Reiniciando $($a.Name)..." Restart-NetAdapter -Name $a.Name -Confirm:$false } Write-Host 'Esperando que la conexión vuelva...' Start-Sleep -Seconds 8 Write-Host 'Listo.' -ForegroundColor Green } # ---------- menú ---------- do { Write-Host '' Write-Host '=== Reparar la red ===' -ForegroundColor Cyan $etiquetaAdmin = '' if (-not (Test-Administrador)) { $etiquetaAdmin = ' (pide administrador)' } Write-Host '1. Probar la conexión' Write-Host '2. Limpiar caché DNS' Write-Host "3. Renovar dirección IP$etiquetaAdmin" Write-Host "4. Reiniciar Winsock y TCP/IP, requiere reiniciar$etiquetaAdmin" Write-Host "5. Restablecer un adaptador$etiquetaAdmin" Write-Host "6. Reparación rápida (2, 3 y 5, y luego prueba)$etiquetaAdmin" Write-Host '0. Salir' $opcion = Read-Host 'Elige una opción' switch ($opcion) { '1' { Probar-Conexion } '2' { Limpiar-Dns } '3' { Renovar-Ip } '4' { Reiniciar-Pila } '5' { Restablecer-Adaptador } '6' { if (Pedir-Administrador) { Limpiar-Dns Renovar-Ip Restablecer-Adaptador -Todos Probar-Conexion } } '0' { } default { Write-Host 'Opción no válida.' -ForegroundColor Yellow } } } while ($opcion -ne '0') Write-Host '¿La red sigue fallando en tu oficina? En BAIT la revisamos por ti: https://bait.cl'