functions/Add-WUGActiveMonitor.ps1
<#
.SYNOPSIS Adds an active monitor to WhatsUp Gold (WUG) for various monitoring types including SNMP, Ping, TCP/IP, Certificate, WMI, and more. .DESCRIPTION This function allows the user to create different types of active monitors in WhatsUp Gold (WUG) by specifying the type of monitor and its relevant parameters. It supports various monitoring types such as Ping, TCP/IP, SNMP, Process, Certificate, Service, and WMIFormatted. The function handles the creation of the monitor by checking if it already exists and then making the appropriate API call to create the monitor with the specified settings. .PARAMETER Type The type of the monitor to be created. Valid values are 'Ping', 'TcpIp', 'SNMP', 'Process', 'Certificate', 'Service', 'WMIFormatted'. This parameter is mandatory and determines the set of additional parameters required. TBD: .PARAMETER Name The name of the monitor to be created. This parameter is mandatory. .PARAMETER Timeout The timeout value for the monitor in seconds. Default is 5 seconds. This parameter is shared among all parameter sets. .PARAMETER Retries The number of retries for the monitor. Default is 1. This parameter is shared among all parameter sets. .PARAMETER PingPayloadSize The payload size for the Ping monitor. Valid values are between 1 and 65535. This parameter is specific to the 'Ping' parameter set. .PARAMETER TcpIpPort The port number for the TCP/IP monitor. Valid values are between 1 and 65535. This parameter is specific to the 'TcpIp' parameter set. .PARAMETER TcpIpProtocol The protocol to use for the TCP/IP monitor. Valid values are 'TCP', 'UDP', 'SSL'. This parameter is specific to the 'TcpIp' parameter set. .PARAMETER TcpIpScript The script to use for the TCP/IP monitor. This parameter is specific to the 'TcpIp' parameter set. .PARAMETER CertOption The option for the Certificate monitor. Valid values are 'url', 'file'. This parameter is specific to the 'Certificate' parameter set. .PARAMETER CertPath The path for the Certificate monitor. It can be a URL or a file path. This parameter is specific to the 'Certificate' parameter set. .PARAMETER CertExpiresDays The number of days before the certificate expires. Default is 5 days. This parameter is specific to the 'Certificate' parameter set. .PARAMETER CertCheckUsage A switch to check the usage of the certificate. This parameter is specific to the 'Certificate' parameter set. .PARAMETER CertCheckExpires A switch to check if the certificate expires. Default is $true. This parameter is specific to the 'Certificate' parameter set. .PARAMETER CertUseProxySettings A switch to use proxy settings for the Certificate monitor. This parameter is specific to the 'Certificate' parameter set. .PARAMETER CertProxyServer The proxy server for the Certificate monitor. This parameter is specific to the 'Certificate' parameter set. .PARAMETER CertProxyPort The proxy port for the Certificate monitor. This parameter is specific to the 'Certificate' parameter set. .PARAMETER CertProxyUser The proxy user for the Certificate monitor. This parameter is specific to the 'Certificate' parameter set. .PARAMETER CertProxyPwd The proxy password for the Certificate monitor. This parameter is specific to the 'Certificate' parameter set. .PARAMETER SnmpOID The OID for the SNMP monitor. This parameter is specific to the 'ConstantOrRate' and 'Range' parameter sets. .PARAMETER SnmpInstance The instance for the SNMP monitor. Default is an empty string. This parameter is specific to the 'ConstantOrRate' and 'Range' parameter sets. .PARAMETER SnmpCheckType The check type for the SNMP monitor. Valid values are 'constant', 'range', 'rateofchange'. This parameter is specific to the 'ConstantOrRate' and 'Range' parameter sets. .PARAMETER SnmpValue The value for the SNMP monitor with 'constant' or 'rateofchange' check type. This parameter is mandatory for the 'ConstantOrRate' parameter set. .PARAMETER SnmpLowValue The low value for the SNMP monitor with 'range' check type. This parameter is mandatory for the 'Range' parameter set. .PARAMETER SnmpHighValue The high value for the SNMP monitor with 'range' check type. This parameter is mandatory for the 'Range' parameter set. .PARAMETER ProcessName The name of the process for the Process monitor. This parameter is specific to the 'Process' parameter set. .PARAMETER ProcessDownIfRunning A switch to mark the process as down if it is running. Valid values are 'true' or 'false'. Default is 'false'. This parameter is specific to the 'Process' parameter set. .PARAMETER ProcessUseWMI A switch to use WMI for the Process monitor. Default is $false. This parameter is specific to the 'Process' parameter set. .PARAMETER ServiceDisplayName The display name of the service for the Service monitor. This parameter is specific to the 'Service' parameter set. .PARAMETER ServiceInternalName The internal name of the service for the Service monitor. This parameter is specific to the 'Service' parameter set. .PARAMETER ServiceUseSNMP A switch to use SNMP for the Service monitor. Default is $false. This parameter is specific to the 'Service' parameter set. .PARAMETER ServiceSNMPRetries The number of retries for SNMP in the Service monitor. Default is 1. This parameter is specific to the 'Service' parameter set. .PARAMETER ServiceSNMPTimeout The timeout value for SNMP in the Service monitor in seconds. Default is 3 seconds. This parameter is specific to the 'Service' parameter set. .PARAMETER ServiceRestartOnFailure The number of times to restart the service on failure. Default is 0. This parameter is specific to the 'Service' parameter set. .PARAMETER WMIFormattedRelativePath The relative path for the WMIFormatted monitor. This parameter is specific to the 'WMIFormatted' parameter set. .PARAMETER WMIFormattedPerformanceCounter The performance counter for the WMIFormatted monitor. This parameter is specific to the 'WMIFormatted' parameter set. .PARAMETER WMIFormattedPerformanceInstance The performance instance for the WMIFormatted monitor. This parameter is specific to the 'WMIFormatted' parameter set. .PARAMETER WMIFormattedCheckType The check type for the WMIFormatted monitor. Valid values are 'constant', 'range', 'rateofchange'. This parameter is specific to the 'WMIFormatted' parameter set. .PARAMETER WMIFormattedConstantValue The constant value for the WMIFormatted monitor with 'constant' check type. This parameter is specific to the 'WMIFormatted' parameter set. .PARAMETER WMIFormattedConstantUpIfMatch A switch to mark the monitor up if the constant value matches. Default is $true. This parameter is specific to the 'WMIFormatted' parameter set. .PARAMETER WMIFormattedRangeLowValue The low value for the WMIFormatted monitor with 'range' check type. This parameter is specific to the 'WMIFormatted' parameter set. .PARAMETER WMIFormattedRangeHighValue The high value for the WMIFormatted monitor with 'range' check type. This parameter is specific to the 'WMIFormatted' parameter set. .PARAMETER WMIFormattedROCValue The rate of change value for the WMIFormatted monitor with 'rateofchange' check type. This parameter is specific to the 'WMIFormatted' parameter set. .PARAMETER WMIFormattedROCUpIfAbove A switch to mark the monitor up if the rate of change value is above the specified value. Default is $true. This parameter is specific to the 'WMIFormatted' parameter set. .PARAMETER WMIFormattedPropertyName The property name for the WMIFormatted monitor. This parameter is specific to the 'WMIFormatted' parameter set. .PARAMETER WMIFormattedComputerName The computer name for the WMIFormatted monitor. This parameter is specific to the 'WMIFormatted' parameter set. .NOTES Author: Jason Alberino Date: 2025-04-06 .EXAMPLE Add-WUGActiveMonitor -Type SNMP -Name 20241019-snmpmonitor-test-1-new -SnmpOID 1.3.6.1 -SnmpInstance 1 -SnmpCheckType constant -SnmpValue 9 Description ----------- This command adds an SNMP active monitor named "20241019-snmpmonitor-test-1-new" with the OID "1.3.6.1", instance "1", check type "constant", and value "9". .EXAMPLE Add-WUGActiveMonitor -Type Ping -Name "9999 ping" -PingPayloadSize 9999 -Timeout 10 -Retries 1 Description ----------- This command adds a Ping active monitor named "9999 ping" with a payload size of 9999 bytes, timeout of 10 seconds, and 1 retry. .EXAMPLE Add-WUGActiveMonitor -Type TcpIp -Name TestTCPIpMon-2024-10-19 -Timeout 5 -TcpIpPort 8443 -TcpIpProtocol SSL Description ----------- This command adds a TCP/IP active monitor named "TestTCPIpMon-2024-10-19" with a timeout of 5 seconds, port 8443, and protocol SSL. .EXAMPLE Add-WUGActiveMonitor -Type Certificate -Name Certmontest-byURL-test3 -CertOption url -CertCheckExpires $true -CertExpiresDays 30 -CertPath "https://192.168.1.250" Description ----------- This command adds a Certificate active monitor named "Certmontest-byURL-test3" with the URL option, check expires set to true, expiration days set to 30, and path "https://192.168.1.250". .EXAMPLE Add-WUGActiveMonitor -Type WMIFormatted -Name "AD LDAP Bind Time RangeCheck" -WMIFormattedRelativePath "Win32_PerfFormattedData_NTDS_NTDS" -WMIFormattedPerformanceCounter "LDAP Bind Time (msec)" -WMIFormattedPerformanceInstance "NULL" -WMIFormattedCheckType "range" -WMIFormattedRangeLowValue 0 -WMIFormattedRangeHighValue 200 -WMIFormattedPropertyName "LDAPBindTime" -WMIFormattedComputerName "localhost" Description ----------- This command adds a WMIFormatted active monitor named "AD LDAP Bind Time RangeCheck" with the relative path "Win32_PerfFormattedData_NTDS_NTDS", performance counter "LDAP Bind Time (msec)", performance instance "NULL", check type "range", low value "0", high value "200", property name "LDAPBindTime", and computer name "localhost". #> function Add-WUGActiveMonitor { [CmdletBinding(DefaultParameterSetName = 'Ping')] param( # Common Parameters [Parameter(Mandatory = $true, ParameterSetName = 'Ping')] [Parameter(Mandatory = $true, ParameterSetName = 'TcpIp')] [Parameter(Mandatory = $true, ParameterSetName = 'ConstantOrRate')] [Parameter(Mandatory = $true, ParameterSetName = 'Range')] [Parameter(Mandatory = $true, ParameterSetName = 'Process')] [Parameter(Mandatory = $true, ParameterSetName = 'Certificate')] [Parameter(Mandatory = $true, ParameterSetName = 'Service')] [Parameter(Mandatory = $true, ParameterSetName = 'WMIFormatted')] [ValidateSet('Ping', 'TcpIp', 'SNMP', 'Process', 'Certificate', 'Service', 'WMIFormatted')] [string]$Type, [Parameter(Mandatory = $true)] [string]$Name, # Shared Parameters [Parameter()] [ValidateRange(1, 3600)] [int]$Timeout = 5, [Parameter()] [ValidateRange(1, 5)] [int]$Retries = 1, # Service Monitor Parameters [Parameter(ParameterSetName = 'Service')] [string]$ServiceDisplayName, [Parameter(ParameterSetName = 'Service')] [string]$ServiceInternalName, [Parameter(ParameterSetName = 'Service')] [ValidateSet("true", "false")][string]$ServiceUseSNMP = "false", [Parameter(ParameterSetName = 'Service')] [int]$ServiceSNMPRetries = 1, [Parameter(ParameterSetName = 'Service')] [int]$ServiceSNMPTimeout = 3, [Parameter(ParameterSetName = 'Service')] [int]$ServiceRestartOnFailure = 0, # Ping Monitor Parameters [Parameter(ParameterSetName = 'Ping')] [ValidateRange(1, 65535)] [int]$PingPayloadSize = 32, # TCP/IP Monitor Parameters [Parameter(ParameterSetName = 'TcpIp')] [ValidateRange(1, 65535)] [int]$TcpIpPort, [Parameter(ParameterSetName = 'TcpIp')] [ValidateSet('TCP', 'UDP', 'SSL')] [string]$TcpIpProtocol, [Parameter(ParameterSetName = 'TcpIp')] [string]$TcpIpScript = "", # Certificate Monitor Parameters [Parameter(ParameterSetName = 'Certificate')] [ValidateSet('url', 'file')] [string]$CertOption, [Parameter(ParameterSetName = 'Certificate')] [string]$CertPath, # URL or File Path [Parameter(ParameterSetName = 'Certificate')] [int]$CertExpiresDays = 5, [Parameter(ParameterSetName = 'Certificate')] [ValidateSet("true", "false")][string]$CertCheckUsage = "false", [Parameter(ParameterSetName = 'Certificate')] [ValidateSet("true", "false")][string]$CertCheckExpires = "true", [Parameter(ParameterSetName = 'Certificate')] [ValidateSet("true", "false")][string]$CertUseProxySettings = "false", [Parameter(ParameterSetName = 'Certificate')] [string]$CertProxyServer = "", [Parameter(ParameterSetName = 'Certificate')] [int]$CertProxyPort = 0, [Parameter(ParameterSetName = 'Certificate')] [string]$CertProxyUser = "", [Parameter(ParameterSetName = 'Certificate')] [string]$CertProxyPwd = "", # SNMP Monitor Parameters [Parameter(ParameterSetName = 'ConstantOrRate')] [Parameter(ParameterSetName = 'Range')] [string]$SnmpOID, [Parameter(ParameterSetName = 'ConstantOrRate')] [Parameter(ParameterSetName = 'Range')] [string]$SnmpInstance = "", [Parameter(ParameterSetName = 'ConstantOrRate')] [Parameter(ParameterSetName = 'Range')] [ValidateSet('constant', 'range', 'rateofchange')] [string]$SnmpCheckType, # Parameters for SNMP monitor constant or rateofchange [Parameter(ParameterSetName = 'ConstantOrRate', Mandatory = $true)] [ValidateRange(0, [int]::MaxValue)] [int]$SnmpValue, # Parameters for SNMP monitor range check type [Parameter(ParameterSetName = 'Range', Mandatory = $true)] [ValidateRange(0, [int]::MaxValue)] [int]$SnmpLowValue, [Parameter(ParameterSetName = 'Range', Mandatory = $true)] [ValidateRange(0, [int]::MaxValue)] [int]$SnmpHighValue, # Process Monitor Parameters [Parameter(ParameterSetName = 'Process')] [string]$ProcessName, [Parameter(ParameterSetName = 'Process')] [ValidateSet('true', 'false')][string]$ProcessDownIfRunning = 'false', [Parameter(ParameterSetName = 'Process')] [ValidateSet("true", "false")][string]$ProcessUseWMI = "false", # WMIFormatted Monitor Parameters [Parameter(ParameterSetName = 'WMIFormatted')] [string]$WMIFormattedRelativePath, [Parameter(ParameterSetName = 'WMIFormatted')] [string]$WMIFormattedPerformanceCounter, [Parameter(ParameterSetName = 'WMIFormatted')] [string]$WMIFormattedPerformanceInstance, [Parameter(ParameterSetName = 'WMIFormatted')] [string]$WMIFormattedCheckType, # 'constant', 'range', or 'rateofchange' [Parameter(ParameterSetName = 'WMIFormatted')] [int]$WMIFormattedConstantValue, [Parameter(ParameterSetName = 'WMIFormatted')] [ValidateSet("true", "false")][string]$WMIFormattedConstantUpIfMatch = "true", [Parameter(ParameterSetName = 'WMIFormatted')] [int]$WMIFormattedRangeLowValue, [Parameter(ParameterSetName = 'WMIFormatted')] [int]$WMIFormattedRangeHighValue, [Parameter(ParameterSetName = 'WMIFormatted')] [int]$WMIFormattedROCValue, [Parameter(ParameterSetName = 'WMIFormatted')] [ValidateSet("true", "false")][string]$WMIFormattedROCUpIfAbove = "true", [Parameter(ParameterSetName = 'WMIFormatted')] [string]$WMIFormattedPropertyName, [Parameter(ParameterSetName = 'WMIFormatted')] [string]$WMIFormattedComputerName ) begin { Write-Debug "Initializing Add-WUGActiveMonitor function with Type: $Type" $baseUri = "$($global:WhatsUpServerBaseURI)/api/v1/monitors/-" $ClassId = "" $PropertyBags = @() $skipCreation = $false # Check if the monitor already exists Write-Verbose "Checking if monitor with name '${Name}' already exists." $existingMonitorUri = "$($global:WhatsUpServerBaseURI)/api/v1/monitors/-?type=active&view=details&search=$([uri]::EscapeDataString(${Name}))" try { $existingMonitorResult = Get-WUGAPIResponse -Uri $existingMonitorUri -Method GET -ErrorAction Stop if ($existingMonitorResult.data.activeMonitors | Where-Object { $_.name -eq $Name }) { Write-Host "Monitor with the name '$Name' already exists. Skipping creation." -ForegroundColor Yellow $skipCreation = $true return } } catch { if ($_.Exception.Response.StatusCode -eq 404) { Write-Host "No existing monitor found with the name '$Name'. Proceeding with creation." -ForegroundColor Green } else { Write-Warning "Failed to check for existing monitors: $($_.Exception.Message)" return } } # Monitor-specific setup switch ($Type) { 'Ping' { $ClassId = '2655476e-36b0-455f-9cce-940b6f8e07bf' $PropertyBags = @( @{ "name" = "Timeout"; "value" = "$Timeout" }, @{ "name" = "Retries"; "value" = "$Retries" }, @{ "name" = "PayloadSize"; "value" = "$PingPayloadSize" } ) } 'TcpIp' { $ClassId = '1ee6ecd4-4c17-4ccc-8ff8-3147f445943f' $PropertyBags = @( @{ "name" = "Timeout"; "value" = "$Timeout" }, @{ "name" = "Protocol"; "value" = "$TcpIpProtocol" }, @{ "name" = "Port"; "value" = "$TcpIpPort" }, @{ "name" = "Script"; "value" = "$TcpIpScript" } ) } 'SNMP' { $ClassId = 'd6d02d69-a418-483a-93ea-20dd2af2d135' $SnmpCheckTypeValue = switch ($SnmpCheckType) { 'constant' { 0 } 'range' { 1 } 'rateofchange' { 2 } } if ($SnmpCheckType -eq 'range') { $PropertyBags = @( @{ "name" = "SNMP:CheckType"; "value" = "$SnmpCheckTypeValue" }, @{ "name" = "SNMP:OID"; "value" = "$SnmpOID" }, @{ "name" = "SNMP:Instance"; "value" = "$SnmpInstance" }, @{ "name" = "SNMP:Range-LowValue"; "value" = "$SnmpLowValue" }, @{ "name" = "SNMP:Range-HighValue"; "value" = "$SnmpHighValue" } ) } else { $PropertyBags = @( @{ "name" = "SNMP:CheckType"; "value" = "$SnmpCheckTypeValue" }, @{ "name" = "SNMP:OID"; "value" = "$SnmpOID" }, @{ "name" = "SNMP:Instance"; "value" = "$SnmpInstance" }, @{ "name" = "SNMP:Constant-Value"; "value" = "$SnmpValue" } ) } } 'Process' { $ClassId = '92c56b83-d6a7-43a4-a094-8fe5f8fa4b2c' $ProcessRunningStatus = if ($ProcessDownIfRunning -eq 'true') { 1 } else { 4 } $ProcessThresholdsXml = @" <?xml version="1.0" encoding="utf-16"?> <ProcessThresholds xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <Name>ProcessThresholds</Name> <Thresholds> <Threshold xsi:type="StatusThreshold"> <Checked>true</Checked> <Type>1</Type> <RunningStatus>$ProcessRunningStatus</RunningStatus> </Threshold> </Thresholds> </ProcessThresholds> "@ $PropertyBags = @( @{ "name" = "MonProcess:ProcessName"; "value" = "$ProcessName" }, @{ "name" = "MonProcess:UseWMI"; "value" = "$ProcessUseWMI" }, @{ "name" = "MonProcess:SnmpNumRetries"; "value" = "$Retries" }, @{ "name" = "MonProcess:SnmpTimeoutMs"; "value" = ($Timeout * 1000) }, @{ "name" = "MonProcess:ProcessThresholds"; "value" = $ProcessThresholdsXml.Trim() } ) } 'Certificate' { $ClassId = 'de27943b-b036-4b6d-ae4c-1093b210c233' $PropertyBags = @( @{ "name" = "MonSSLCert:CertificateOption"; "value" = "$CertOption" }, @{ "name" = "MonSSLCert:Path"; "value" = "$CertPath" }, @{ "name" = "MonSSLCert:ExpiresDays"; "value" = "$CertExpiresDays" }, @{ "name" = "MonSSLCert:CheckUsage"; "value" = "$CertCheckUsage" }, @{ "name" = "MonSSLCert:CheckExpires"; "value" = "$CertCheckExpires" }, @{ "name" = "MonSSLCert:Timeout"; "value" = "$Timeout" } ) if ($CertUseProxySettings -eq "true") { $PropertyBags += @( @{ "name" = "MonSSLCert:UseProxySettings"; "value" = "$CertUseProxySettings"}, @{ "name" = "MonSSLCert:ProxyServer"; "value" = "$CertProxyServer" }, @{ "name" = "MonSSLCert:ProxyPort"; "value" = "$CertProxyPort" }, @{ "name" = "MonSSLCert:ProxyUser"; "value" = "$CertProxyUser" }, @{ "name" = "MonSSLCert:ProxyPassword"; "value" = "$CertProxyPwd" } ) } } 'Service' { $ClassId = '20816756-7dd5-4400-adb8-63d9c2147b97' $SNMPFlag = if ($ServiceUseSNMP -eq "true") { 1 } else { 0 } $PropertyBags = @( @{ "name" = "Cred:Type"; "value" = "1,2,4,8" }, @{ "name" = "NTSERVICE:RestartOnFailure"; "value" = "$ServiceRestartOnFailure" }, @{ "name" = "NTSERVICE:ServiceDisplayName"; "value" = "$ServiceDisplayName" }, @{ "name" = "NTSERVICE:ServiceInternalName"; "value" = "$ServiceInternalName" }, @{ "name" = "NTSERVICE:SNMPRetries"; "value" = "$ServiceSNMPRetries" }, @{ "name" = "NTSERVICE:SNMPTimeout"; "value" = "$ServiceSNMPTimeout" }, @{ "name" = "NTSERVICE:UseSNMP"; "value" = "$SNMPFlag" } ) } 'WMIFormatted' { $ClassId = "67a03c83-7166-405d-b9e7-0433b8b81a61" # CLSID for WMIFormatted Monitor # Derive a friendly object name for the display if ($WMIFormattedRelativePath -like "Win32_PerfFormattedData_*_*") { $objectName = $WMIFormattedRelativePath.Substring($WMIFormattedRelativePath.LastIndexOf("_") + 1) } else { $objectName = $WMIFormattedRelativePath } # If no instance is specified (or if user wants "NULL"), we display NULL if (-not $WMIFormattedPerformanceInstance -or $WMIFormattedPerformanceInstance -eq 'NULL') { $actualInstance = 'NULL' } else { $actualInstance = $WMIFormattedPerformanceInstance } # Use a single backslash for Displayname (objectName \ counter) $WMIFormattedDisplayName = "$objectName \ $WMIFormattedPerformanceCounter" # Handle missing numeric parameters cleanly $RangeLowValue = if ($PSBoundParameters.ContainsKey('WMIFormattedRangeLowValue')) { $WMIFormattedRangeLowValue } else { "" } $RangeHighValue = if ($PSBoundParameters.ContainsKey('WMIFormattedRangeHighValue')) { $WMIFormattedRangeHighValue } else { "" } $ConstantValue = if ($PSBoundParameters.ContainsKey('WMIFormattedConstantValue')) { $WMIFormattedConstantValue } else { "" } $ROCValue = if ($PSBoundParameters.ContainsKey('WMIFormattedROCValue')) { $WMIFormattedROCValue } else { "" } # Set CheckType based on input $CheckTypeValue = switch ($WMIFormattedCheckType) { 'constant' { "0" } 'range' { "1" } 'rateofchange' { "2" } } # Determine the ROC-UpIfAboveValue only if using rate-of-change if ($WMIFormattedCheckType -eq 'rateofchange') { # If user provided WMIFormattedROCUpIfAbove, respect it; otherwise default to '0' $ROCUpIfAboveValue = if ($PSBoundParameters.ContainsKey('WMIFormattedROCUpIfAbove')) {if ($WMIFormattedROCUpIfAbove) { "0" } else { "1" }} else {"0"}} else { $ROCUpIfAboveValue = "" } # Determine ConstantUpIfMatchValue (defaults to "0" if not specified) $ConstantUpIfMatchValue = if ($PSBoundParameters.ContainsKey('WMIFormattedConstantUpIfMatch')) { if ($WMIFormattedConstantUpIfMatch) { "0" } else { "1" } } else { "0" } $PropertyBags = @( @{ "name" = "WMI:Formatted-Counter-Displayname"; "value" = $WMIFormattedDisplayName }, @{ "name" = "WMI:Formatted-Counter-InstanceName"; "value" = $actualInstance }, @{ "name" = "WMI:Formatted-Counter-RelativePath"; "value" = $WMIFormattedRelativePath }, @{ "name" = "WMI:Formatted-Credential-Type"; "value" = "8" }, @{ "name" = "WMI:Formatted-Counter-Username"; "value" = "" }, @{ "name" = "WMI:Formatted-Counter-Password"; "value" = "" }, @{ "name" = "WMI:Formatted-Counter-ComputerName"; "value" = $WMIFormattedComputerName }, @{ "name" = "WMI:Formatted-Counter-PropertyName"; "value" = $WMIFormattedPropertyName }, @{ "name" = "WMI:Formatted-Range-LowValue"; "value" = $RangeLowValue }, @{ "name" = "WMI:Formatted-Range-HighValue"; "value" = $RangeHighValue }, @{ "name" = "WMI:Formatted-Rescan-Usage"; "value" = "0" }, @{ "name" = "WMI:Formatted-Counter-CheckType"; "value" = $CheckTypeValue }, @{ "name" = "WMI:Formatted-Constant-Value"; "value" = $ConstantValue }, @{ "name" = "WMI:Formatted-Constant-UpIfMatchValue"; "value" = $ConstantUpIfMatchValue }, @{ "name" = "WMI:Formatted-ROC-Value"; "value" = $ROCValue }, @{ "name" = "WMI:Formatted-ROC-UpIfAboveValue"; "value" = $ROCUpIfAboveValue } ) } } } process { if ($skipCreation) { Write-Host "Skipping monitor creation." -ForegroundColor Yellow return } Write-Verbose "Creating monitor: $Name" $payload = @{ "allowSystemMonitorCreation" = $true "name" = $Name "description" = "$Type Monitor created via Add-WUGActiveMonitor function" "monitorTypeInfo" = @{ "baseType" = "active" "classId" = $ClassId } "propertyBags" = $PropertyBags "useInDiscovery" = $UseInDiscovery } $jsonPayload = $payload | ConvertTo-Json -Compress Write-Verbose "Posting payload: $jsonPayload" try { $result = Get-WUGAPIResponse -Uri $baseUri -Method POST -Body $jsonPayload if ($result.data.successful -eq 1) { Write-Information "Successfully created $Type monitor: $Name" # Check if an ID or other helpful data was returned if ($result.data.idMap) { Write-Debug "New Monitor ID: $($result.data.idMap.resultId)" Write-Output $result.data.idMap.resultId } } else { Write-Warning "Failed to create monitor template." Write-Debug "Full result data: $(ConvertTo-Json $result -Depth 10)" } } catch { Write-Error "Error creating monitor template: $($_.Exception.Message)" Write-Debug "Full exception: $($_.Exception | Format-List * | Out-String)" } } end { Write-Debug "Add-WUGActiveMonitor function completed." } } # SIG # Begin signature block # MIIVvgYJKoZIhvcNAQcCoIIVrzCCFasCAQExDzANBglghkgBZQMEAgEFADB5Bgor # BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG # KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCAzFF8hK0FiJC4T # re81gZMLf4oMCGg9ke5SRDFECqcirqCCEfkwggVvMIIEV6ADAgECAhBI/JO0YFWU # jTanyYqJ1pQWMA0GCSqGSIb3DQEBDAUAMHsxCzAJBgNVBAYTAkdCMRswGQYDVQQI # DBJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAOBgNVBAcMB1NhbGZvcmQxGjAYBgNVBAoM # EUNvbW9kbyBDQSBMaW1pdGVkMSEwHwYDVQQDDBhBQUEgQ2VydGlmaWNhdGUgU2Vy # dmljZXMwHhcNMjEwNTI1MDAwMDAwWhcNMjgxMjMxMjM1OTU5WjBWMQswCQYDVQQG # EwJHQjEYMBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMS0wKwYDVQQDEyRTZWN0aWdv # IFB1YmxpYyBDb2RlIFNpZ25pbmcgUm9vdCBSNDYwggIiMA0GCSqGSIb3DQEBAQUA # A4ICDwAwggIKAoICAQCN55QSIgQkdC7/FiMCkoq2rjaFrEfUI5ErPtx94jGgUW+s # hJHjUoq14pbe0IdjJImK/+8Skzt9u7aKvb0Ffyeba2XTpQxpsbxJOZrxbW6q5KCD # J9qaDStQ6Utbs7hkNqR+Sj2pcaths3OzPAsM79szV+W+NDfjlxtd/R8SPYIDdub7 # P2bSlDFp+m2zNKzBenjcklDyZMeqLQSrw2rq4C+np9xu1+j/2iGrQL+57g2extme # me/G3h+pDHazJyCh1rr9gOcB0u/rgimVcI3/uxXP/tEPNqIuTzKQdEZrRzUTdwUz # T2MuuC3hv2WnBGsY2HH6zAjybYmZELGt2z4s5KoYsMYHAXVn3m3pY2MeNn9pib6q # RT5uWl+PoVvLnTCGMOgDs0DGDQ84zWeoU4j6uDBl+m/H5x2xg3RpPqzEaDux5mcz # mrYI4IAFSEDu9oJkRqj1c7AGlfJsZZ+/VVscnFcax3hGfHCqlBuCF6yH6bbJDoEc # QNYWFyn8XJwYK+pF9e+91WdPKF4F7pBMeufG9ND8+s0+MkYTIDaKBOq3qgdGnA2T # OglmmVhcKaO5DKYwODzQRjY1fJy67sPV+Qp2+n4FG0DKkjXp1XrRtX8ArqmQqsV/ # AZwQsRb8zG4Y3G9i/qZQp7h7uJ0VP/4gDHXIIloTlRmQAOka1cKG8eOO7F/05QID # AQABo4IBEjCCAQ4wHwYDVR0jBBgwFoAUoBEKIz6W8Qfs4q8p74Klf9AwpLQwHQYD # VR0OBBYEFDLrkpr/NZZILyhAQnAgNpFcF4XmMA4GA1UdDwEB/wQEAwIBhjAPBgNV # HRMBAf8EBTADAQH/MBMGA1UdJQQMMAoGCCsGAQUFBwMDMBsGA1UdIAQUMBIwBgYE # VR0gADAIBgZngQwBBAEwQwYDVR0fBDwwOjA4oDagNIYyaHR0cDovL2NybC5jb21v # ZG9jYS5jb20vQUFBQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmwwNAYIKwYBBQUHAQEE # KDAmMCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5jb21vZG9jYS5jb20wDQYJKoZI # hvcNAQEMBQADggEBABK/oe+LdJqYRLhpRrWrJAoMpIpnuDqBv0WKfVIHqI0fTiGF # OaNrXi0ghr8QuK55O1PNtPvYRL4G2VxjZ9RAFodEhnIq1jIV9RKDwvnhXRFAZ/ZC # J3LFI+ICOBpMIOLbAffNRk8monxmwFE2tokCVMf8WPtsAO7+mKYulaEMUykfb9gZ # pk+e96wJ6l2CxouvgKe9gUhShDHaMuwV5KZMPWw5c9QLhTkg4IUaaOGnSDip0TYl # d8GNGRbFiExmfS9jzpjoad+sPKhdnckcW67Y8y90z7h+9teDnRGWYpquRRPaf9xH # +9/DUp/mBlXpnYzyOmJRvOwkDynUWICE5EV7WtgwggYaMIIEAqADAgECAhBiHW0M # UgGeO5B5FSCJIRwKMA0GCSqGSIb3DQEBDAUAMFYxCzAJBgNVBAYTAkdCMRgwFgYD # VQQKEw9TZWN0aWdvIExpbWl0ZWQxLTArBgNVBAMTJFNlY3RpZ28gUHVibGljIENv # ZGUgU2lnbmluZyBSb290IFI0NjAeFw0yMTAzMjIwMDAwMDBaFw0zNjAzMjEyMzU5 # NTlaMFQxCzAJBgNVBAYTAkdCMRgwFgYDVQQKEw9TZWN0aWdvIExpbWl0ZWQxKzAp # BgNVBAMTIlNlY3RpZ28gUHVibGljIENvZGUgU2lnbmluZyBDQSBSMzYwggGiMA0G # CSqGSIb3DQEBAQUAA4IBjwAwggGKAoIBgQCbK51T+jU/jmAGQ2rAz/V/9shTUxjI # ztNsfvxYB5UXeWUzCxEeAEZGbEN4QMgCsJLZUKhWThj/yPqy0iSZhXkZ6Pg2A2NV # DgFigOMYzB2OKhdqfWGVoYW3haT29PSTahYkwmMv0b/83nbeECbiMXhSOtbam+/3 # 6F09fy1tsB8je/RV0mIk8XL/tfCK6cPuYHE215wzrK0h1SWHTxPbPuYkRdkP05Zw # mRmTnAO5/arnY83jeNzhP06ShdnRqtZlV59+8yv+KIhE5ILMqgOZYAENHNX9SJDm # +qxp4VqpB3MV/h53yl41aHU5pledi9lCBbH9JeIkNFICiVHNkRmq4TpxtwfvjsUe # dyz8rNyfQJy/aOs5b4s+ac7IH60B+Ja7TVM+EKv1WuTGwcLmoU3FpOFMbmPj8pz4 # 4MPZ1f9+YEQIQty/NQd/2yGgW+ufflcZ/ZE9o1M7a5Jnqf2i2/uMSWymR8r2oQBM # dlyh2n5HirY4jKnFH/9gRvd+QOfdRrJZb1sCAwEAAaOCAWQwggFgMB8GA1UdIwQY # MBaAFDLrkpr/NZZILyhAQnAgNpFcF4XmMB0GA1UdDgQWBBQPKssghyi47G9IritU # pimqF6TNDDAOBgNVHQ8BAf8EBAMCAYYwEgYDVR0TAQH/BAgwBgEB/wIBADATBgNV # HSUEDDAKBggrBgEFBQcDAzAbBgNVHSAEFDASMAYGBFUdIAAwCAYGZ4EMAQQBMEsG # A1UdHwREMEIwQKA+oDyGOmh0dHA6Ly9jcmwuc2VjdGlnby5jb20vU2VjdGlnb1B1 # YmxpY0NvZGVTaWduaW5nUm9vdFI0Ni5jcmwwewYIKwYBBQUHAQEEbzBtMEYGCCsG # AQUFBzAChjpodHRwOi8vY3J0LnNlY3RpZ28uY29tL1NlY3RpZ29QdWJsaWNDb2Rl # U2lnbmluZ1Jvb3RSNDYucDdjMCMGCCsGAQUFBzABhhdodHRwOi8vb2NzcC5zZWN0 # aWdvLmNvbTANBgkqhkiG9w0BAQwFAAOCAgEABv+C4XdjNm57oRUgmxP/BP6YdURh # w1aVcdGRP4Wh60BAscjW4HL9hcpkOTz5jUug2oeunbYAowbFC2AKK+cMcXIBD0Zd # OaWTsyNyBBsMLHqafvIhrCymlaS98+QpoBCyKppP0OcxYEdU0hpsaqBBIZOtBajj # cw5+w/KeFvPYfLF/ldYpmlG+vd0xqlqd099iChnyIMvY5HexjO2AmtsbpVn0OhNc # WbWDRF/3sBp6fWXhz7DcML4iTAWS+MVXeNLj1lJziVKEoroGs9Mlizg0bUMbOalO # hOfCipnx8CaLZeVme5yELg09Jlo8BMe80jO37PU8ejfkP9/uPak7VLwELKxAMcJs # zkyeiaerlphwoKx1uHRzNyE6bxuSKcutisqmKL5OTunAvtONEoteSiabkPVSZ2z7 # 6mKnzAfZxCl/3dq3dUNw4rg3sTCggkHSRqTqlLMS7gjrhTqBmzu1L90Y1KWN/Y5J # KdGvspbOrTfOXyXvmPL6E52z1NZJ6ctuMFBQZH3pwWvqURR8AgQdULUvrxjUYbHH # j95Ejza63zdrEcxWLDX6xWls/GDnVNueKjWUH3fTv1Y8Wdho698YADR7TNx8X8z2 # Bev6SivBBOHY+uqiirZtg0y9ShQoPzmCcn63Syatatvx157YK9hlcPmVoa1oDE5/ # L9Uo2bC5a4CH2RwwggZkMIIEzKADAgECAhEA6IUbK/8zRw2NKvPg4jKHsTANBgkq # hkiG9w0BAQwFADBUMQswCQYDVQQGEwJHQjEYMBYGA1UEChMPU2VjdGlnbyBMaW1p # dGVkMSswKQYDVQQDEyJTZWN0aWdvIFB1YmxpYyBDb2RlIFNpZ25pbmcgQ0EgUjM2 # MB4XDTIzMDQxOTAwMDAwMFoXDTI2MDcxODIzNTk1OVowVTELMAkGA1UEBhMCVVMx # FDASBgNVBAgMC0Nvbm5lY3RpY3V0MRcwFQYDVQQKDA5KYXNvbiBBbGJlcmlubzEX # MBUGA1UEAwwOSmFzb24gQWxiZXJpbm8wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw # ggIKAoICAQC2JA01BehqpO3INejKVsKScaS9sd0Hjoz1tceFig6Yyu2glTKimH9n # r9l5438Cjpc1x+n42gMfnS5Cza4tZUWr1usOq3d0TljKFOOSW8Uve1J+PC0f/Hxp # DbI8hE38ICDmgv8EozBOgo4lPm/rDHVTHgiRZvy1H8gPTuE13ck2sevVslku2E2F # 8wst5Kb12OqngF96RXptEeM0iTipPhfNinWCa8e58+mbt1dHCbX46593DRd3yQv+ # rvPkIh9QkMGmumfjV5lv1S3iqf/Vg6XP9R3lTPMWNO2IEzIjk12t817rU3xYyf2Q # 4dlA/i1bRpFfjEVcxQiZJdQKnQlqd3hOk0tr8bxTI3RZxgOLRgC8mA9hgcnJmreM # WP4CwXZUKKX13pMqzrX/qiSUsB+Mvcn7LHGEo9pJIBgMItZW4zn4uPzGbf53EQUW # nPfUOSBdgkRAdkb/c7Lkhhc1HNPWlUqzS/tdopI7+TzNsYr7qEckXpumBlUSONoJ # n2V1zukFbgsBq0mRWSZf+ut3OVGo7zSYopsMXSIPFEaBcxNuvcZQXv6YdXEsDpvG # mysbgVa/7uP3KwH9h79WeFU/TiGEISH5B59qTg26+GMRqhyZoYHj7wI36omwSNja # tUo5cYz4AEYTO58gceMcztNO45BynLwPbZwZ0bxPN2wL1ruIYd+ewQIDAQABo4IB # rjCCAaowHwYDVR0jBBgwFoAUDyrLIIcouOxvSK4rVKYpqhekzQwwHQYDVR0OBBYE # FJHuVIzRubayI0tfw82Q7Q/47iu9MA4GA1UdDwEB/wQEAwIHgDAMBgNVHRMBAf8E # AjAAMBMGA1UdJQQMMAoGCCsGAQUFBwMDMEoGA1UdIARDMEEwNQYMKwYBBAGyMQEC # AQMCMCUwIwYIKwYBBQUHAgEWF2h0dHBzOi8vc2VjdGlnby5jb20vQ1BTMAgGBmeB # DAEEATBJBgNVHR8EQjBAMD6gPKA6hjhodHRwOi8vY3JsLnNlY3RpZ28uY29tL1Nl # Y3RpZ29QdWJsaWNDb2RlU2lnbmluZ0NBUjM2LmNybDB5BggrBgEFBQcBAQRtMGsw # RAYIKwYBBQUHMAKGOGh0dHA6Ly9jcnQuc2VjdGlnby5jb20vU2VjdGlnb1B1Ymxp # Y0NvZGVTaWduaW5nQ0FSMzYuY3J0MCMGCCsGAQUFBzABhhdodHRwOi8vb2NzcC5z # ZWN0aWdvLmNvbTAjBgNVHREEHDAagRhqYXNvbi5hbGJlcmlub0BnbWFpbC5jb20w # DQYJKoZIhvcNAQEMBQADggGBAET0EFH0r+hqoQWr4Ha9UDuEv28rTgV2aao1nFRg # GZ/5owM7x9lxappLUbgQFfeIzzAsp3gwTKMYf47njUjvOBZD9zV/3I/vaLmY2enm # MXZ48Om9GW4pNmnvsef2Ub1/+dRzgs8UFX5wBJcfy4OWP3t0OaKJkn+ZltgFF1cu # L/RPiWSRcZuhh7dIWgoPQrVx8BtC8pkh4F5ECxogQnlaDNBzGYf1UYNfEQOFec31 # UK8oENwWx5/EaKFrSi9Y4tu6rkpH0idmYds/1fvqApGxujhvCO4Se8Atfc98icX4 # DWkc1QILREHiVinmoO3smmjB5wumgP45p9OVJXhI0D0gUFQfOSappa5eO2lbnNVG # 90rCsADmVpDDmNt2qPG01luBbX6VtWMP2thjP5/CWvUy6+xfrhlqvwZyZt3SKtuf # FWkqnNWMnmgtBNSmBF5+q8w5SJW+24qrncKJWSIim/nRtC11XnoI9SXlaucS3Nlb # crQVicXOtbhksEqMTn52i8NOfzGCAxswggMXAgEBMGkwVDELMAkGA1UEBhMCR0Ix # GDAWBgNVBAoTD1NlY3RpZ28gTGltaXRlZDErMCkGA1UEAxMiU2VjdGlnbyBQdWJs # aWMgQ29kZSBTaWduaW5nIENBIFIzNgIRAOiFGyv/M0cNjSrz4OIyh7EwDQYJYIZI # AWUDBAIBBQCggYQwGAYKKwYBBAGCNwIBDDEKMAigAoAAoQKAADAZBgkqhkiG9w0B # CQMxDAYKKwYBBAGCNwIBBDAcBgorBgEEAYI3AgELMQ4wDAYKKwYBBAGCNwIBFTAv # BgkqhkiG9w0BCQQxIgQgWQHpOPdhZqURDW6eOKdoGT2ww3AjsGa6DLQya+NcHNkw # DQYJKoZIhvcNAQEBBQAEggIAC6YheLkkCB3Ghm7zfIXJf8kv5TKfJ/Q4WVAAjzPj # cLckaS2UyPPkylHOi/7COFOhy/14H61mGSviNihnE3t98FqHU2aWHrbur1M9k1mt # OaHhJPG7oF5idG7fE27CsWO9IjuPin4rB2bNtScUY+C6BbkolkS/FMJr6pK/2XaX # uTo11SV1JhxEzEe4t4sCn0cs1tab4vj4bvWZL3tN1gouA4GW4ceLjQLFPUQkptFc # NkIQDnX76SF0g3MSAUYFUkw3zYCcmUYsxbUB/2dW0Hg6QQTOIILirG1qrgYGelo5 # 0La1T5Z3/8EmcSZzMJ20dnPeYQUCtWgRn1794N5IBqLTRO8FTmx9PSwTbCKPIGe9 # +9vXYejl5aILf9SIwEpb/4He9KfIzQ+chVl4S1eyHxoYh2rAmNRwDIpK2PwUO6R3 # 7alzH4jbHnHnJLAsVdOFhlJdi/5/+d5UBcL0ahrf3GAYNsvDsjUMh7yWZNEam97w # VW3mvgnAq1UggQmMUyO8ofAJ6QFDU04bsQl3dBhJ2/Tnulyu+kzGaByupfBZIWfN # rmWIx2bpBJZFbZ+0ueFy4AxKJsjS+BnEt1seKMgalMfjDrpM4TnelvwG/SgSG4bG # dVvo85fuDaoXjSZ/daFV2IXGLFohebvRezkdUGLjRR9SXK+YPJVWNixjC6rRsHsl # PXQ= # SIG # End signature block |