Files
scripts/WU-Toggle.ps1
T
2026-08-21 07:50:40 +03:00

158 lines
6.1 KiB
PowerShell

<#
.SYNOPSIS
Управление автообновлением Windows 11 Pro 25H2 — полное отключение/включение.
.DESCRIPTION
Скрипт управляет автоматическим обновлением Windows через три уровня:
1. Служба wuauserv (Центр обновления Windows)
2. Групповая политика через реестр (WindowsUpdate\AU)
3. Задания планировщика (Task Scheduler) из ветки WindowsUpdate
Требует запуска от имени администратора.
.PARAMETER Disable
Полностью отключает автообновление Windows.
.PARAMETER Enable
Возвращает автообновление к рабочему состоянию (по умолчанию).
.PARAMETER Status
Показывает текущее состояние службы, политики и заданий планировщика.
.PARAMETER Help
Показывает эту справку.
.EXAMPLE
.\WU-Toggle.ps1 -Disable
Отключает автообновления Windows
.EXAMPLE
.\WU-Toggle.ps1 -Enable
Включает автообновления обратно
.EXAMPLE
.\WU-Toggle.ps1 -Status
Проверяет текущий статус автообновления
.NOTES
Windows 11 Pro 25H2.
После крупного Feature Update (напр. 25H2 -> 26H1) Microsoft иногда
сбрасывает состояние службы/заданий планировщика обратно.
В этом случае просто повторно запустите скрипт с -Disable.
Запуск скрипта, если он заблокирован политикой выполнения:
powershell -ExecutionPolicy Bypass -File .\WU-Toggle.ps1 -Disable
#>
#Requires -RunAsAdministrator
[CmdletBinding()]
param(
[switch]$Disable,
[switch]$Enable,
[switch]$Status,
[switch]$Help
)
$ErrorActionPreference = 'Stop'
$RegPolicyPath = "HKLM:\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate"
$RegAUPath = "$RegPolicyPath\AU"
$ServiceName = "wuauserv"
$TaskPath = "\Microsoft\Windows\WindowsUpdate\"
$ScheduledTasks = @(
"Scheduled Start",
"Refresh Group Policy Cache",
"Automatic App Update",
"Report policies",
"Reboot_AC",
"Reboot_Battery",
"sih",
"sihboot",
"sihpostreboot",
"sihpostreboot_ux",
"USO_UxBroker"
)
function Write-Section($text) {
Write-Host "`n=== $text ===" -ForegroundColor Cyan
}
function Disable-WindowsUpdate {
Write-Section "Отключение автообновления Windows"
Write-Host "-> Останавливаю и отключаю службу wuauserv..."
Stop-Service -Name $ServiceName -Force -ErrorAction SilentlyContinue
Set-Service -Name $ServiceName -StartupType Disabled
Write-Host "-> Применяю политики через реестр..."
if (-not (Test-Path $RegPolicyPath)) { New-Item -Path $RegPolicyPath -Force | Out-Null }
if (-not (Test-Path $RegAUPath)) { New-Item -Path $RegAUPath -Force | Out-Null }
New-ItemProperty -Path $RegAUPath -Name "NoAutoUpdate" -Value 1 -PropertyType DWord -Force | Out-Null
New-ItemProperty -Path $RegAUPath -Name "AUOptions" -Value 1 -PropertyType DWord -Force | Out-Null
New-ItemProperty -Path $RegPolicyPath -Name "DoNotConnectToWindowsUpdateInternetLocations" -Value 1 -PropertyType DWord -Force | Out-Null
Write-Host "-> Отключаю задания планировщика Windows Update..."
foreach ($task in $ScheduledTasks) {
try {
Disable-ScheduledTask -TaskName $task -TaskPath $TaskPath -ErrorAction SilentlyContinue | Out-Null
} catch {}
}
Write-Host "`nГотово. Автообновление отключено." -ForegroundColor Green
Write-Host "Проверить статус: .\WU-Toggle.ps1 -Status"
}
function Enable-WindowsUpdate {
Write-Section "Включение автообновления Windows"
Write-Host "-> Убираю политики из реестра..."
Remove-ItemProperty -Path $RegAUPath -Name "NoAutoUpdate" -ErrorAction SilentlyContinue
Remove-ItemProperty -Path $RegAUPath -Name "AUOptions" -ErrorAction SilentlyContinue
Remove-ItemProperty -Path $RegPolicyPath -Name "DoNotConnectToWindowsUpdateInternetLocations" -ErrorAction SilentlyContinue
Write-Host "-> Включаю задания планировщика..."
foreach ($task in $ScheduledTasks) {
try {
Enable-ScheduledTask -TaskName $task -TaskPath $TaskPath -ErrorAction SilentlyContinue | Out-Null
} catch {}
}
Write-Host "-> Включаю службу wuauserv..."
Set-Service -Name $ServiceName -StartupType Manual
Start-Service -Name $ServiceName -ErrorAction SilentlyContinue
Write-Host "`nГотово. Автообновление включено." -ForegroundColor Green
}
function Get-WUStatus {
Write-Section "Текущий статус автообновления"
$svc = Get-Service -Name $ServiceName
Write-Host "Служба wuauserv: $($svc.Status) / Автозапуск: $($svc.StartType)"
$noAuto = (Get-ItemProperty -Path $RegAUPath -Name "NoAutoUpdate" -ErrorAction SilentlyContinue).NoAutoUpdate
$state = if ($noAuto -eq 1) { "ВКЛ (обновления запрещены)" } else { "выкл (обновления разрешены)" }
Write-Host "Политика NoAutoUpdate: $state"
Write-Host "`nЗадания планировщика:"
foreach ($task in $ScheduledTasks) {
try {
$t = Get-ScheduledTask -TaskName $task -TaskPath $TaskPath -ErrorAction Stop
Write-Host " $task : $($t.State)"
} catch {}
}
}
# --- Точка входа ---
if ($Help -or (-not $Disable -and -not $Enable -and -not $Status)) {
Get-Help $PSCommandPath -Full
return
}
if ($Disable) { Disable-WindowsUpdate }
if ($Enable) { Enable-WindowsUpdate }
if ($Status) { Get-WUStatus }