Here is the script:
# Enter the FQDN of your SCOM management server in this variable
$RMSFQDN = "my-managementserver.mydomain.internal"
# Enter the internal DNS suffix for your environment
$DNS = "mydomain.internal"
$Name = "Microsoft.EnterpriseManagement.OperationsManager.Client"
$ModuleLoaded = Get-Pssnapin $Name -ErrorAction SilentlyContinue
If (-not $ModuleLoaded)
{
add-pssnapin "Microsoft.EnterpriseManagement.OperationsManager.Client";
}
New-ManagementGroupConnection -ConnectionString $RMSFQDN
Set-Location "OperationsManagerMonitoring::";
$startTime = [System.DateTime]::Now
# You can change the default time for how long systems should be in maintenance
$Hours = 3
$endTime = $startTime.AddHours($Hours)
$comment = "Computer Maintenance"
While ( ($computerPrincipalName -ne "done") -or ($computerPrincipalName -ne "Done") )
{
$computerClass = get-monitoringclass -name:Microsoft.SystemCenter.ManagedComputer
$computerPrincipalName = Read-Host "Enter the computer name to put into maintenance (enter 'done' to finish maintenance mode)"
$computerCriteria = "PrincipalName='" + $computerPrincipalName + "." + $DNS + "'"
write-host $computerPrincipalName
$computer = get-monitoringobject -monitoringclass:$computerClass -criteria:$computerCriteria
if($computer -eq $null)
{
$unixClass = get-monitoringclass -name "Microsoft.Unix.Computer"
$monObject = Get-MonitoringObject -monitoringclass:$unixClass
$computer = $monObject | where {$_.displayname -eq $computerPrincipalName}
}
ELSE
{
$computerClass = get-monitoringclass -name:Microsoft.Windows.Computer
$computer = get-monitoringobject -monitoringclass:$computerClass -criteria:$computerCriteria
}
if($computer.InMaintenanceMode -eq $false)
{
"Putting " + $computerPrincipalName + " into maintenance mode"
New-MaintenanceWindow -startTime:$startTime -endTime:$endTime -comment:$comment -monitoringObject:$computer
}
}
stop-process -Id $PID