I recently had a need to provide capability for adding one-time maintenance windows in PRTG for a specific set of objects.
I found this post on the PRTG forums as a starting point. I also needed to learn how to authenticate an API request in PowerShell, which Paessler has provided a KB article on.
Part of my requirements were conditional logic, to say “Pause these sensors, and maybe pause these other ones too if desired”. I used a Switch parameter in my PowerShell script to accomplish this.
One of the remaining downsides of this script is that it requires pre-knowledge of the exact object IDs from PRTG. These are easy to find, by navigating to the object you desire, and looking at the URL which will display it.
I also want to be able to call this script from a website with user-specified parameters, but that will be for a future post.
Here’s my script, which can be called like this:
$start = get-date $end = (get-date).AddMinutes(5) .\PrtgMaintenanceWindow.ps1 -MaintStartTime $start -MaintEndTime $end -IncludProdWebServers -IncludeTestWebServers |
Full Script:
param( [Parameter(Mandatory = $true)] [datetime]$MaintStartTime, [Parameter(Mandatory = $true)] [datetime]$MaintEndTime, [Switch]$IncludeProdWebServers, [Switch]$IncludeTestWebServers ) # Use $Global parameters so they can be used inside the Function without repeating $Global:prtgAuth = 'username=PRTGUSERNAME&passhash=GENERATEDHASHVALUE' $Global:prtgServer = 'https://FQDN.OF.PRTG' $Global:MaintStart = '{0:yyyy-MM-dd-HH-mm-ss}' -f $MaintStartTime $Global:MaintEnd = '{0:yyyy-MM-dd-HH-mm-ss}' -f $MaintEndTime $ServicesID = @("OBJECTID") # Group containing devices & sensors that I want to control $ProdWebServersID = @("13152", "13153", "13149", "13150") # Individual Devices to conditionally apply a maintenance window to $TestWebServersID = @("13219", "13221", "13220", "13222") # Function that can be called multiple times, after passing in an ObjectID. function ApplyMaintenanceWindow { param( [int]$objectid ) # Apply Start Time of Maintenance Window $startattempt = Invoke-WebRequest "$prtgServer/api/setobjectproperty.htm?id=$objectid&name=maintstart&value=$MaintStart&$prtgAuth" -UseBasicParsing # Display the output as successful if HTTP200 response code received. Using Out-String for future integration purposes with website. if ($startattempt.StatusCode -eq "200") { $message = "Object ID: $objectid - Maintenance window set to start at $MaintStart" $message | out-string } # Apply End Time of Maintenance Window $endattempt = Invoke-WebRequest "$prtgServer/api/setobjectproperty.htm?id=$objectid&name=maintend&value=$MaintEnd&$prtgAuth" -UseBasicParsing if ($endattempt.StatusCode -eq "200") { $message = "Object ID: $objectid - Maintenance window set to end at $MaintEnd" $message | out-string } # Enable Maintenance Window for the object $enableattempt = Invoke-WebRequest "$prtgServer/api/setobjectproperty.htm?id=$objectid&name=maintenable&value=1&$prtgAuth" -UseBasicParsing if ($enableattempt.StatusCode -eq "200") { $message = "Object ID: $objectid - Maintenance window enabled" $message | out-string } } # Add maintenance Window for Client Services # Do this always, with the parameters supplied foreach ($id in $ClientServicesID) { ApplyMaintenanceWindow -objectid $id } #If necessary, add maintenance window for ProdWebServers # Do this conditionally, if the switch is provided if ($IncludeProdWebServers.IsPresent) { foreach ($id in $ClientProdWebServersID) { ApplyMaintenanceWindow -objectid $id } } #If necessary, add maintenance window for TestWebServers # Do this conditionally, if the switch is provided if ($IncludeTestWebServers.IsPresent) { foreach ($id in $ClientTestWebServersID) { ApplyMaintenanceWindow -objectid $id } } |