Public mode

No access to your tenant or devices. Every item links to its source. What this means

Sources need attention Customize Public modeDiscuss ChangeIntel on Discord

Windows 11 Group Policy settings

3,686 settings · 26H2 · 1.0 · 29 Sep 2026

3 folders · 10 settingsCSV
Back to the list

Windows Components › Windows Update › Manage end user experience

Configure maintenance windows for automatic updates

ComputerIntune-readyNew in 26H2 · 1.0MaintenanceWindow

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

OptionTypeRegistry valueAllowed values
Update actions only allowed inside the maintenance windowRequiredDefault: Install and restart (2) Drop-down list (enum) MaintenanceWindowUpdateActions
  • Download, install, and restart1
  • Install and restart2
  • Restart only3
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
  • No repeat1
  • Daily2
  • Weekly3
  • Monthly4
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
  • Date-based1
  • Week-based2
  • Last day of the month3
Day of the MonthRequiredDefault: 1 Number (decimal) MaintenanceWindowMonthlyMonthBasedDayOfMonth 1 to 28
Occurrence in MonthRequiredDefault: Second (2) Drop-down list (enum) MaintenanceWindowMonthlyWeekBasedOccurrenceInMonth
  • First1
  • Second2
  • Third3
  • Fourth4
  • Last5
Day of the WeekRequiredDefault: Monday (2) Drop-down list (enum) MaintenanceWindowMonthlyWeekBasedDayOfTheWeek
  • Sunday1
  • Monday2
  • Tuesday3
  • Wednesday4
  • Thursday5
  • Friday6
  • Saturday7

Configure and deploy

Choose a state and the option values; the output below is generated from the template for exactly that.

State
Options used when Enabled

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/MaintenanceWindow
Intune 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

  1. 26H2 · 1.029 Sep 2026
    Registry 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>
ChangeIntel

An IT change radar: releases, security, known issues, retirements, documentation changes, and service status from public sources. Every item links to supporting evidence; dates and statuses can change after they are read.

Sources read 12 Nov 22:49 UTC · 273 of 275 readable · 271 fully read · documentation 469/469 current