<# .SYNOPSIS Аккуратный «ремонт сети» для Windows. .DESCRIPTION По умолчанию (без параметров) выполняет безопасные действия: - release/flush/renew DHCP, - сброс системного прокси WinHTTP, - очистка ARP и перерегистрация NetBIOS имён, - перезапуск службы DNS-клиента. Опционально: - -Plus : добавляет winsock reset, reset IPv6 и «пинок» активных адаптеров; - -ResetIP : выполняет netsh int ip reset (пропускается при статике, если нет -Force); - -RegisterDns : ipconfig /registerdns (для доменных сред/динамического DNS); - -Force : не щадит статические IP и RDP (использовать осознанно); - -Reboot : перезагрузить ПК по завершении (рекомендуется после winsock/ip reset). .EXAMPLES PS> .\Fix-Network.ps1 PS> .\Fix-Network.ps1 -Plus PS> .\Fix-Network.ps1 -Plus -ResetIP -Force -Reboot #> [CmdletBinding(SupportsShouldProcess=$true)] param( [switch]$Plus, [switch]$ResetIP, [switch]$RegisterDns, [switch]$Force, [switch]$Reboot ) #region Elevation $IsAdmin = ([Security.Principal.WindowsPrincipal] ` [Security.Principal.WindowsIdentity]::GetCurrent() ).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator) if (-not $IsAdmin) { Write-Warning "Нужны права администратора. Пытаюсь перезапустить с повышением..." if ($PSCommandPath) { # Собираем аргументы аккуратно в массив (без плюсов в параметре) $allArgs = @("-NoProfile","-ExecutionPolicy","Bypass","-File","`"$PSCommandPath`"") if ($Plus) { $allArgs += "-Plus" } if ($ResetIP) { $allArgs += "-ResetIP" } if ($RegisterDns) { $allArgs += "-RegisterDns" } if ($Force) { $allArgs += "-Force" } if ($Reboot) { $allArgs += "-Reboot" } Start-Process -FilePath "powershell.exe" -ArgumentList $allArgs -Verb RunAs | Out-Null exit } else { Write-Error "Запусти скрипт из .ps1 файла с правами администратора." exit 1 } } #endregion function Step($Title, [scriptblock]$Action) { Write-Host "• $Title" try { & $Action } catch { Write-Warning ('{0}: {1}' -f $Title, $_.Exception.Message) } } $needsReboot = $false $inRdp = ($env:SESSIONNAME -like "RDP-Tcp*") if ($inRdp -and -not $Force) { Write-Host "(Обнаружена RDP-сессия: перезапуск адаптеров будет пропущен; используйте -Force, если это осознанно.)" } # --- БАЗОВЫЙ, БЕЗОПАСНЫЙ НАБОР --- Step "Выпускаю DHCP-адрес (ipconfig /release)" { ipconfig /release | Out-Null } Step "Очищаю DNS-кэш (ipconfig /flushdns)" { ipconfig /flushdns | Out-Null } Step "Сбрасываю системный прокси WinHTTP" { netsh winhttp reset proxy | Out-Null } # ARP и NetBIOS слегка освежим локалку/SMB Step "Очищаю ARP-таблицу" { arp -d * | Out-Null } Step "Перезагружаю NetBIOS кэш имён (nbtstat -R)" { nbtstat -R | Out-Null } Step "Повторная регистрация NetBIOS (nbtstat -RR)" { nbtstat -RR | Out-Null } # DNS Client: перезапуск безопасен Step "Перезапуск службы DNS-клиента" { try { Restart-Service -Name Dnscache -Force -ErrorAction Stop Start-Sleep -Seconds 2 Write-Host "Служба DNS-клиента перезапущена." -ForegroundColor Green } catch { Write-Host "DNS-клиент не перезапущен (служба защищена в этой версии Windows)." -ForegroundColor DarkYellow } } # --- ОПЦИОНАЛЬНОЕ «PLUS» --- if ($Plus) { Step "Winsock reset (netsh winsock reset)" { netsh winsock reset | Out-Null $needsReboot = $true } Step "Сброс параметров IPv6 (netsh int ipv6 reset)" { netsh int ipv6 reset | Out-Null $needsReboot = $true } if (-not ($inRdp -and -not $Force)) { Step "Перезапуск активных сетевых адаптеров" { Get-NetAdapter | Where-Object Status -eq 'Up' | Restart-NetAdapter -Confirm:$false } } else { Write-Host "Пропущено: перезапуск адаптеров (RDP)." } } # --- ОСОБО: TCP/IP RESET (ОСТОРОЖНО СО СТАТИКОЙ) --- if ($ResetIP) { $hasStatic = Get-NetIPInterface -AddressFamily IPv4 | Where-Object { $_.Dhcp -eq 'Disabled' -and $_.ConnectionState -eq 'Connected' } if ($hasStatic -and -not $Force) { Write-Warning "Обнаружены интерфейсы с статическим IPv4. Пропускаю netsh int ip reset (используйте -Force, если уверены)." } else { Step "Сброс TCP/IP стека (netsh int ip reset)" { netsh int ip reset | Out-Null $needsReboot = $true } } } # --- ДОМЕННЫЕ/ДИНАМИЧЕСКИЕ DNS --- if ($RegisterDns) { Step "Перерегистрация DNS-записей (ipconfig /registerdns)" { ipconfig /registerdns | Out-Null } } # --- Завершаем базовый цикл: renew --- Step "Обновляю DHCP-адрес (ipconfig /renew)" { ipconfig /renew | Out-Null } # --- Итоги и перезагрузка --- Write-Host "Готово. Ряд изменений применяется полностью только после перезагрузки." if ($Reboot -or $needsReboot) { if ($Reboot) { Write-Host "Перезагрузка через 5 секунд по ключу -Reboot..." Shutdown.exe /r /t 5 } else { Write-Host "Рекомендуется перезагрузить систему (после winsock/IP сброса)." } } Write-Host Write-Host "Скрипт завершён. Нажмите любую клавишу, чтобы закрыть окно..." -ForegroundColor Yellow [void][System.Console]::ReadKey($true)