Windows Components › Windows Update › Manage end user experience
Configure maintenance windows for automatic updates
Supported on At least Windows 11 Version 24H2
What it does
Enable this policy to specify repeatable maintenance windows for the device to perform specified update actions. When this policy is enabled, Windows Update will only perform the specified update action during the configured maintenance window. Specified update actions outside maintenance window will be deferred until the next maintenance window begins. • Update Actions: Select which update actions are only allowed during maintenance window. If an update action is not selected, that action can happen outside of maintenance window. - Download, install, and restart: Complete update cycle including download, installation, and system restart - Install and restart: Install already downloaded updates and restart the device - Restart only: Only perform a system restart for pending updates • Basic Schedule Configuration: - Start Date: Specify the initial date when the first maintenance window begins (format: yyyy-mm-dd, example: 2025-10-30) * Start Date field only takes effect if Recurring schedule is set to “None” - Start Time: Set the time when the maintenance window starts (format: hh:mm, example: 23:30 for 11:30 PM) - Duration: Define how long each maintenance window lasts in hours (example: 2 for a 2-hour window) • Recurring Schedule Options: - No repeat: One-time maintenance window on the specified start date only - Daily: Maintenance window will be repeated every day - Weekly: Maintenance window will be repeated weekly on selected days of the week - Monthly: Maintenance window will be repeated monthly on a specific day • Weekly Schedule Settings (when Weekly is selected): - Day of the week Selection: Choose which days of the week the maintenance window occurs: * Sunday through Saturday: Check boxes to select specific day(s) of the week for the maintenance window • Monthly Schedule Settings (when Monthly is selected): - Monthly Schedule Type: * Date-based: Maintenance window occurs on a specific day of the month (example: 15th day of each month) * Week-based: Maintenance window occurs on a specific weekday occurrence within the month (example: 2nd Tuesday of each month) * Last day of the month: Maintenance window occurs on the last day of the month - Day of Month: When using date-based scheduling, specify which day of the month (1-28) - Occurrence in Month: When using week-based scheduling, select which week of the month (First, Second, Third, Fourth, or Last) - Day of the Week: When using week-based scheduling, select which day of the week (Sunday through Saturday) Examples of Monthly Configurations: - Date-based: "3rd day of every month" = Day of Month: 3 - Week-based: "Second Tuesday of every month" = Occurrence: Second, Day of Week: Tuesday - Week-based: "Last Friday of every month" = Occurrence: Last, Day of Week: Friday - Last day of the month: "Last day of every month" After a non-repeating maintenance window occurs, the next maintenance window must be scheduled in 3 months. If the start date of a non-repeating maintenance window is more than 3 months in the past, this policy will be disregarded, and updates will be scheduled according to default settings. If you disable or do not configure this policy, Windows Update will follow its default scheduling behavior.
What it writes
- Hive
- HKEY_LOCAL_MACHINE
- Registry key
Software\Policies\Microsoft\Windows\WindowsUpdate- Value name
MaintenanceWindowEnabled- When enabled
- DWORD 1
- When disabled
- DWORD 0
In Intune
No native CSP; import the ADMX (Intune-ready).
From Microsoft's Policy CSP DDF files (DDF v2 Files, February 2026), read 9 Nov 2026.
Options
| Option | Type | Registry value | Allowed values |
|---|---|---|---|
| Update actions only allowed inside the maintenance windowRequiredDefault: Install and restart (2) | Drop-down list (enum) | MaintenanceWindowUpdateActions |
|
| Start date (Format: yyyy-mm-dd example: 2025-10-30) | Text (text) | MaintenanceWindowStartDate |
Up to 255 characters |
| Start time (Format: hh:mm example: 23:30 for 11:30 PM) | Text (text) | MaintenanceWindowStartTime |
Up to 255 characters |
| Duration (hours)RequiredDefault: 2 | Number (decimal) | MaintenanceWindowDurationHours |
2 to 24 |
| Select repeat scheduleRequiredDefault: Daily (2) | Drop-down list (enum) | MaintenanceWindowRepeatScheduleOption |
|
| SundayDefault: Unchecked | Checkbox (boolean) | MaintenanceWindowWeeklySunday |
On (1) or off (0) |
| MondayDefault: Unchecked | Checkbox (boolean) | MaintenanceWindowWeeklyMonday |
On (1) or off (0) |
| TuesdayDefault: Unchecked | Checkbox (boolean) | MaintenanceWindowWeeklyTuesday |
On (1) or off (0) |
| WednesdayDefault: Unchecked | Checkbox (boolean) | MaintenanceWindowWeeklyWednesday |
On (1) or off (0) |
| ThursdayDefault: Unchecked | Checkbox (boolean) | MaintenanceWindowWeeklyThursday |
On (1) or off (0) |
| FridayDefault: Unchecked | Checkbox (boolean) | MaintenanceWindowWeeklyFriday |
On (1) or off (0) |
| SaturdayDefault: Unchecked | Checkbox (boolean) | MaintenanceWindowWeeklySaturday |
On (1) or off (0) |
| Monthly Schedule TypeRequiredDefault: Week-based (2) | Drop-down list (enum) | MaintenanceWindowMonthlySchedule |
|
| Day of the MonthRequiredDefault: 1 | Number (decimal) | MaintenanceWindowMonthlyMonthBasedDayOfMonth |
1 to 28 |
| Occurrence in MonthRequiredDefault: Second (2) | Drop-down list (enum) | MaintenanceWindowMonthlyWeekBasedOccurrenceInMonth |
|
| Day of the WeekRequiredDefault: Monday (2) | Drop-down list (enum) | MaintenanceWindowMonthlyWeekBasedDayOfTheWeek |
|
Configure and deploy
Choose a state and the option values; the output below is generated from the template for exactly that.
Enabled · Computer · template defaults
Registry file (.reg)
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows\WindowsUpdate]
"MaintenanceWindowWeeklyFriday"=-
"MaintenanceWindowWeeklyMonday"=-
"MaintenanceWindowWeeklySaturday"=-
"MaintenanceWindowWeeklySunday"=-
"MaintenanceWindowWeeklyThursday"=-
"MaintenanceWindowWeeklyTuesday"=-
"MaintenanceWindowWeeklyWednesday"=-
"MaintenanceWindowDurationHours"=dword:00000002
"MaintenanceWindowEnabled"=dword:00000001
"MaintenanceWindowMonthlyMonthBasedDayOfMonth"=dword:00000001
"MaintenanceWindowMonthlySchedule"=dword:00000002
"MaintenanceWindowMonthlyWeekBasedDayOfTheWeek"=dword:00000002
"MaintenanceWindowMonthlyWeekBasedOccurrenceInMonth"=dword:00000002
"MaintenanceWindowRepeatScheduleOption"=dword:00000002
"MaintenanceWindowStartDate"=""
"MaintenanceWindowStartTime"=""
"MaintenanceWindowUpdateActions"=dword:00000002
PowerShell
$ErrorActionPreference = 'Stop'
function Set-RegistryValue {
param(
[Parameter(Mandatory = $true)][string] $Path,
[Parameter(Mandatory = $true)][string] $Name,
[Parameter(Mandatory = $true)][string] $PropertyType,
[Parameter(Mandatory = $true)][object] $Value
)
if (-not (Test-Path -LiteralPath $Path)) {
New-Item -Path $Path -Force | Out-Null
}
New-ItemProperty -LiteralPath $Path -Name $Name -PropertyType $PropertyType -Value $Value -Force | Out-Null
}
function Remove-RegistryValue {
param(
[Parameter(Mandatory = $true)][string] $Path,
[Parameter(Mandatory = $true)][string] $Name
)
if (Test-Path -LiteralPath $Path) {
Remove-ItemProperty -LiteralPath $Path -Name $Name -Force -ErrorAction SilentlyContinue
}
}
function Clear-RegistryKeyValues {
param(
[Parameter(Mandatory = $true)][string] $Path
)
if (-not (Test-Path -LiteralPath $Path)) {
return
}
foreach ($propertyName in (Get-Item -LiteralPath $Path).Property) {
Remove-ItemProperty -LiteralPath $Path -Name $propertyName -Force -ErrorAction SilentlyContinue
}
}
# Policy: Configure maintenance windows for automatic updates
# Name: MaintenanceWindow
# Scope: Machine
# State: Enabled
# Source: WindowsUpdate.admx
Set-RegistryValue -Path 'Registry::HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows\WindowsUpdate' -Name 'MaintenanceWindowEnabled' -PropertyType 'DWord' -Value 1
Set-RegistryValue -Path 'Registry::HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows\WindowsUpdate' -Name 'MaintenanceWindowUpdateActions' -PropertyType 'DWord' -Value 2
Set-RegistryValue -Path 'Registry::HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows\WindowsUpdate' -Name 'MaintenanceWindowStartDate' -PropertyType 'String' -Value ''
Set-RegistryValue -Path 'Registry::HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows\WindowsUpdate' -Name 'MaintenanceWindowStartTime' -PropertyType 'String' -Value ''
Set-RegistryValue -Path 'Registry::HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows\WindowsUpdate' -Name 'MaintenanceWindowDurationHours' -PropertyType 'DWord' -Value 2
Set-RegistryValue -Path 'Registry::HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows\WindowsUpdate' -Name 'MaintenanceWindowRepeatScheduleOption' -PropertyType 'DWord' -Value 2
Remove-RegistryValue -Path 'Registry::HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows\WindowsUpdate' -Name 'MaintenanceWindowWeeklySunday'
Remove-RegistryValue -Path 'Registry::HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows\WindowsUpdate' -Name 'MaintenanceWindowWeeklyMonday'
Remove-RegistryValue -Path 'Registry::HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows\WindowsUpdate' -Name 'MaintenanceWindowWeeklyTuesday'
Remove-RegistryValue -Path 'Registry::HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows\WindowsUpdate' -Name 'MaintenanceWindowWeeklyWednesday'
Remove-RegistryValue -Path 'Registry::HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows\WindowsUpdate' -Name 'MaintenanceWindowWeeklyThursday'
Remove-RegistryValue -Path 'Registry::HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows\WindowsUpdate' -Name 'MaintenanceWindowWeeklyFriday'
Remove-RegistryValue -Path 'Registry::HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows\WindowsUpdate' -Name 'MaintenanceWindowWeeklySaturday'
Set-RegistryValue -Path 'Registry::HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows\WindowsUpdate' -Name 'MaintenanceWindowMonthlySchedule' -PropertyType 'DWord' -Value 2
Set-RegistryValue -Path 'Registry::HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows\WindowsUpdate' -Name 'MaintenanceWindowMonthlyMonthBasedDayOfMonth' -PropertyType 'DWord' -Value 1
Set-RegistryValue -Path 'Registry::HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows\WindowsUpdate' -Name 'MaintenanceWindowMonthlyWeekBasedOccurrenceInMonth' -PropertyType 'DWord' -Value 2
Set-RegistryValue -Path 'Registry::HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows\WindowsUpdate' -Name 'MaintenanceWindowMonthlyWeekBasedDayOfTheWeek' -PropertyType 'DWord' -Value 2
- The OMA-URI is an inferred ADMX-backed Policy CSP candidate derived from the source ADMX file name and policy name.
- Some Microsoft policies use built-in Policy CSP pages whose area names don't match the ADMX file name, so verify the candidate against Microsoft Learn before deployment.
- The generated payload is incomplete because one or more ADMX element values were not supplied: MaintenanceWindowStartDateID, MaintenanceWindowStartTimeID
ADMX profile candidate (OMA-URI)
./Device/Vendor/MSFT/Policy/Config/ADMX_WindowsUpdate/MaintenanceWindowIntune remediation scripts
Detection
$ErrorActionPreference = 'Stop'
$reasons = [System.Collections.Generic.List[string]]::new()
function Test-RegistryValueExists {
param(
[Parameter(Mandatory = $true)][string] $Path,
[Parameter(Mandatory = $true)][string] $Name
)
if (-not (Test-Path -LiteralPath $Path)) {
return $false
}
return $null -ne (Get-ItemProperty -LiteralPath $Path -Name $Name -ErrorAction SilentlyContinue)
}
function Test-RegistryValueEquals {
param(
[Parameter(Mandatory = $true)][string] $Path,
[Parameter(Mandatory = $true)][string] $Name,
[Parameter(Mandatory = $true)][string] $Kind,
[Parameter(Mandatory = $true)][object] $Expected
)
if (-not (Test-Path -LiteralPath $Path)) {
return $false
}
$valueObject = Get-ItemProperty -LiteralPath $Path -Name $Name -ErrorAction SilentlyContinue
if ($null -eq $valueObject) {
return $false
}
$actual = $valueObject.$Name
switch ($Kind) {
'String' { return [string]$actual -ceq [string]$Expected }
'ExpandString' { return [string]$actual -ceq [string]$Expected }
'DWord' { return [uint32]$actual -eq [uint32]$Expected }
'QWord' {
$actualBits = if ($actual -is [uint64]) { $actual } else { [BitConverter]::ToUInt64([BitConverter]::GetBytes([int64]$actual), 0) }
$expectedBits = if ($Expected -is [uint64]) { $Expected } else { [BitConverter]::ToUInt64([BitConverter]::GetBytes([int64]$Expected), 0) }
return $actualBits -eq $expectedBits
}
'MultiString' {
$actualArray = @($actual)
$expectedArray = @($Expected)
if ($actualArray.Count -ne $expectedArray.Count) { return $false }
for ($index = 0; $index -lt $actualArray.Count; $index++) {
if ([string]$actualArray[$index] -cne [string]$expectedArray[$index]) { return $false }
}
return $true
}
'Binary' {
$actualArray = [byte[]]$actual
$expectedArray = [byte[]]$Expected
if ($actualArray.Length -ne $expectedArray.Length) { return $false }
for ($index = 0; $index -lt $actualArray.Length; $index++) {
if ($actualArray[$index] -ne $expectedArray[$index]) { return $false }
}
return $true
}
default { return [string]$actual -ceq [string]$Expected }
}
}
# Policy: Configure maintenance windows for automatic updates
# Name: MaintenanceWindow
# Scope: Machine
# State: Enabled
# Source: WindowsUpdate.admx
$isMatch = Test-RegistryValueEquals -Path 'Registry::HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows\WindowsUpdate' -Name 'MaintenanceWindowEnabled' -Kind 'DWord' -Expected 1
if (-not $isMatch) {
$reasons.Add('Value mismatch: HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows\WindowsUpdate\MaintenanceWindowEnabled') | Out-Null
}
$isMatch = Test-RegistryValueEquals -Path 'Registry::HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows\WindowsUpdate' -Name 'MaintenanceWindowUpdateActions' -Kind 'DWord' -Expected 2
if (-not $isMatch) {
$reasons.Add('Value mismatch: HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows\WindowsUpdate\MaintenanceWindowUpdateActions') | Out-Null
}
$isMatch = Test-RegistryValueEquals -Path 'Registry::HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows\WindowsUpdate' -Name 'MaintenanceWindowStartDate' -Kind 'String' -Expected ''
if (-not $isMatch) {
$reasons.Add('Value mismatch: HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows\WindowsUpdate\MaintenanceWindowStartDate') | Out-Null
}
$isMatch = Test-RegistryValueEquals -Path 'Registry::HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows\WindowsUpdate' -Name 'MaintenanceWindowStartTime' -Kind 'String' -Expected ''
if (-not $isMatch) {
$reasons.Add('Value mismatch: HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows\WindowsUpdate\MaintenanceWindowStartTime') | Out-Null
}
$isMatch = Test-RegistryValueEquals -Path 'Registry::HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows\WindowsUpdate' -Name 'MaintenanceWindowDurationHours' -Kind 'DWord' -Expected 2
if (-not $isMatch) {
$reasons.Add('Value mismatch: HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows\WindowsUpdate\MaintenanceWindowDurationHours') | Out-Null
}
$isMatch = Test-RegistryValueEquals -Path 'Registry::HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows\WindowsUpdate' -Name 'MaintenanceWindowRepeatScheduleOption' -Kind 'DWord' -Expected 2
if (-not $isMatch) {
$reasons.Add('Value mismatch: HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows\WindowsUpdate\MaintenanceWindowRepeatScheduleOption') | Out-Null
}
$exists = Test-RegistryValueExists -Path 'Registry::HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows\WindowsUpdate' -Name 'MaintenanceWindowWeeklySunday'
if ($exists) {
$reasons.Add('Value should be absent: HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows\WindowsUpdate\MaintenanceWindowWeeklySunday') | Out-Null
}
$exists = Test-RegistryValueExists -Path 'Registry::HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows\WindowsUpdate' -Name 'MaintenanceWindowWeeklyMonday'
if ($exists) {
$reasons.Add('Value should be absent: HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows\WindowsUpdate\MaintenanceWindowWeeklyMonday') | Out-Null
}
$exists = Test-RegistryValueExists -Path 'Registry::HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows\WindowsUpdate' -Name 'MaintenanceWindowWeeklyTuesday'
if ($exists) {
$reasons.Add('Value should be absent: HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows\WindowsUpdate\MaintenanceWindowWeeklyTuesday') | Out-Null
}
$exists = Test-RegistryValueExists -Path 'Registry::HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows\WindowsUpdate' -Name 'MaintenanceWindowWeeklyWednesday'
if ($exists) {
$reasons.Add('Value should be absent: HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows\WindowsUpdate\MaintenanceWindowWeeklyWednesday') | Out-Null
}
$exists = Test-RegistryValueExists -Path 'Registry::HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows\WindowsUpdate' -Name 'MaintenanceWindowWeeklyThursday'
if ($exists) {
$reasons.Add('Value should be absent: HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows\WindowsUpdate\MaintenanceWindowWeeklyThursday') | Out-Null
}
$exists = Test-RegistryValueExists -Path 'Registry::HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows\WindowsUpdate' -Name 'MaintenanceWindowWeeklyFriday'
if ($exists) {
$reasons.Add('Value should be absent: HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows\WindowsUpdate\MaintenanceWindowWeeklyFriday') | Out-Null
}
$exists = Test-RegistryValueExists -Path 'Registry::HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows\WindowsUpdate' -Name 'MaintenanceWindowWeeklySaturday'
if ($exists) {
$reasons.Add('Value should be absent: HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows\WindowsUpdate\MaintenanceWindowWeeklySaturday') | Out-Null
}
$isMatch = Test-RegistryValueEquals -Path 'Registry::HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows\WindowsUpdate' -Name 'MaintenanceWindowMonthlySchedule' -Kind 'DWord' -Expected 2
if (-not $isMatch) {
$reasons.Add('Value mismatch: HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows\WindowsUpdate\MaintenanceWindowMonthlySchedule') | Out-Null
}
$isMatch = Test-RegistryValueEquals -Path 'Registry::HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows\WindowsUpdate' -Name 'MaintenanceWindowMonthlyMonthBasedDayOfMonth' -Kind 'DWord' -Expected 1
if (-not $isMatch) {
$reasons.Add('Value mismatch: HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows\WindowsUpdate\MaintenanceWindowMonthlyMonthBasedDayOfMonth') | Out-Null
}
$isMatch = Test-RegistryValueEquals -Path 'Registry::HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows\WindowsUpdate' -Name 'MaintenanceWindowMonthlyWeekBasedOccurrenceInMonth' -Kind 'DWord' -Expected 2
if (-not $isMatch) {
$reasons.Add('Value mismatch: HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows\WindowsUpdate\MaintenanceWindowMonthlyWeekBasedOccurrenceInMonth') | Out-Null
}
$isMatch = Test-RegistryValueEquals -Path 'Registry::HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows\WindowsUpdate' -Name 'MaintenanceWindowMonthlyWeekBasedDayOfTheWeek' -Kind 'DWord' -Expected 2
if (-not $isMatch) {
$reasons.Add('Value mismatch: HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows\WindowsUpdate\MaintenanceWindowMonthlyWeekBasedDayOfTheWeek') | Out-Null
}
if ($reasons.Count -eq 0) {
Write-Output 'Compliant'
exit 0
}
$reasons | ForEach-Object { Write-Output $_ }
exit 1
Remediation
$ErrorActionPreference = 'Stop'
function Set-RegistryValue {
param(
[Parameter(Mandatory = $true)][string] $Path,
[Parameter(Mandatory = $true)][string] $Name,
[Parameter(Mandatory = $true)][string] $PropertyType,
[Parameter(Mandatory = $true)][object] $Value
)
if (-not (Test-Path -LiteralPath $Path)) {
New-Item -Path $Path -Force | Out-Null
}
New-ItemProperty -LiteralPath $Path -Name $Name -PropertyType $PropertyType -Value $Value -Force | Out-Null
}
function Remove-RegistryValue {
param(
[Parameter(Mandatory = $true)][string] $Path,
[Parameter(Mandatory = $true)][string] $Name
)
if (Test-Path -LiteralPath $Path) {
Remove-ItemProperty -LiteralPath $Path -Name $Name -Force -ErrorAction SilentlyContinue
}
}
function Clear-RegistryKeyValues {
param(
[Parameter(Mandatory = $true)][string] $Path
)
if (-not (Test-Path -LiteralPath $Path)) {
return
}
foreach ($propertyName in (Get-Item -LiteralPath $Path).Property) {
Remove-ItemProperty -LiteralPath $Path -Name $propertyName -Force -ErrorAction SilentlyContinue
}
}
# Policy: Configure maintenance windows for automatic updates
# Name: MaintenanceWindow
# Scope: Machine
# State: Enabled
# Source: WindowsUpdate.admx
Set-RegistryValue -Path 'Registry::HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows\WindowsUpdate' -Name 'MaintenanceWindowEnabled' -PropertyType 'DWord' -Value 1
Set-RegistryValue -Path 'Registry::HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows\WindowsUpdate' -Name 'MaintenanceWindowUpdateActions' -PropertyType 'DWord' -Value 2
Set-RegistryValue -Path 'Registry::HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows\WindowsUpdate' -Name 'MaintenanceWindowStartDate' -PropertyType 'String' -Value ''
Set-RegistryValue -Path 'Registry::HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows\WindowsUpdate' -Name 'MaintenanceWindowStartTime' -PropertyType 'String' -Value ''
Set-RegistryValue -Path 'Registry::HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows\WindowsUpdate' -Name 'MaintenanceWindowDurationHours' -PropertyType 'DWord' -Value 2
Set-RegistryValue -Path 'Registry::HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows\WindowsUpdate' -Name 'MaintenanceWindowRepeatScheduleOption' -PropertyType 'DWord' -Value 2
Remove-RegistryValue -Path 'Registry::HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows\WindowsUpdate' -Name 'MaintenanceWindowWeeklySunday'
Remove-RegistryValue -Path 'Registry::HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows\WindowsUpdate' -Name 'MaintenanceWindowWeeklyMonday'
Remove-RegistryValue -Path 'Registry::HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows\WindowsUpdate' -Name 'MaintenanceWindowWeeklyTuesday'
Remove-RegistryValue -Path 'Registry::HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows\WindowsUpdate' -Name 'MaintenanceWindowWeeklyWednesday'
Remove-RegistryValue -Path 'Registry::HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows\WindowsUpdate' -Name 'MaintenanceWindowWeeklyThursday'
Remove-RegistryValue -Path 'Registry::HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows\WindowsUpdate' -Name 'MaintenanceWindowWeeklyFriday'
Remove-RegistryValue -Path 'Registry::HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows\WindowsUpdate' -Name 'MaintenanceWindowWeeklySaturday'
Set-RegistryValue -Path 'Registry::HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows\WindowsUpdate' -Name 'MaintenanceWindowMonthlySchedule' -PropertyType 'DWord' -Value 2
Set-RegistryValue -Path 'Registry::HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows\WindowsUpdate' -Name 'MaintenanceWindowMonthlyMonthBasedDayOfMonth' -PropertyType 'DWord' -Value 1
Set-RegistryValue -Path 'Registry::HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows\WindowsUpdate' -Name 'MaintenanceWindowMonthlyWeekBasedOccurrenceInMonth' -PropertyType 'DWord' -Value 2
Set-RegistryValue -Path 'Registry::HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows\WindowsUpdate' -Name 'MaintenanceWindowMonthlyWeekBasedDayOfTheWeek' -PropertyType 'DWord' -Value 2
History 6 retained releases
- 26H2 · 1.029 Sep 2026Registry key:
Software\Policies\Microsoft\Windows\WindowsUpdate· Value name:MaintenanceWindowEnabled- Added in this release.
Template
- Internal name
MaintenanceWindow- Namespace
Microsoft.Policies.WindowsUpdate- Template file
WindowsUpdate.admx- Release
- Windows 11 26H2 · 1.0 · file set
d777fedd6ae12a6d…
Definition, editor controls and support
Definition
<policy class="Machine" displayName="$(string.MaintenanceWindow_Title)" explainText="$(string.MaintenanceWindow_Help)" key="Software\Policies\Microsoft\Windows\WindowsUpdate" name="MaintenanceWindow" presentation="$(presentation.MaintenanceWindow_Title)" valueName="MaintenanceWindowEnabled" xmlns="http://schemas.microsoft.com/GroupPolicy/2006/07/PolicyDefinitions">
<parentCategory ref="Microsoft.Policies.WindowsUpdate:WindowsUpdateExperience" />
<supportedOn ref="Microsoft.Policies.WindowsUpdate:WU_SUPPORTED_Win11_24H2" />
<enabledValue>
<decimal value="1" />
</enabledValue>
<disabledValue>
<decimal value="0" />
</disabledValue>
<elements>
<enum id="MaintenanceWindowUpdateActionsID" required="true" valueName="MaintenanceWindowUpdateActions">
<item displayName="$(string.MaintenanceWindowUpdateActions_DownloadInstallRestart)">
<value>
<decimal value="1" />
</value>
</item>
<item displayName="$(string.MaintenanceWindowUpdateActions_InstallRestart)">
<value>
<decimal value="2" />
</value>
</item>
<item displayName="$(string.MaintenanceWindowUpdateActions_RestartOnly)">
<value>
<decimal value="3" />
</value>
</item>
</enum>
<text id="MaintenanceWindowStartDateID" valueName="MaintenanceWindowStartDate" />
<text id="MaintenanceWindowStartTimeID" valueName="MaintenanceWindowStartTime" />
<decimal id="MaintenanceWindowDurationHoursID" maxValue="24" minValue="2" required="true" valueName="MaintenanceWindowDurationHours" />
<enum id="MaintenanceWindowRepeatScheduleOptionID" required="true" valueName="MaintenanceWindowRepeatScheduleOption">
<item displayName="$(string.MaintenanceWindowRepeatSchedule_NoRepeat)">
<value>
<decimal value="1" />
</value>
</item>
<item displayName="$(string.MaintenanceWindowRepeatSchedule_Daily)">
<value>
<decimal value="2" />
</value>
</item>
<item displayName="$(string.MaintenanceWindowRepeatSchedule_Weekly)">
<value>
<decimal value="3" />
</value>
</item>
<item displayName="$(string.MaintenanceWindowRepeatSchedule_Monthly)">
<value>
<decimal value="4" />
</value>
</item>
</enum>
<boolean id="MaintenanceWindowWeeklySundayID" valueName="MaintenanceWindowWeeklySunday" />
<boolean id="MaintenanceWindowWeeklyMondayID" valueName="MaintenanceWindowWeeklyMonday" />
<boolean id="MaintenanceWindowWeeklyTuesdayID" valueName="MaintenanceWindowWeeklyTuesday" />
<boolean id="MaintenanceWindowWeeklyWednesdayID" valueName="MaintenanceWindowWeeklyWednesday" />
<boolean id="MaintenanceWindowWeeklyThursdayID" valueName="MaintenanceWindowWeeklyThursday" />
<boolean id="MaintenanceWindowWeeklyFridayID" valueName="MaintenanceWindowWeeklyFriday" />
<boolean id="MaintenanceWindowWeeklySaturdayID" valueName="MaintenanceWindowWeeklySaturday" />
<enum id="MaintenanceWindowMonthlyScheduleID" required="true" valueName="MaintenanceWindowMonthlySchedule">
<item displayName="$(string.MaintenanceWindowMonthlySchedule_MonthBased)">
<value>
<decimal value="1" />
</value>
</item>
<item displayName="$(string.MaintenanceWindowMonthlySchedule_WeekBased)">
<value>
<decimal value="2" />
</value>
</item>
<item displayName="$(string.MaintenanceWindowMonthlySchedule_LastDay)">
<value>
<decimal value="3" />
</value>
</item>
</enum>
<decimal id="MaintenanceWindowMonthlyMonthBasedDayOfMonthID" maxValue="28" minValue="1" required="true" valueName="MaintenanceWindowMonthlyMonthBasedDayOfMonth" />
<enum id="MaintenanceWindowMonthlyWeekBasedOccurrenceInMonthID" required="true" valueName="MaintenanceWindowMonthlyWeekBasedOccurrenceInMonth">
<item displayName="$(string.MaintenanceWindowMonthlyWeekBasedOccurrenceInMonth_First)">
<value>
<decimal value="1" />
</value>
</item>
<item displayName="$(string.MaintenanceWindowMonthlyWeekBasedOccurrenceInMonth_Second)">
<value>
<decimal value="2" />
</value>
</item>
<item displayName="$(string.MaintenanceWindowMonthlyWeekBasedOccurrenceInMonth_Third)">
<value>
<decimal value="3" />
</value>
</item>
<item displayName="$(string.MaintenanceWindowMonthlyWeekBasedOccurrenceInMonth_Fourth)">
<value>
<decimal value="4" />
</value>
</item>
<item displayName="$(string.MaintenanceWindowMonthlyWeekBasedOccurrenceInMonth_Last)">
<value>
<decimal value="5" />
</value>
</item>
</enum>
<enum id="MaintenanceWindowMonthlyWeekBasedDayOfTheWeekID" required="true" valueName="MaintenanceWindowMonthlyWeekBasedDayOfTheWeek">
<item displayName="$(string.MaintenanceWindowMonthlyWeekBasedDayOfTheWeek_Sunday)">
<value>
<decimal value="1" />
</value>
</item>
<item displayName="$(string.MaintenanceWindowMonthlyWeekBasedDayOfTheWeek_Monday)">
<value>
<decimal value="2" />
</value>
</item>
<item displayName="$(string.MaintenanceWindowMonthlyWeekBasedDayOfTheWeek_Tuesday)">
<value>
<decimal value="3" />
</value>
</item>
<item displayName="$(string.MaintenanceWindowMonthlyWeekBasedDayOfTheWeek_Wednesday)">
<value>
<decimal value="4" />
</value>
</item>
<item displayName="$(string.MaintenanceWindowMonthlyWeekBasedDayOfTheWeek_Thursday)">
<value>
<decimal value="5" />
</value>
</item>
<item displayName="$(string.MaintenanceWindowMonthlyWeekBasedDayOfTheWeek_Friday)">
<value>
<decimal value="6" />
</value>
</item>
<item displayName="$(string.MaintenanceWindowMonthlyWeekBasedDayOfTheWeek_Saturday)">
<value>
<decimal value="7" />
</value>
</item>
</enum>
</elements>
</policy>Editor controls
<presentation id="MaintenanceWindow_Title" xmlns="http://schemas.microsoft.com/GroupPolicy/2006/07/PolicyDefinitions">
<text>Maintenance Window:</text>
<dropdownList defaultItem="1" noSort="true" refId="MaintenanceWindowUpdateActionsID">Update actions only allowed inside the maintenance window:</dropdownList>
<textBox refId="MaintenanceWindowStartDateID">
<label>Start date (Format: yyyy-mm-dd example: 2025-10-30)</label>
</textBox>
<textBox refId="MaintenanceWindowStartTimeID">
<label>Start time (Format: hh:mm example: 23:30 for 11:30 PM)</label>
</textBox>
<decimalTextBox defaultValue="2" refId="MaintenanceWindowDurationHoursID">Duration (hours):</decimalTextBox>
<dropdownList defaultItem="1" noSort="true" refId="MaintenanceWindowRepeatScheduleOptionID">Select repeat schedule:</dropdownList>
<text>The following settings are only required and applicable if Weekly is selected:</text>
<checkBox defaultChecked="false" refId="MaintenanceWindowWeeklySundayID">Sunday</checkBox>
<checkBox defaultChecked="false" refId="MaintenanceWindowWeeklyMondayID">Monday</checkBox>
<checkBox defaultChecked="false" refId="MaintenanceWindowWeeklyTuesdayID">Tuesday</checkBox>
<checkBox defaultChecked="false" refId="MaintenanceWindowWeeklyWednesdayID">Wednesday</checkBox>
<checkBox defaultChecked="false" refId="MaintenanceWindowWeeklyThursdayID">Thursday</checkBox>
<checkBox defaultChecked="false" refId="MaintenanceWindowWeeklyFridayID">Friday</checkBox>
<checkBox defaultChecked="false" refId="MaintenanceWindowWeeklySaturdayID">Saturday</checkBox>
<text>The following settings are only required and applicable if Monthly is selected:</text>
<dropdownList defaultItem="1" noSort="true" refId="MaintenanceWindowMonthlyScheduleID">Monthly Schedule Type:</dropdownList>
<text>The following settings are only required and applicable if Date-based type is selected:</text>
<decimalTextBox defaultValue="1" refId="MaintenanceWindowMonthlyMonthBasedDayOfMonthID">Day of the Month:</decimalTextBox>
<text>The following settings are only required and applicable if Week-based type is selected:</text>
<dropdownList defaultItem="1" noSort="true" refId="MaintenanceWindowMonthlyWeekBasedOccurrenceInMonthID">Occurrence in Month</dropdownList>
<dropdownList defaultItem="1" noSort="true" refId="MaintenanceWindowMonthlyWeekBasedDayOfTheWeekID">Day of the Week</dropdownList>
</presentation>Supported platforms and category
Microsoft.Policies.Windows:category:WindowsComponents
<category displayName="$(string.WindowsComponents)" explainText="$(string.WindowsComponents_Help)" name="WindowsComponents" xmlns="http://schemas.microsoft.com/GroupPolicy/2006/07/PolicyDefinitions" />
Microsoft.Policies.WindowsUpdate:category:WindowsUpdateCat
<category displayName="$(string.WindowsUpdateCat)" name="WindowsUpdateCat" xmlns="http://schemas.microsoft.com/GroupPolicy/2006/07/PolicyDefinitions">
<parentCategory ref="Microsoft.Policies.Windows:WindowsComponents" />
</category>
Microsoft.Policies.WindowsUpdate:category:WindowsUpdateExperience
<category displayName="$(string.WindowsUpdateExperience)" name="WindowsUpdateExperience" xmlns="http://schemas.microsoft.com/GroupPolicy/2006/07/PolicyDefinitions">
<parentCategory ref="Microsoft.Policies.WindowsUpdate:WindowsUpdateCat" />
</category>
Microsoft.Policies.WindowsUpdate:definition:WU_SUPPORTED_Win11_24H2
<definition displayName="$(string.WU_SUPPORTED_Win11_24H2)" name="WU_SUPPORTED_Win11_24H2" xmlns="http://schemas.microsoft.com/GroupPolicy/2006/07/PolicyDefinitions">
<or>
<range minVersionIndex="13" ref="unresolved(products):MicrosoftWindows" />
</or>
</definition>
Microsoft.Policies.WindowsUpdate:unresolved:unresolved(products):MicrosoftWindows
<unresolved reference="unresolved(products):MicrosoftWindows" />
Microsoft.Policies.Windows:category:WindowsComponents
<category displayName="$(string.WindowsComponents)" explainText="$(string.WindowsComponents_Help)" name="WindowsComponents" xmlns="http://schemas.microsoft.com/GroupPolicy/2006/07/PolicyDefinitions" />
<strings><string id="Microsoft.Policies.Windows:WindowsComponents">Windows Components</string><string id="Microsoft.Policies.Windows:WindowsComponents_Help">Contains settings for operating system components.</string></strings>
Microsoft.Policies.WindowsUpdate:category:WindowsUpdateCat
<category displayName="$(string.WindowsUpdateCat)" name="WindowsUpdateCat" xmlns="http://schemas.microsoft.com/GroupPolicy/2006/07/PolicyDefinitions">
<parentCategory ref="Microsoft.Policies.Windows:WindowsComponents" />
</category>
<strings><string id="Microsoft.Policies.WindowsUpdate:WindowsUpdateCat">Windows Update</string></strings>
Microsoft.Policies.WindowsUpdate:category:WindowsUpdateExperience
<category displayName="$(string.WindowsUpdateExperience)" name="WindowsUpdateExperience" xmlns="http://schemas.microsoft.com/GroupPolicy/2006/07/PolicyDefinitions">
<parentCategory ref="Microsoft.Policies.WindowsUpdate:WindowsUpdateCat" />
</category>
<strings><string id="Microsoft.Policies.WindowsUpdate:WindowsUpdateExperience">Manage end user experience</string></strings>
Microsoft.Policies.WindowsUpdate:definition:WU_SUPPORTED_Win11_24H2
<definition displayName="$(string.WU_SUPPORTED_Win11_24H2)" name="WU_SUPPORTED_Win11_24H2" xmlns="http://schemas.microsoft.com/GroupPolicy/2006/07/PolicyDefinitions">
<or>
<range minVersionIndex="13" ref="unresolved(products):MicrosoftWindows" />
</or>
</definition>
<strings><string id="Microsoft.Policies.WindowsUpdate:WU_SUPPORTED_Win11_24H2">At least Windows 11 Version 24H2</string></strings>