Windows updates configureren via powershell

Het instellen van updates op een server die niet in een domein hangt, kun je via powershell plannen. Je hebt dan meer mogelijkheiden dan via het “Instellingen” scherm.

In feite zetten deze powershell updrachten enkele waarden weg in de registry, die je ook middels regedit kunt instellen.

Als eerste activeren we autoupdate.

Set-ItemProperty -Path HKLM:\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU -Name NoAutoUpdate -Value 0

De AUOptions waarde bepaalt wat je wil doen, enkel notificatie, of enkel downloaden met notificatie of automatisch:
2 enkel notificatie
3 automatisch downloaden met notificatie
4 automatische download op een dag en tijd.

In het voorbeeld laten de we de updates automatisch downloaden en installeren.

Set-ItemProperty -Path HKLM:\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU -Name AUOptions -Value 4

Vervolgens stel je de dag van de week in. Daarbij is de nummering als volgt:

1 zondag
2 maandag
3 dinsdag
4 woensdag
5 donderdag
6 vrijdag
7 zaterdag

In het voorbeeld laten de we de updates op vrijdag plaatsvinden.

Set-ItemProperty -Path HKLM:\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU -Name ScheduledInstallDay -Value 6

Als laatste stel je nog de tijd in hierbij geef je de uren op basis van een 24-uurs klok. In het voorbeeld laten de we de updates om 2:00u ’s nachts plaatsvinden.

Set-ItemProperty -Path HKLM:\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU -Name ScheduledInstallTime -Value 2

Mocht je de updates slechts 1x per maand willen installeren, laten we zeggen de 1ste week van de maand, stel dan nog een van de volgende parameters in, ScheduledInstallFirstWeek, ScheduledInstallSecondWeek, ScheduledInstallThirdWeek of ScheduledInstallFourthWeek:

Set-ItemProperty -Path HKLM:\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU -Name ScheduledInstallFirstWeek -Value 1

Voor de 2de week van de maand:

Set-ItemProperty -Path HKLM:\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU -Name ScheduledInstallSecondWeek -Value 1

Je kunt een eerder gekozen week weer uitschakelen door als -Value 0 te nemen.

Voor het activeren van overige updates van Microsoft voer je dit commando uit:

Set-ItemProperty -Path HKLM:\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU -Name AllowMUUpdateService -Value 1

Tevens wil je instellen dat na de installaties een herstart wordt uitgevoerd. Om dit te activeren voer je het volgende commando uit:

Set-ItemProperty -Path HKLM:\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU -Name AlwaysAutoRebootAtScheduledTime -Value 1

Hierna stel je het aantal minuten in dat gewacht moet worden alvorens te herstarten. Dit kan een waarde tussen de 15 en 180 zijn.

Set-ItemProperty -Path HKLM:\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU -Name AlwaysAutoRebootAtScheduledTimeMinutes -Value 30

Als er een herstart dient plaats te vinden, wil je uitsluiten dat er gewacht wordt op aangemelde gebruikers:

Set-ItemProperty -Path HKLM:\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU -Name NoAutoRebootWithLoggedOnUsers -Value 0

Stel je wil automatisch windows- en overige microsoft updates laten downloaden en installeren op de eerste en derde vrijdag van de maand om 2:00u ’s nachts, waarbij ingelogde gebruikers na de installatie van de updates een restart timer te zien krijgen dat het systeem na 30minuten opnieuw gestart zal worden, dan krijg je dus de volgende set:

Set-ItemProperty -Path HKLM:\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU -Name NoAutoUpdate -Value 0
Set-ItemProperty -Path HKLM:\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU -Name AUOptions -Value 4
Set-ItemProperty -Path HKLM:\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU -Name AllowMUUpdateService -Value 1
Set-ItemProperty -Path HKLM:\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU -Name ScheduledInstallDay -Value 6
Set-ItemProperty -Path HKLM:\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU -Name ScheduledInstallTime -Value 2
Set-ItemProperty -Path HKLM:\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU -Name ScheduledInstallFirstWeek -Value 1
Set-ItemProperty -Path HKLM:\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU -Name ScheduledInstallThirdWeek -Value 1
Set-ItemProperty -Path HKLM:\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU -Name AlwaysAutoRebootAtScheduledTime -Value 1
Set-ItemProperty -Path HKLM:\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU -Name AlwaysAutoRebootAtScheduledTimeMinutes -Value 30
Set-ItemProperty -Path HKLM:\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU -Name NoAutoRebootWithLoggedOnUsers -Value 0

Een herstart van de Windows Update Service kun je vervolgens doen met een start en stop.

net stop wuauserv
net start wuauserv

Met behulp van het volgende script van Michal Gajda, Get-WUSettings.ps1, dat je hier kunt vinden. kun je de gemaakte instellingen controleren.

