Recently I deployed a very simple task sequence to all our laptop computers which installs a new WiFi profile. However, on viewing the deployment reports I noticed a number of machines where the deployment was stuck in either the ‘running’ state, or ‘failed’. Although the deployment is set to ‘Re-run if failed previous attempt’ it seems the task sequence will not re-run automatically, only if a new schedule is created. I wanted a quick and easy way to simply trigger the deployment again on all the computers that needed it, so I modified a script I use for re-running a task sequence to run against all computers in a csv.
Here is the script. You need PS remoting active in your environment. Simply add the location of the csv that contains the computernames you want to re-run the deployment on (no header required), and the name of the task sequence, and the script will do the rest. It’s a little crude at the moment, but it works! After running this, my compliance figures for the deployment were immediately boosted, and only a handful of machines remained that required individual troubleshooting 🙂
$ComputerNames = Get-Content -Path C:\Script_Files\WiFi_Profile_Failures.csv $TaskSequenceName = "WiFi Profile" cls foreach ($ComputerName in $ComputerNames) { # Test connectivity to the computer if (Test-Connection -Quiet -Count 2 -ComputerName $ComputerName -ErrorAction SilentlyContinue) {$Online = "Yes"}else{$Online = "No"} if ($Online -eq "No") {write-host "$ComputerName is not online!"} if ($Online -eq "Yes") { $s = New-PSSession -ComputerName $ComputerName Invoke-Command -Session $s -Argu $ComputerName,$TaskSequenceName -ScriptBlock ` { param ($ComputerName,$TaskSequenceName) write-host "Getting PackageID for '$TaskSequenceName' on $ComputerName" $PackageID = get-wmiobject -computername $ComputerName -query "SELECT * FROM CCM_SoftwareDistribution" -namespace "root\ccm\policy\machine\actualconfig" | where {$_.PKG_Name -like $TaskSequenceName} | Select PKG_PackageID $PackageID = $PackageID.PKG_PackageID write-host $PackageID -ForegroundColor Yellow write-host "Getting ScheduleID for '$TaskSequenceName' on $ComputerName" $ScheduleID = Get-WmiObject -computername $ComputerName -Namespace "root\ccm\scheduler" -Class ccm_scheduler_history | where {$_.ScheduleID -like "*$PackageID*"} | Select-Object ScheduleID $ScheduleID = $ScheduleID.ScheduleID write-host $ScheduleID -ForegroundColor Yellow write-host "Getting AdvertisementID for '$TaskSequenceName' on $ComputerName" $AdvertisementID = get-wmiobject -computername $ComputerName -query "SELECT * FROM CCM_SoftwareDistribution" -namespace "root\ccm\policy\machine\actualconfig" | where {$_.PKG_Name -like $TaskSequenceName} | Select ADV_AdvertisementID $AdvertisementID = $AdvertisementID.ADV_AdvertisementID write-host $AdvertisementID -ForegroundColor Yellow write-host "Setting re-run behaviour" $a = get-wmiobject -computername $ComputerName -query "SELECT * FROM CCM_TaskSequence" -namespace "root\ccm\policy\machine\actualconfig" | Where {$_.ADV_AdvertisementID -like "*$AdvertisementID*"} $a.ADV_RepeatRunBehavior='RerunAlways' $a.Put() | Out-Null write-host "Creating mandatory assignment" $a = get-wmiobject -computername $ComputerName -query "SELECT * FROM CCM_TaskSequence" -namespace "root\ccm\policy\machine\actualconfig" | Where {$_.ADV_AdvertisementID -like "*$AdvertisementID*"} $a.ADV_MandatoryAssignments=$True $a.Put() | Out-Null write-host "Triggering the schedule now!" -ForegroundColor Green Invoke-WmiMethod -ComputerName $ComputerName -Namespace ROOT\ccm -Class SMS_Client -Name TriggerSchedule -ArgumentList "$ScheduleID" | Out-Null } Remove-PSSession $s } }