165 lines
6.5 KiB
PowerShell
165 lines
6.5 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'
|
||
|
||
# Принудительно переключаем консоль на UTF-8 — иначе кириллица
|
||
# отображается кракозябрами из-за несовпадения кодовых страниц
|
||
# (файл в UTF-8, а Windows PowerShell по умолчанию использует cp1251/866).
|
||
[Console]::OutputEncoding = [System.Text.Encoding]::UTF8
|
||
$OutputEncoding = [System.Text.Encoding]::UTF8
|
||
chcp 65001 > $null
|
||
|
||
$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 }
|