Function Get-WUSettings
{
    <#
 .SYNOPSIS
     Get Windows Update settings.
 
 .DESCRIPTION
     Use Get-WUSettings to get Windows Update settings.
 
 .PARAMETER WUAAPI
        Use Windows Update Agent API. Works only on local machine.
 
 .PARAMETER Registry
        Use Windows registry. Works only for GPO settings.
 
 .PARAMETER ComputerName    
     Specify the name of the computer to the remote connection.
 
 .PARAMETER Debuger    
     Debug mode.
 
 .EXAMPLE
        PS C:\> Get-WUSettings -Registry
   
            AcceptTrustedPublisherCerts : 1
            WUServer : https://wsus.contoso.com
            WUStatusServer : https://wsus.contoso.com
            DetectionFrequencyEnabled : 1
            DetectionFrequency : 2
            NoAutoRebootWithLoggedOnUsers : 1
            RebootRelaunchTimeoutEnabled : 1
            RebootRelaunchTimeout : 240
            IncludeRecommendedUpdates : 0
            NoAutoUpdate : 0
            AUOptions : 2 - Notify before download
            ScheduledInstallDay : 0 - Every Day
            ScheduledInstallTime : 4
            UseWUServer : 1
            ComputerName : G1
   
 .NOTES
  Author: Michal Gajda
  Blog : http://commandlinegeeks.com/
   
 .LINK
  http://gallery.technet.microsoft.com/scriptcenter/2d191bcd-3308-4edd-9de2-88dff796b0bc
 #>    

    [CmdletBinding(
        SupportsShouldProcess=$True,
        ConfirmImpact="Low",
        DefaultParameterSetName="Registry"
    )]
    Param
    (
        #Mode options
        [Switch]$Debuger,
        [Parameter(ParameterSetName='WUAAPI')]
        [Switch]$WUAAPI,
        [Parameter(ParameterSetName='Registry')]
        [Switch]$Registry = $True,
        [parameter(ValueFromPipeline=$true,
            ValueFromPipelineByPropertyName=$true,
            ParameterSetName='Registry')]
        [String[]]$ComputerName    
    )
    
    Begin
    {
        If($PSBoundParameters['Debuger'])
        {
            $DebugPreference = "Continue"
        } #End If $PSBoundParameters['Debuger']
        
        $User = [Security.Principal.WindowsIdentity]::GetCurrent()
        $Role = (New-Object Security.Principal.WindowsPrincipal $user).IsInRole([Security.Principal.WindowsBuiltinRole]::Administrator)

        if(!$Role)
        {
            Write-Warning "To perform some operations you must run an elevated Windows PowerShell console."    
        } #End If !$Role        
    }
    
    Process
    {
        Write-Debug "Check if ComputerName in set"
        If($ComputerName -eq $null)
        {
            Write-Debug "Set ComputerName to localhost"
            [String[]]$ComputerName = $env:COMPUTERNAME
        } #End If $ComputerName -eq $null

        $NotificationLevels = @{ 0="0 - Not configured"; 1="1 - Disabled"; 2="2 - Notify before download"; 3="3 - Notify before installation"; 4="4 - Scheduled installation"; 5="5 - Users configure" }
        $ScheduledInstallationDays = @{ 0="0 - Every Day"; 1="1 - Every Sunday"; 2="2 - Every Monday"; 3="3 - Every Tuesday"; 4="4 - Every Wednesday"; 5="5 - Every Thursday"; 6="6 - Every Friday"; 7="7 - EverySaturday" }

        $Results = @()
        Foreach($Computer in $ComputerName)
        {        
            If(Test-Connection -ComputerName $Computer -Quiet)
            {
                Write-Debug "Connect to reg HKLM:\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate for $Computer"
                $RegistryKey = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey([Microsoft.Win32.RegistryHive]"LocalMachine",$Computer) 
                $RegistrySubKey1 = $RegistryKey.OpenSubKey("SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\") 
                $RegistrySubKey2 = $RegistryKey.OpenSubKey("SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU\")                
                
                if($RegistrySubKey1) { Write-Verbose "Some settings are managed by your system administrator." }
                                
                if($WUAAPI)
                {
                    $AutoUpdateSettings = (New-Object -ComObject Microsoft.Update.AutoUpdate).Settings

                    $Result = New-Object -TypeName PSObject -Property @{
                        NotificationLevel = $NotificationLevels[$AutoUpdateSettings.NotificationLevel]
                        ScheduledInstallationDay = $ScheduledInstallationDays[$AutoUpdateSettings.ScheduledInstallationDay]
                        ScheduledInstallationTime = $AutoUpdateSettings.ScheduledInstallationTime
                        IncludeRecommendedUpdates = $AutoUpdateSettings.IncludeRecommendedUpdates
                        NonAdministratorsElevated = $AutoUpdateSettings.NonAdministratorsElevated
                        FeaturedUpdatesEnabled = $AutoUpdateSettings.FeaturedUpdatesEnabled
                    }
                } elseif($Registry)
                {
                    $Result = New-Object -TypeName PSObject
                    Try
                    {
                        Foreach($RegName in $RegistrySubKey1.GetValueNames()) 
                        { 
                            $Value = $RegistrySubKey1.GetValue($RegName) 
                            $Result | Add-Member -MemberType NoteProperty -Name $RegName -Value $Value
                        }
                        Foreach($RegName in $RegistrySubKey2.GetValueNames()) 
                        { 
                            $Value = $RegistrySubKey2.GetValue($RegName) 
                            Switch($RegName)
                            {
                                'AUOptions' { $Value = $NotificationLevels[$Value] }
                                'ScheduledInstallDay' { $Value = $ScheduledInstallationDays[$Value] }
                            }
                            $Result | Add-Member -MemberType NoteProperty -Name $RegName -Value $Value
                        }
                    }
                    Catch
                    {
                        Write-Error "Can't find registry subkey: HKLM:\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate. Probably you don't use Group Policy for Windows Update settings. Try use -WUAAPI on local machine." -ErrorAction Stop
                    }

                    $Result | Add-Member -MemberType NoteProperty -Name "ComputerName" -Value $Computer
                } #End elseif $Registry
                $Results += $Result
            } # End If Test-Connection -ComputerName $Computer -Quiet
        } # End Foreach $Computer in $ComputerName
 
        Return $Results

    } #End Process
    
    End{}                
} #In The End :)