-
-
Save kiwi-cam/076acb39aa2dadc28ce873c5ecbf6df5 to your computer and use it in GitHub Desktop.
<# | |
.SYNOPSIS | |
Tests the connection to the supplied host or IP and reports back on changes to its status. | |
.DESCRIPTION | |
This script will check the connection to the supplied hostname or IP address every 5 second's to | |
monitor its status. If the status changes, a message is recorded, the Eventlog is update (optional), and an email is sent | |
to a supplied email address (optional). | |
If a TCPPort parameter is suppied the script will attempt to connect to this port. Otherwise a simple ICMP Ping is used. | |
To end monitoring, press CTRL-C | |
.PARAMETER RemoteHost | |
A String specifying host or IP address you'd like to monitor. You can also specify a TCPport here using host:port syntax. | |
.PARAMETER EmailAddress | |
A String specifying the email address to notify of status changes. If not supplied, or empty, emails are not sent. | |
In order to use this, first edit the script to supply a valid SMTP server, port, and from address. | |
.PARAMETER EventLog | |
If true, status changes are also recorded in the Windows Application EventLog. | |
In order to use this, first run this command at an Administrator Powershell Prompt: | |
> New-EventLog -LogName Application -Source MonitoringConnection | |
.PARAMETER NoNotify | |
If true, status changes will not show up as Windows notifications. | |
.PARAMETER Silent | |
If true, the script will not create any beeps as the status changes. | |
.PARAMETER Pause | |
The number of seconds to wait between tests. Default 5 seconds. | |
.PARAMETER TCPPort | |
If supplied, the script will test a connection to the supplied TCP port. If not supplied a ICMP Ping test is used. | |
.PARAMETER Namespace | |
If supplied, the script will run a query on this WMI Namespace on the supplied Host | |
.PARAMETER Class | |
If supplied, the script will run a query on this WMI Class of the supplied namespace on the supplied Host | |
.PARAMETER WMIProperty | |
The WMI Property to monitor. Any changes in value will be reported | |
.PARAMETER WMIFilter | |
The Filter used to identify the correct result in the WMI query. | |
.EXAMPLE | |
./Start-Monitoring google.com | |
.EXAMPLE | |
./Start-Monitoring -RemoteHost 8.8.8.8 -EmailAddress [email protected] | |
.EXAMPLE | |
./Start-Monitoring -RemoteHost 8.8.8.8 -EmailAddress [email protected] -EventLog $true | |
.EXAMPLE | |
./Start-Monitoring -RemoteHost 8.8.8.8 -TCPPort 53 | |
.EXAMPLE | |
./Start-Monitoring -RemoteHost 8.8.8.8:53 | |
.EXAMPLE | |
./Start-Monitoring -RemoteHost @("www.google.com:443","8.8.8.8:53") | |
.EXAMPLE | |
./Start-Monitoring -RemoteHost WebServer1 -Namespace "root\cimv2" -Class Win32_PerfRawData_APPPOOLCountersProvider_APPPOOLWAS -WMIProperty CurrentApplicationPoolState -WMIFilter "{$_.Name -like 'SLSS'}" | |
.NOTES | |
Version: 1.7 | |
Author: Cameron McConnochie | |
Creation Date: 12 June 2020 | |
Purpose/Change: Added support for host:port format to allow multiple host and port combos to monitor | |
Version: 1.6 | |
Author: Cameron McConnochie | |
Creation Date: 16 Sept 2019 | |
Purpose/Change: Added support for an array of hosts to monitor | |
Version: 1.5 | |
Author: Cameron McConnochie | |
Creation Date: 17 June 2019 | |
Purpose/Change: Added Core compatibility | |
Version: 1.4 | |
Author: Cameron McConnochie | |
Creation Date: 22 March 2019 | |
Purpose/Change: Added WMI monitoring | |
Version: 1.3 | |
Author: Cameron McConnochie | |
Creation Date: 26 Feb 2019 | |
Purpose/Change: Added Validation of the supplied hostname/IP | |
Version: 1.2 | |
Author: Cameron McConnochie | |
Creation Date: 8 Oct 2018 | |
Purpose/Change: Added Notifications | |
Version: 1.1 | |
Author: Cameron McConnochie | |
Creation Date: 10 Aug 2018 | |
Purpose/Change: Added TCP Port monitoring | |
Version: 1.0 | |
Author: Cameron McConnochie | |
Creation Date: 26 July 2018 | |
Purpose/Change: Initial script development | |
#> | |
[CmdletBinding()] | |
Param( | |
[Parameter(Mandatory=$True,Position=1)] | |
[ValidateScript({ | |
if ($_ -like "*:*") { | |
if($_.Split(":")[0] -As [IPAddress] -and $_.Split(":")[1] -As [Int]){ | |
$True | |
}else { | |
if(([System.Net.Dns]::GetHostEntry($_.Split(":")[0])) -and $_.Split(":")[1] -As [Int]){ | |
$True | |
}else{ | |
Throw "$($_) is not a valid IP or hostname. Try again." | |
} | |
} | |
} elseif($_ -As [IPAddress]){ | |
$True | |
} else { | |
if([System.Net.Dns]::GetHostEntry($_)){ | |
$True | |
}else{ | |
Throw "$($_) is not a valid IP or hostname. Try again." | |
} | |
} | |
})] | |
[string[]]$RemoteHost, | |
[Parameter(Mandatory=$False)] | |
[ValidateScript({ | |
if($_ -Match "\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}\b" -or $_ -eq $null){ | |
$True | |
} else { | |
Throw "$($_) is not a valid email address. Try again, or remove this parameter to skip email alerts." | |
} | |
})] | |
[mailaddress]$EmailAddress = $null, | |
[Parameter(Mandatory=$False)] | |
[switch]$EventLog, | |
[Parameter(Mandatory=$False)] | |
[switch]$NoNotify, | |
[Parameter(Mandatory=$False)] | |
[switch]$Silent, | |
[Parameter(Mandatory=$False)] | |
[int32]$Pause = 5, | |
[Parameter(Mandatory=$False, | |
ParameterSetName = 'Port')] | |
[int32]$TCPPort, | |
[Parameter(Mandatory=$true, | |
ParameterSetName = 'WMI')] | |
[string]$Namespace, | |
[Parameter(Mandatory=$true, | |
ParameterSetName = 'WMI')] | |
[string]$Class, | |
[Parameter(Mandatory=$true, | |
ParameterSetName = 'WMI')] | |
[string]$WMIProperty, | |
[Parameter(Mandatory=$False, | |
ParameterSetName = 'WMI')] | |
[scriptblock]$WMIFilter | |
) | |
###### | |
# | |
# SMTP Mail Server Settings, edit these values in order to use email alerts | |
# | |
###### | |
$SMTPServer = "smtp.someopenmailserver.com" | |
$SMTPPort = 25 | |
$SMTPFromAddress = "[email protected]" | |
#Script Starts here... | |
$RemoteHostStatus = 99 #1 = online, 2 = offline, 3 = undefined | |
[string]$WMIPrevious = "99" #Used to identify changes | |
#Error Check | |
#Confirm EventLog Source is configured if required | |
if($EventLog){ | |
try{ | |
[System.Diagnostics.EventLog]::SourceExists("MonitoringConnection") | Out-Null | |
}catch{ | |
throw "In order to record to the EventLog, first run this command at an Administrator Powershell Prompt: `n` | |
> New-EventLog -LogName Application -Source MonitoringConnection" | |
} | |
} | |
if($EmailAddress -ne $null){ | |
if(-not ((Test-NetConnection -ComputerName $SMTPServer -Port $SMTPPort).TcpTestSucceeded)){ | |
throw "Unable to connect to the specified SMTP server. Confirm the settings in this script and retry `n` | |
$($SMTPServer) unreachable on port $($SMTPPort)" | |
} | |
#Clear the progress bar | |
Write-Progress -Activity "Test-NetConnection - $($SMTPServer):$($SMTPPort)" -Completed | |
} | |
#Deal with an Array first | |
If($RemoteHost.Count -gt 1){ | |
Write-Host "Monitoring the connection status of $($RemoteHost)" -ForegroundColor Blue | |
Write-Host " press CTRL-C to stop" -ForegroundColor Blue | |
Write-Host "" | |
Write-Progress -Activity "Monitoring connection status of $($RemoteHost)" -id $PID -Status "..." | |
# Change the default behavior of CTRL-C so that the script can intercept and use it versus just terminating the script. | |
[Console]::TreatControlCAsInput = $True | |
# Sleep for 1 second and then flush the key buffer so any previously pressed keys are discarded and the loop can monitor for the use of | |
# CTRL-C. The sleep command ensures the buffer flushes correctly. | |
Start-Sleep -Seconds 1 | |
$Host.UI.RawUI.FlushInputBuffer() | |
$Jobs = @() | |
$ScriptPath = $MyInvocation.MyCommand.Definition | |
#Shared | |
$ScriptArgs = @{ | |
EventLog = $EventLog | |
NoNotify = $NoNotify | |
Silent = $Silent | |
Pause = $Pause | |
} | |
if($EmailAddress){$ScriptArgs.Add("EmailAddress", $EmailAddress)} | |
#Unique | |
If($TCPPort){ | |
# Port Query | |
if($TCPPort){$ScriptArgs.Add("TCPPort", $TCPPort)} | |
}elseIf($Namespace){ | |
# WMI Query | |
if($Namespace){$ScriptArgs.Add("Namespace",$Namespace)} | |
if($Class){$ScriptArgs.Add("Class",$Class)} | |
if($WMIProperty){$ScriptArgs.Add("WMIProperty",$WMIProperty)} | |
if($WMIFilter){$ScriptArgs.Add("WMIFilter",$WMIFilter)} | |
}else{ | |
# Ping Query | |
} | |
$RemoteHost | ForEach-Object { | |
$Jobs += Start-Job -Name "Monitor-$($_)" -ScriptBlock {param($ScriptPath, $RemoteHost, $ScriptArgs) | |
$ScriptArgs.Add("RemoteHost",$RemoteHost) | |
&$ScriptPath @ScriptArgs | |
} -ArgumentList @($ScriptPath, $_, $ScriptArgs) | |
} | |
While ((Get-Job | Where-Object {$_.Name -like "Monitor-*"}).Count -gt 0) { | |
Receive-Job -Job $Jobs | |
# If a key was pressed during the loop execution, check to see if it was CTRL-C (aka "3"), and if so exit the script after clearing | |
# out any running jobs and setting CTRL-C back to normal. | |
If ($Host.UI.RawUI.KeyAvailable -and ($Key = $Host.UI.RawUI.ReadKey("AllowCtrlC,NoEcho,IncludeKeyUp"))) { | |
If ([Int]$Key.Character -eq 3) { | |
Write-Host "" | |
Write-Warning "CTRL-C was used - Shutting down any running jobs before exiting." | |
Get-Job | Where-Object {$_.Name -like "Monitor-*"} | Remove-Job -Force -Confirm:$False | |
[Console]::TreatControlCAsInput = $False | |
Return | |
} | |
# Flush the key buffer again for the next loop. | |
$Host.UI.RawUI.FlushInputBuffer() | |
} | |
#Add a small pause to ease CPU load | |
Start-Sleep -Milliseconds 200 | |
} | |
} | |
#Extract TCP Port if encoded in Host | |
If ($RemoteHost -like "*:*") { | |
$TCPPort = [Int32]$RemoteHost.Split(":")[1] | |
$RemoteHost = $RemoteHost.Split(":")[0] | |
} | |
If($Host.Name -ne "ServerRemoteHost"){ | |
Write-Host "Monitoring the connection status of $($RemoteHost)" -ForegroundColor Blue | |
Write-Host " press CTRL-C to stop" -ForegroundColor Blue | |
Write-Host "" | |
} | |
#Setup Nofitications | |
If (-not $NoNotify){ | |
$AppId = '{1AC14E77-02E7-4E5D-B744-2EB1AE5198B7}\WindowsPowerShell\v1.0\powershell.exe' | |
$null = [Windows.UI.Notifications.ToastNotificationManager, Windows.UI.Notifications, ContentType = WindowsRuntime] | |
$null = [Windows.Data.Xml.Dom.XmlDocument, Windows.Data.Xml.Dom.XmlDocument, ContentType = WindowsRuntime] | |
$WarningLogo = "$env:TEMP\ToastWarningLogo.png" | |
if (-not (Test-Path $WarningLogo)){ | |
$Logo = "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" | |
[byte[]]$Bytes = [convert]::FromBase64String($Logo) | |
[System.IO.File]::WriteAllBytes($WarningLogo,$Bytes) | |
} | |
$InfoLogo = "$env:TEMP\ToastInfoLogo.png" | |
if (-not (Test-Path $InfoLogo)){ | |
$Logo = "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" | |
[byte[]]$Bytes = [convert]::FromBase64String($Logo) | |
[System.IO.File]::WriteAllBytes($InfoLogo,$Bytes) | |
} | |
} | |
While ($true){ | |
If ($TCPPort){ | |
#This test is used to reduce the timeout - thanks to Jan Doggen: https://superuser.com/questions/805621/test-network-ports-faster-with-powershell | |
$tcpclient = new-Object system.Net.Sockets.TcpClient | |
$iar = $tcpclient.BeginConnect($RemoteHost,$TCPPort,$null,$null) | |
$wait = $iar.AsyncWaitHandle.WaitOne(2000,$false) | |
if(!$wait) | |
{ | |
# Close the connection and report timeout | |
$tcpclient.Close() | |
$Result = $null | |
} | |
else | |
{ | |
# Close the connection and report the error if there is one | |
$error.Clear() | |
Try{ | |
$tcpclient.EndConnect($iar) | out-Null | |
}catch{} | |
if(!$?){ | |
$Result = $null | |
}else{ | |
$Result = "Success" | |
} | |
$tcpclient.Close() | |
} | |
$OKStatus = "listening on $($TCPPort)" | |
$ErStatus = "not listening on $($TCPPort)" | |
}elseif($WMIProperty){ | |
if($Pause -lt 30){ | |
Write-Host "A pause of only $($Pause) between WMI queries will strain the remote host. Adjusting to 30 seconds." | |
$Pause = 30 | |
} | |
$WMIResult = Get-WmiObject -Namespace $Namespace -Class $Class -ComputerName $RemoteHost | |
if($WMIFilter){ | |
$WMIResult = $WMIResult.Where($WMIFilter) | |
} | |
if($WMIResult.Count -gt "1"){ | |
throw "Multiple WMI results found, check you're using a valid filter." | |
}elseif($WMIResult.Count -eq "0"){ | |
$WMIResult = "NotFound" | |
}else{ | |
#If a single result found, update the result to its value | |
$WMIResult = $WMIResult | Select-Object -ExpandProperty $WMIProperty | |
} | |
#Always return a Result of 1, just use the RemoteHostStatus variable to mark it as a different/a change. | |
$Result = 1 | |
if($WMIResult -ne $WMIPrevious){ | |
#No change, Update history value to highlight change | |
$RemoteHostStatus = 0 | |
}else{ | |
#No change, Update history value to highlight change | |
$RemoteHostStatus = 1 | |
} | |
$WMIPrevious = $WMIResult | |
$ErStatus = $OKStatus = "$($WMIProperty) has status $($WMIResult)" | |
}else{ | |
$Result = Test-Connection -Count 1 -ComputerName $RemoteHost -Quiet | |
$OKStatus = "online" | |
$ErStatus = "offline" | |
} | |
If($Result){ | |
#Host is online/good | |
If($RemoteHostStatus -ne 1){ | |
#New Status | |
Write-Host " $($RemoteHost) $($OKStatus) at $(Get-Date -Format G)" -ForegroundColor Green | |
If($Host.Name -ne "ServerRemoteHost"){ $Host.PrivateData.ProgressBackgroundColor='DarkCyan' } | |
Write-Progress -id $PID -Activity " Monitoring connection status of $($RemoteHost)" -Status (Get-Culture).TextInfo.ToTitleCase($OKStatus.ToLower()) | |
If(-not $Silent){ | |
[console]::beep(2000,300) | |
} | |
If(-not $NoNotify){ | |
Write-Debug "Showing notification" | |
$XmlString = @(" | |
<toast duration = 'short'> | |
<visual> | |
<binding template='ToastGeneric'> | |
<text>$($RemoteHost) $($OKStatus)</text> | |
<text>$($RemoteHost) $($OKStatus) at $(Get-Date -Format G)</text> | |
<image src='$InfoLogo' placement='appLogoOverride' hint-crop='circle' /> | |
</binding> | |
</visual> | |
<audio src='ms-winsoundevent:Notification.Default' /> | |
</toast> | |
") | |
$ToastXml = [Windows.Data.Xml.Dom.XmlDocument]::new() | |
$ToastXml.LoadXml($XmlString) | |
$Toast = [Windows.UI.Notifications.ToastNotification]::new($ToastXml) | |
[Windows.UI.Notifications.ToastNotificationManager]::CreateToastNotifier($AppId).Show($Toast) | |
} | |
If($EmailAddress -ne $null){ | |
$Message = "$($RemoteHost) $($OKStatus) at $(Get-Date -Format G)" | |
Send-MailMessage -To $EmailAddress -Body $Message -BodyAsHtml -From $SMTPFromAddress -SmtpServer $SMTPServer -Port $SMTPPort -Subject "$($RemoteHost) $($OKStatus)" | |
} | |
If($EventLog){ | |
Write-EventLog -LogName Application -Source MonitoringConnection -Message "$($RemoteHost) $($OKStatus)" -EventId 8000 -EntryType Information | |
} | |
$RemoteHostStatus = 1 | |
} | |
}else{ | |
#Host is offline/changed | |
If($RemoteHostStatus -ne 0){ | |
#New Status | |
Write-Host " $($RemoteHost) $($ErStatus) at $(Get-Date -Format G)" -ForegroundColor Red | |
If($Host.Name -ne "ServerRemoteHost"){ $Host.PrivateData.ProgressBackgroundColor='Red' } | |
Write-Progress -id $PID -Activity " Monitoring connection status of $($RemoteHost)" -Status (Get-Culture).TextInfo.ToTitleCase($ErStatus.ToLower()) | |
If(-not $Silent){ | |
[console]::beep(500,300) | |
} | |
If($EmailAddress -ne $null){ | |
$Message = "$($RemoteHost) $($ErStatus) at $(Get-Date -Format G)" | |
Send-MailMessage -To $EmailAddress -Body $Message -BodyAsHtml -From $SMTPFromAddress -SmtpServer $SMTPServer -Port $SMTPPort -Subject "$($RemoteHost) $($ErStatus)" | |
} | |
If(-not $NoNotify){ | |
Write-Debug "Showing notification" | |
$XmlString = @(" | |
<toast duration = 'short'> | |
<visual> | |
<binding template='ToastGeneric'> | |
<text>$($RemoteHost) $($ErStatus)</text> | |
<text>$($RemoteHost) $($ErStatus) at $(Get-Date -Format G)</text> | |
<image src='$WarningLogo' placement='appLogoOverride' hint-crop='circle' /> | |
</binding> | |
</visual> | |
<audio src='ms-winsoundevent:Notification.Default' /> | |
</toast> | |
") | |
$ToastXml = [Windows.Data.Xml.Dom.XmlDocument]::new() | |
$ToastXml.LoadXml($XmlString) | |
$Toast = [Windows.UI.Notifications.ToastNotification]::new($ToastXml) | |
[Windows.UI.Notifications.ToastNotificationManager]::CreateToastNotifier($AppId).Show($Toast) | |
} | |
If($EventLog){ | |
Write-EventLog -LogName Application -Source MonitoringConnection -Message "$($RemoteHost) $($ErStatus)" -EventId 8001 -EntryType Warning | |
} | |
$RemoteHostStatus = 0 | |
} | |
} | |
#Pause before trying again | |
Start-Sleep -Seconds $Pause | |
} |
./Start-Monitoring -RemoteHost @("example2.duckdns.net:8001","example1.duckdns.net:8003")
#I added the last line to see what kind of error it recieves
Read-Host -Prompt "Press Enter to exit"
#I tried to add the parameters while only running the script piece by piece. the same error happens.
Hi @Reazin. What's the full error message you're getting, is it this:
Start-Monitoring: Cannot validate argument on parameter 'RemoteHost'. Exception calling "GetHostEntry" with "1" argument(s): "No such host is known."
This is expected behaviour. The script validates the arguments, including confirming that a hostname can be resolved by DNS. The error "No such host is known" just means that it can't find an IP address for the host name you supplied.
Hey @kiwi-cam.
I have checked again and I made a mistake (by not adding a " at a host).
Just a little bit of help I need more. How can I exactly configure the e-mail for this? (I'm not really familiar with this).
Thanks in advance :)
For that you need to know SMTP server settings. You'll need to put your settings into lines 171-173:
$SMTPServer = "smtp.someopenmailserver.com"
$SMTPPort = 25
$SMTPFromAddress = "[email protected]"
For home, using your ISP's mail server settings are going to be the best/easiest option.
Unable to find type [mailaddress]: make sure that the assembly containing this type is loaded.
At D:\psftpMonitoring\Start-Monitoring.ps1:131 char:22
-
[mailaddress] <<<< $EmailAddress = $null,
- CategoryInfo : InvalidOperation: (mailaddress:String) [], ParentContainsErrorRecordException
- FullyQualifiedErrorId : TypeNotFound
Hi Kiwi - I have saved the smtp server details and I am facing above error for $EmailAddress. I gave from email and port 25 as smtp port as inputs
I am running on server 2008 R2
Congrats for the script! Im trying to schedule with params in win10 but it wont work. Is it possible to work?
Can you show me how you’re running the script? I’ll try to reproduce the error here.