This script will place a server in maintenance mode automatically from the server being worked on. It allows system / application administrators on the system to place the system in maintenance mode without launching a SCOM console, other remote scripts, etc. If there is a SCOM Agent already installed on it and it is healthy, then why not place it into Maintenance Mode from the server? It was created to save time and make things a little easier.

For more details read the blog article http://aka.ms/allthat

 

PowerShell
Edit|Remove
<# 
.SYNOPSIS 
Places a specified computer in SCOM into maintenance mode. 
 
.DESCRIPTION 
Start-MaintenanceMode.ps1 places a specified computer in SCOM into maintenance mode, and creates new active maintenance mode entries. 
 
When in maintenance mode, alerts, notifications, rules, monitors, automatic responses, state changes, and new alerts are suppressed from the computer. 
 
.PARAMETER SCOMManagementServerName 
Specified the SCOM management server 
 
.PARAMETER ComputerToPlaceInMaintenanceMode 
Specifies the computer in SCOM to place in maintenance mode. This parameter also accepts multiple computers. The default is the computer the script is running from. 
 
.PARAMETER Minutes 
Specifies the time in minutes that the maintenance will end. The minimum amount of time a computer can be in maintenance mode is 5 minutes. 
 
.PARAMETER Comment 
Allows you to type a comment about the maintenance activity. 
 
.EXAMPLE 
.\Start-MaintenanceMode.ps1 -SCOMManagementServerName SCOMServer01 -Minutes 15 
 
Places the computer this script is running from in to maintenance mode for 15 minutes. 
 
.EXAMPLE 
.\Start-MaintenanceMode.ps1 -SCOMManagementServerName SCOMServer01 -ComputerToPlaceInMaintenanceMode Server01 -Minutes 15 
 
Places Server01 in maintenance mode for 15 minutes. 
 
.EXAMPLE 
.\Start-MaintenanceMode.ps1 -SCOMManagementServerName SCOMServer01 -ComputerToPlaceInMaintenanceMode Server01, Server02, Server03 -Minutes 15 
 
Places Server01, Server02 and Server03 in maintenance mode for 15 minutes. 
 
.EXAMPLE 
.\Start-MaintenanceMode.ps1 -SCOMManagementServerName SCOMServer01 -ComputerToPlaceInMaintenanceMode Server01 -Minutes 60 -Comment "Applying Windows Updates" 
 
Places Server01 in maintenance mode for 60 minutes with a maintenance comment in SCOM of "Applying Windows Updates" 
 
.NOTES 
Author: Jeramy Evers 
Contributor: Lynne Taggart 
Contributor: Paul Ray 
Contributor: Mark Trammell 
Date Created: 7/26/2017 
Date Modified: 10/30/2017 
http://aka.ms/allthat 
Version: 1.4 
#> 
 
Param ( 
    [Parameter(Mandatory = $True)][String]$SCOMManagementServerName, 
    [Parameter(Mandatory = $False)][String[]]$ComputerToPlaceInMaintenanceMode = ([System.Net.Dns]::GetHostByName($env:COMPUTERNAME) | Select-Object -ExpandProperty HostName), 
    [Parameter(Mandatory = $True, HelpMessage = "Specifies the time in minutes that the maintenance will end. The minimum amount of time a resource can be in maintenance mode is 5 minutes.")][ValidateScript ({$_ -ge 5})][Int16]$Minutes, 
    [Parameter(Mandatory = $False)][String]$Comment 
) 
 
$ErrorActionPreference = "Stop" 
 
Try { 
    If (-not (Get-Module OperationsManager)) { 
        Try { 
            Import-Module OperationsManager 
        } 
        Catch [System.IO.FileNotFoundException] { 
            $_.Exception 
            Write-Host "Attempting to perform implicit remoting to $SCOMManagementServerName" 
            $Session = New-PSSession -ComputerName $SCOMManagementServerName 
            Invoke-Command -ScriptBlock {Import-Module OperationsManager} -Session $Session 
            Import-PSSession -Session $Session -Module OperationsManager 
            $ImplicitRemoting = $True 
        } 
    } 
 
    If (-not (Get-SCOMManagementGroupConnection)) { 
        New-SCOMManagementGroupConnection -ComputerName $SCOMManagementServerName 
    } 
 
    Foreach ($Computer in $ComputerToPlaceInMaintenanceMode) { 
        $ComputerName = [System.Net.Dns]::GetHostByName($Computer| Select-Object -ExpandProperty HostName 
        If (-not $ImplicitRemoting) { 
            $Instances = Get-SCOMClassInstance -Name $ComputerName 
            Foreach ($Instance in $Instances) { 
                # Adding an additional 10 seconds if 5 minutes was specified, as SCOM only allows for a minimum of 5 minutes and this 10 second "buffer" helps avoid generating an error if the following cmdlet is not processed on the SCOM server immediately 
                If ($Minutes -eq 5) { 
                    $EndTime = (Get-Date).AddMinutes($Minutes).AddSeconds(10) 
                } 
                Else { 
                    $EndTime = (Get-Date).AddMinutes($Minutes) 
                } 
                Start-SCOMMaintenanceMode -Instance $Instance -EndTime $EndTime -Comment $Comment 
            } 
        Write-Output "Placed $ComputerName in maintenance mode for $Minutes minutes." 
        } 
        Else { 
            Invoke-Command -Session $Session -ScriptBlock { 
                $Instances = Get-SCOMClassInstance -Name $Using:ComputerName 
                Foreach ($Instance in $Instances) { 
                    # Adding an additional 10 seconds if 5 minutes was specified, as SCOM only allows for a minimum of 5 minutes and this 10 second "buffer" helps avoid generating an error if the following cmdlet is not processed on the SCOM server immediately 
                    If ($Using:Minutes -eq 5) { 
                        $EndTime = (Get-Date).AddMinutes($Using:Minutes).AddSeconds(10) 
                    } 
                    Else { 
                        $EndTime = (Get-Date).AddMinutes($Using:Minutes) 
                    } 
                    Start-SCOMMaintenanceMode -Instance $Instance -EndTime $EndTime -Comment $Using:Comment 
                } 
            } 
        Write-Output "Placed $ComputerName in maintenance mode for $Minutes minutes." 
        } 
    } 
} 
Catch { 
    $_.Exception 
    Break 
}