DSCResources/UpdateServicesClientDSC/UpdateServicesClientDSC.psm1
Import-Module "$((Get-Item -LiteralPath "$($PSScriptRoot)").Parent.Parent.FullName)\Misc\KVWindowsUpdate.psm1" function Get-TargetResource { [CmdletBinding()] [OutputType([System.Collections.Hashtable])] param ( [ValidateSet("Present","Absent")] [System.String] $Ensure = 'Present', [parameter(Mandatory = $true)] [System.Boolean] $AutomaticUpdateEnabled, [System.String] $AutomaticUpdateOption, [System.String] $UpdateServer, [System.String] $UpdateTargetGroup, [ValidateSet('Monday','Tuesday','Wednesday','Thursday','Friday','Saturday','Sunday','All')] [System.String] $ScheduledInstallDay, [ValidateSet(01,02,03,04,05,06,07,08,09,10,11,12,13,14,15,16,17,18,19,20,21,22,23)] [System.UInt32] $ScheduledInstallHour ) Write-Verbose 'Getting all the existing settings on the system' $AutomaticUpdate = (Get-AutomaticUpdate).AutomaticUpdateEnabled $UpdateOption = (Get-UpdateOption).AutoUpdateOption $Server = (Get-UpdateServer).WSUSServer $TargetGroup = (Get-UpdateTargetGroup).TargetGroup $InstallDay = (Get-UpdateScheduledInstallDay).ScheduledUpdateInstallDay $InstallHour = (Get-UpdateScheduledInstallHour).ScheduledUpdateInstallHour $returnValue = @{ Ensure = $Ensure AutomaticUpdateEnabled = $AutomaticUpdate AutomaticUpdateOption = $UpdateOption UpdateServer = $Server UpdateTargetGroup = $TargetGroup ScheduledInstallDay = $InstallDay ScheduledInstallHour = $InstallHour } $returnValue } function Set-TargetResource { [CmdletBinding()] param ( [ValidateSet("Present","Absent")] [System.String] $Ensure = 'Present', [parameter(Mandatory = $true)] [System.Boolean] $AutomaticUpdateEnabled, [ValidateSet('NotifyBeforeDownload','AutoDownloadAndNotifyForInstall','AutoDownloadAndScheduleInstallation','UsersCanConfigureAutomaticUpdates')] [System.String] $AutomaticUpdateOption, [System.String] $UpdateServer, [System.String] $UpdateTargetGroup, [ValidateSet('Monday','Tuesday','Wednesday','Thursday','Friday','Saturday','Sunday','All')] [System.String] $ScheduledInstallDay, [ValidateSet(01,02,03,04,05,06,07,08,09,10,11,12,13,14,15,16,17,18,19,20,21,22,23)] [System.UInt32] $ScheduledInstallHour ) $targetResource = Get-TargetResource @PSBoundParameters if ($PSBoundParameters.ContainsKey('AutomaticUpdateEnabled')) { if ($Ensure -eq 'Present') { if ($targetResource.AutomaticUpdateEnabled -ne $AutomaticUpdateEnabled) { Write-Verbose "Changing setting 'Automatic Update' to Enabled" Set-AutomaticUpdate -Enabled $true } } else { Write-Verbose 'Removing Automatic Update setting' Remove-AutomaticUpdate } } if ($PSBoundParameters.ContainsKey('AutomaticUpdateOption')) { if ($Ensure -eq 'Present') { if ($targetResource.AutomaticUpdateOption -ne $AutomaticUpdateOption) { Write-Verbose "Changing Automatic Update Option to $AutomaticUpdateOption" Set-UpdateOption -Setting $AutomaticUpdateOption } } else { Write-Verbose "Removing Automatic Update Option" Remove-UpdateOption } } if ($PSBoundParameters.ContainsKey('UpdateServer')) { if ($Ensure -eq 'Present') { if ($targetResource.UpdateServer -ne $UpdateServer) { Write-Verbose "Changing Update Server to the following URL: $UpdateServer" Set-UpdateServer -URL $UpdateServer -Enabled $true } } else { Write-Verbose "Removing Update Server" Remove-UpdateServer } } if ($PSBoundParameters.ContainsKey('UpdateTargetGroup')) { if ($Ensure -eq 'Present') { if ($targetResource.UpdateTargetGroup -ne $UpdateTargetGroup) { Write-Verbose "Changing Update Target Group to $UpdateTargetGroup" Set-UpdateTargetGroup -Name $UpdateTargetGroup } } else { Write-Verbose 'Removing Update Target Group' Remove-UpdateTargetGroup } } if ($PSBoundParameters.ContainsKey('ScheduledInstallDay')) { if ($Ensure -eq 'Present') { if ($targetResource.ScheduledInstallDay -ne $ScheduledInstallDay) { Write-Verbose "Changing Update Scheduled Install Day to $ScheduledInstallDay" Set-UpdateScheduledInstallDay -Day $ScheduledInstallDay } } else { Write-Verbose 'Removing Update Scheduled Install Day' Remove-UpdateScheduledInstallDay } } if ($PSBoundParameters.ContainsKey('ScheduledInstallHour')) { if ($Ensure -eq 'Present') { if ($targetResource.ScheduledInstallTime -ne $ScheduledInstallHour) { Write-Verbose "Changing Update Scheduled Install Hour to $ScheduledInstallHour" Set-UpdateScheduledInstallHour -Hour $ScheduledInstallHour } } else { Write-Verbose 'Removing Update Scheduled Install Hour' Remove-UpdateScheduledInstallHour } } } function Test-TargetResource { [CmdletBinding()] [OutputType([System.Boolean])] param ( [ValidateSet("Present","Absent")] [System.String] $Ensure = 'Present', [parameter(Mandatory = $true)] [System.Boolean] $AutomaticUpdateEnabled, [ValidateSet('NotifyBeforeDownload','AutoDownloadAndNotifyForInstall','AutoDownloadAndScheduleInstallation','UsersCanConfigureAutomaticUpdates')] [System.String] $AutomaticUpdateOption, [System.String] $UpdateServer, [System.String] $UpdateTargetGroup, [ValidateSet('Monday','Tuesday','Wednesday','Thursday','Friday','Saturday','Sunday','All')] [System.String] $ScheduledInstallDay, [ValidateSet(01,02,03,04,05,06,07,08,09,10,11,12,13,14,15,16,17,18,19,20,21,22,23)] [System.UInt32] $ScheduledInstallHour ) if ($PSBoundParameters.ContainsKey('Ensure')) { [void]$PSBoundParameters.Remove('Ensure') } $targetResource = Get-TargetResource @PSBoundParameters if ($targetResource.Ensure -ne $Ensure) { Write-Verbose "Ensure is $Ensure" return $false } if ($targetResource.AutomaticUpdateEnabled -ne $AutomaticUpdateEnabled) { Write-Verbose "AutomaticUpdateEnabled is not set to $AutomaticUpdateEnabled" return $false } if ($targetResource.AutomaticUpdateOption -ne $AutomaticUpdateOption) { Write-Verbose "AutomaticUpdateOption is not set to $AutomaticUpdateOption" return $false } if ($targetResource.UpdateServer -ne $UpdateServer) { Write-Verbose "UpdateServer is not set to $UpdateServer" return $false } if ($targetResource.UpdateTargetGroup -ne $UpdateTargetGroup) { Write-Verbose "UpdateTargetGroup is not set to $UpdateTargetGroup" return $false } if ($targetResource.ScheduledInstallDay -ne $ScheduledInstallDay) { Write-Verbose "ScheduledInstallDay is not set to $ScheduledInstallDay" return $false } if ($targetResource.ScheduledInstallHour -ne $ScheduledInstallHour) { Write-Verbose "ScheduledInstallHour is not set to $ScheduledInstallHour" return $false } Write-Verbose "All settings are applied successfully" return $true } Export-ModuleMember -Function *-TargetResource |