Today I needed to create a number of deployments for Software Update Automatic Deployment Rules in SCCM, so I turned to PowerShell and used the New-CMAutoDeploymentRuleDeployment cmdlet available in the ConfigurationManager module. It works well enough, however there are a couple of options that the cmdlet cannot set, namely:
- If software updates are not available on distribution point in current, neighbour or site boundary groups, download content from Microsoft Updates
- If any update in this deployment requires a system restart, run updates deployment evaluation cycle after restart
Turns out that these can easily be set though by manipulating the XML deployment template in the object returned by the cmdlet. You can actually set all the deployment properties that way if you wanted, so long as you know the parameters and values from the deployment template XML.
Here is an example that creates the ADR deployments for an array of collections and also sets the two options above:
# ADR name
$ADRName = "Windows 10 Updates"
# Collections to create deployments for
$Collections = @(
'SUP - Pilot - ABC - All'
'SUP - Pilot - XYZ - All'
'SUP - Production - ABC - All'
'SUP - Production - XYZ - All'
)
# Import ConfigMgr Module
Import-Module $env:SMS_ADMIN_UI_PATH.Replace('i386','ConfigurationManager.psd1')
$SiteCode = (Get-PSDrive -PSProvider CMSITE).Name
Set-Location ("$SiteCode" + ":")
# Get the ADR
$ADR = Get-CMAutoDeploymentRule -Name $ADRName
# Create the deployments
Foreach ($Collection in $Collections)
{
# Create the deployment
$Params = @{
CollectionName = $Collection
EnableDeployment = $true
SendWakeupPacket = $false
VerboseLevel = 'OnlySuccessAndErrorMessages'
UseUtc = $true
AvailableTime = 2
AvailableTimeUnit = 'Days'
DeadlineImmediately = $true
UserNotification = 'DisplaySoftwareCenterOnly'
AllowSoftwareInstallationOutsideMaintenanceWindow = $true
AllowRestart = $false
SuppressRestartServer = $true
SuppressRestartWorkstation = $true
WriteFilterHandling = $true
NoInstallOnRemote = $false
NoInstallOnUnprotected = $false
UseBranchCache = $true
}
$null = $ADR | New-CMAutoDeploymentRuleDeployment @Params
# Update the deployment with some additional params not available in the cmdlet
$ADRDeployment = Get-CMAutoDeploymentRuleDeployment -Name $ADRName -Fast | where {$_.CollectionName -eq $Collection}
[xml]$DT = $ADRDeployment.DeploymentTemplate
# If software updates are not available on distribution point in current, neighbour or site boundary groups, download content from Microsoft Updates
$DT.DeploymentCreationActionXML.AllowWUMU = "true"
# If any update in this deployment requires a system restart, run updates deployment evaluation cycle after restart
If ($DT.DeploymentCreationActionXML.RequirePostRebootFullScan -eq $null)
{
$NewChild = $DT.CreateElement("RequirePostRebootFullScan")
[void]$DT.SelectSingleNode("DeploymentCreationActionXML").AppendChild($NewChild)
}
$DT.DeploymentCreationActionXML.RequirePostRebootFullScan = "Checked"
$ADRDeployment.DeploymentTemplate = $DT.OuterXml
$ADRDeployment.Put()
}