This function creates a new Service Window/Maintenance Window for a Configuration Manager collection all using WMI so you do not need the Configuration Manager cmdlets which sometimes can be frustrating to use. This function requires a schedule token as input which can be created using the New-ScheduleToken function. The base code of this function can be found on the blog of David O’Brien who used this in his general function to create a Maintenance Window.
NOTE: By including the SYNOPSIS and other information you can use get-help on the function to find out what parameters you can specify or read what this function actually can be used for. I can highly recommended to always include this information in your PowerShell function(s) so that anybody can understand it.
Examples:
In the below examples names pointing to a sitecode, collection ID or server name are blurred out (this is a real site server behind a FAKE FQDN).
The example below first uses 3 functions together to create the Maintenance Window.
First the Convert-NormalDateToConfigMgrDate function is used to create a usable Date/Time format.
Secondly the Convert-NormalDateToConfigMgrDate output is used for the New-ScheduleToken function to create the Schedule Token.
Finally the schedule token is used with the New-SMSServiceWindow function to create the Maintenance Window on the collection.
If you open the properties of the collection and there select the Maintenance Windows tab you can see the newly created Maintenance Window.
If you open the properties of the Maintenance Window you can see that the configuration we specified (month, year) and the duration are correctly configured as is the fact that this Maintenance Window is non-recurring.
Code:
Function New-SMSServiceWindow { <# .SYNOPSIS This is based on the SMS_ServiceWindow class and it defines the maintenance/service window to be embedded in the SMS_CollectionSettings instance. .DESCRIPTION This function creates a new service window (Maintenance Window) on the specified collection, it does need input from the New-ScheduleToken function to work. .EXAMPLE New-SMSServiceWindow -MaintenanceWindowName "My Maint Window" -MaintenanceWindowDescription "Test" -SCCMScheduleString <from New-ScheduleToken function> -SCCMCollectionID <sccm collection ID> .PARAMETER MaintenanceWindowName This parameter is the name of the Maintenance Window set on the collection .PARAMETER MaintenanceWindowDescription This parameter is the description of the Maintenance Window .PARAMETER SCCMCollectionID This parameter is the CollectionID on which the Maintenance Window is set .PARAMETER SCCMScheduleString This parameter is the value as returned by the New-ScheduleToken function .PARAMETER SCCMServiceWindowType This parameter is the type of the service window (default is 4 for Software Updates) .PARAMETER StartDateTime This a standard get-date Date/Time format which is converted to a value usable by Configuration Manager (if not specified current date/time is used) .PARAMETER SiteServer This parameter defines the site server to connect to and is optional .PARAMETER SiteCode This parameter is optional and by default uses WMI to collect this from the Site Server #> Param( [Parameter(Mandatory=$true)] [string]$MaintenanceWindowName, [Parameter(Mandatory=$True)] [string]$SCCMCollectionID, [Parameter(Mandatory=$True)] [string]$SCCMScheduleString, [Parameter(Mandatory=$false)] [string]$SiteServer = "mysiteserver.example.com", [Parameter(Mandatory=$false)] [string]$SiteCode = (Get-WmiObject -Namespace "root\SMS" -Class SMS_ProviderLocation -ComputerName $SiteServer).SiteCode, [Parameter(Mandatory=$false)] [int]$SCCMServiceWindowType = 4, # https://msdn.microsoft.com/library/jj155419.aspx?f=255&MSPPError=-2147217396 [Parameter(Mandatory=$false)] [datetime]$StartDateTime = (Get-Date), [Parameter(Mandatory=$false)] [string]$MaintenanceWindowDescription ) Write-Verbose "SCCM Site Server : $($SiteServer)" Write-Verbose "SCCM Site code : $($SiteCode)" Write-Verbose "SCCM Collection ID : $($SCCMCollectionID)" If (!($MaintenanceWindowDescription)) { $MaintenanceWindowDescription = "Created on $($StartDateTime.Year)-$($StartDateTime.Month)-$($StartDateTime.Day)" } Write-Verbose "Maintenance Window Name : $($MaintenanceWindowName)" Write-Verbose "Maintenance Window Description : $($MaintenanceWindowDescription)" Write-Verbose "Start Date/Time : $StartDateTime" $ServiceWindowStartDateTime = $(Get-Date $StartDateTime -Format "yyyyMMddhhmmss.ffffff+***") Write-Verbose "SCCM Format of specified Date/Time : $ServiceWindowStartDateTime" $CollSettings = Get-WmiObject -Class "SMS_CollectionSettings" -Namespace "ROOT\SMS\Site_$($SiteCode)" -Filter "CollectionID = '$($SCCMCollectionID)'" -ComputerName $SiteServer If ($CollSettings) { $CollSettings = [wmi]$CollSettings.__PATH $CollSettings.Get() $class_SMS_ServiceWindow = [wmiclass]"\\$($SiteServer)\ROOT\SMS\Site_$($SiteCode):SMS_ServiceWindow" $SMS_ServiceWindow = $class_SMS_ServiceWindow.CreateInstance() $SMS_ServiceWindow.Name = "$($MaintenanceWindowName)" $SMS_ServiceWindow.Description = "$($MaintenanceWindowDescription)" $SMS_ServiceWindow.IsEnabled = $true $SMS_ServiceWindow.ServiceWindowSchedules = $SCCMScheduleString $SMS_ServiceWindow.ServiceWindowType = $SCCMServiceWindowType $SMS_ServiceWindow.StartTime = "$($ServiceWindowStartDateTime)" $CollSettings.ServiceWindows += $SMS_ServiceWindow.psobject.baseobject $CollSettings.Put() |Out-Null } }
Pingback: Create a Schedule Token for usage within SCCM – Bits and bytes from a Windows Engineer
Pingback: Function to create and set a Maintenance Window on a specified SCCM Collection – Bits and bytes from a Windows Engineer