fix-nic-powersave.ps1: отключение энергосбережения NIC (TrueGamers)

This commit is contained in:
oleg
2026-10-23 13:16:45 +03:00
parent 44f2551e0a
commit 9cce947a5b

95
fix-nic-powersave.ps1 Normal file
View File

@@ -0,0 +1,95 @@
# fix-nic-powersave.ps1 - отключение энергосбережения сетевой карты (EEE / Green Ethernet / PnP power).
# TrueGamers: лечит link-флапы с периодом ~5 с (PC20 .120, PC06 .106 и другие машины зала).
# Запуск от Администратора: powershell -ExecutionPolicy Bypass -File fix-nic-powersave.ps1
#
# 21.09.2026: заменяет fix-realtek-eee.ps1. Тот работал только с Realtek, а в клубе шесть разных
# OUI (18:C0:4D, 10:7C:61, 30:56:0F, D8:5E:D3, 9C:6B:00, 08:BF:B8) — на остальных машинах он
# просто выходил с "адаптеры не найдены".
#
# ВАЖНО: Wake-on-LAN НЕ трогаем. Клуб будит машины по сети, а метрика "порт на 10 Мбит = машина
# выключена" построена ровно на том, что карта держит линк для WoL (см. decisions/2026-09-15-
# truegamers-false-bad-cable-verdict). Поэтому ключи WakeOnMagicPacket / S5WakeOnLan /
# WolShutdownLinkSpeed остаются как есть.
#
# ВНИМАНИЕ: применение кратко роняет линк (2-5 с, адаптер переинициализируется) —
# только на машине, за которой сейчас никто не играет.
#Requires -RunAsAdministrator
# Ключи реестра, а не подписи в UI: имена свойств локализованы, ключи — нет.
$keywords = @(
'*EEE', # стандартный ключ Energy Efficient Ethernet
'EnableEee', # Realtek
'AdvancedEEE', # Realtek
'EnableGreenEthernet', # Realtek Green Ethernet
'GigaLite', # Realtek Gigabit Lite
'EEELinkAdvertisement', # анонс EEE при автосогласовании
'AutoDisableGigabit', # авто-понижение скорости при простое
'PowerSavingMode', # общий режим энергосбережения
'ULPMode', # Ultra Low Power (Intel/Killer)
'EnableDynamicPowerGating',
'AutoPowerSaveModeEnabled'
)
$nics = Get-NetAdapter -Physical -ErrorAction SilentlyContinue |
Where-Object { $_.Virtual -ne $true }
if (-not $nics) {
Write-Host "Физические сетевые адаптеры не найдены."
exit 1
}
foreach ($nic in $nics) {
Write-Host ("=" * 60)
Write-Host ("Адаптер: " + $nic.Name + " | " + $nic.InterfaceDescription + " | " + $nic.Status + " | " + $nic.LinkSpeed)
# 1) Галка "Разрешить отключение этого устройства для экономии энергии"
try {
Disable-NetAdapterPowerManagement -Name $nic.Name -NoRestart -ErrorAction Stop
Write-Host "[OK] PnP-энергосбережение адаптера отключено"
} catch {
Write-Host ("[WARN] Disable-NetAdapterPowerManagement: " + $_.Exception.Message)
}
# 2) Свойства драйвера
$touched = $false
foreach ($kw in $keywords) {
$cur = Get-NetAdapterAdvancedProperty -Name $nic.Name -RegistryKeyword $kw -ErrorAction SilentlyContinue
if (-not $cur) { continue }
$before = $cur.DisplayValue
if ($cur.RegistryValue -contains '0' -or $before -eq 'Disabled') {
Write-Host ("[..] " + $kw + " уже выключен")
continue
}
try {
Set-NetAdapterAdvancedProperty -Name $nic.Name -RegistryKeyword $kw -RegistryValue 0 -NoRestart -ErrorAction Stop
Write-Host ("[OK] " + $kw + ": '" + $before + "' -> Disabled")
$touched = $true
} catch {
Write-Host ("[WARN] " + $kw + " не удалось выставить: " + $_.Exception.Message)
}
}
# -NoRestart выше копит изменения, чтобы адаптер дёрнулся ОДИН раз, а не после каждого ключа
if ($touched) {
Write-Host "[..] перезапуск адаптера (линк моргнёт на пару секунд)"
try {
Restart-NetAdapter -Name $nic.Name -ErrorAction Stop
} catch {
Write-Host ("[WARN] Restart-NetAdapter: " + $_.Exception.Message)
}
}
}
Write-Host ("=" * 60)
Write-Host "Итог через 8 секунд:"
Start-Sleep -Seconds 8
Get-NetAdapter -Physical | Where-Object { $_.Virtual -ne $true } | ForEach-Object {
$vals = @()
foreach ($kw in $keywords) {
$p = Get-NetAdapterAdvancedProperty -Name $_.Name -RegistryKeyword $kw -ErrorAction SilentlyContinue
if ($p) { $vals += ($kw + "=" + $p.DisplayValue) }
}
$wol = Get-NetAdapterAdvancedProperty -Name $_.Name -RegistryKeyword 'WakeOnMagicPacket' -ErrorAction SilentlyContinue
Write-Host ($_.Name + " | " + $_.Status + " | " + $_.LinkSpeed + " | " + ($vals -join ", ") +
" | WoL=" + $(if ($wol) { $wol.DisplayValue } else { 'n/a' }))
}