I’ve trying create a script that I can run every 15 minutes to verify that a server is online. The script below returns nothing.
test-netconnection -ComputerName test12 -WarningAction SilentlyContinue | Where {$_.PingSucceeded -eq "false"} | Select ComputerName
This doesn't return anything even though "test12" doesn't exist.
Did you check Test-Connection cmdlet ?
Get-Help Test-Connection -Onine
Your where-object is not valid for what you are testing. Use Get-Member to look at your returned object.
PS C:\> Test-NetConnection -computername 8.8.8.8 | Get-Member
TypeName: TestNetConnectionResult
Name MemberType Definition
---- ---------- ----------
Equals Method bool Equals(System.Object obj)
GetHashCode Method int GetHashCode()
GetType Method type GetType()
ToString Method string ToString()
AllNameResolutionResults Property System.Object AllNameResolutionResults {get;set;}
BasicNameResolution Property System.Object BasicNameResolution {get;set;}
ComputerName Property string ComputerName {get;set;}
Detailed Property bool Detailed {get;set;}
DNSOnlyRecords Property System.Object DNSOnlyRecords {get;set;}
InterfaceAlias Property string InterfaceAlias {get;set;}
InterfaceDescription Property string InterfaceDescription {get;set;}
InterfaceIndex Property uint32 InterfaceIndex {get;set;}
IsAdmin Property bool IsAdmin {get;set;}
LLMNRNetbiosRecords Property System.Object LLMNRNetbiosRecords {get;set;}
MatchingIPsecRules Property ciminstance[] MatchingIPsecRules {get;set;}
NameResolutionSucceeded Property bool NameResolutionSucceeded {get;set;}
NetAdapter Property ciminstance NetAdapter {get;set;}
NetRoute Property ciminstance NetRoute {get;set;}
NetworkIsolationContext Property string NetworkIsolationContext {get;set;}
PingReplyDetails Property System.Net.NetworkInformation.PingReply PingReplyDetails {get;set;}
PingSucceeded Property bool PingSucceeded {get;set;}
RemoteAddress Property ipaddress RemoteAddress {get;set;}
RemotePort Property uint32 RemotePort {get;set;}
ResolvedAddresses Property ipaddress[] ResolvedAddresses {get;set;}
SourceAddress Property ciminstance SourceAddress {get;set;}
TcpClientSocket Property System.Net.Sockets.Socket TcpClientSocket {get;set;}
TcpTestSucceeded Property bool TcpTestSucceeded {get;set;}
TraceRoute Property string[] TraceRoute {get;set;}
Notice that “PingSucceeded” is a boolean, not a string. You are doing a string comparison with ‘Where {$_.PingSucceeded -eq “false”}’. You need to compare with an actual false, not string of characters that spell false.
Where {$_.PingSucceeded -eq $false}
Thanks Curtis and Kvprasoon,
I think Test-Connection might work better for me since I need to test more than one server. Command below works by passing “true” or “false”, but I can’t get it to pass the computername thru the pipeline when adding “| select *”
Test-Connection -ComputerName $servers -count 1 -quiet
With -Quiet, it returns boolean. Remove it and use Select-Object Address to get the target computername
Something like below.
if($Ping = Test-Connection -ComputerName $servers -count 1 -ErrorAction SilentlyContinue){
$Pingable = $Ping | Foreach-Object -Process {$_.Address}
"Pinged $($Pingable -join ',')"
}
Ironically, any string is equal to $true:
PS C:\users\js> $true -eq "hi"
True
I don’t like either of those commands, since the timeout is so long. This function times out in 100 milliseconds for down computers.
Function Get-Ping {
Param (
[parameter(ValueFromPipeline)]
[string[]]$Hostname='yahoo.com'
)
Begin {
$Ping = New-Object System.Net.Networkinformation.ping
$Timeout = 100 # ms
}
Process {
$Ping.Send($hostname, $timeout) | Add-Member -passthru hostname $hostname[0] |
select hostname,address,status,roundtriptime
}
}
PS C:\Users\js> echo a010 a011 | get-ping
hostname Address Status RoundtripTime
-------- ------- ------ -------------
a010 172.1.1.1 Success 1
a011 TimedOut 0
All examples work well. Thank you all.
I have written something that I use to monitor ConfigMGR servers in multiple countries due to network teams being nice by blocking access to servers or local staff unplugging servers to save power.
[int]$Width = 44
[int]$Height = 38
$WindowSize = $Host.UI.RawUI.WindowSize
$WindowSize.Width = [Math]::Min($Width, $Host.UI.RawUI.BufferSize.Width)
$WindowSize.Height = $Height
$Host.UI.RawUI.WindowSize = $WindowSize
$host.ui.RawUI.WindowTitle = “WINDOW TITLE”
[int]$keyEscape = 27
$key = $null
$delayMin = 5
while ($key -eq $null -and $key -ne $keyEscape) {
Clear-Host
if (Test-Connection "server 1" -Quiet) {write-host "server friendly name" -ForegroundColor Green} else {write-host "server friendly name" -ForegroundColor Red}
if (Test-Connection "server 2" -Quiet) {write-host "server friendly name" -ForegroundColor Green} else {write-host "server friendly name" -ForegroundColor Red}
if (Test-Connection "server 3" -Quiet) {write-host "server friendly name" -ForegroundColor Green} else {write-host "server friendly name" -ForegroundColor Red}
if (Test-Connection "server 4" -Quiet) {write-host "server friendly name" -ForegroundColor Green} else {write-host "server friendly name" -ForegroundColor Red}
if (Test-Connection "server 5" -Quiet) {write-host "server friendly name" -ForegroundColor Green} else {write-host "server friendly name" -ForegroundColor Red}
Write-host
Write-host
Write-Host "ESC-Exit Enter-Refresh" (" " * 31) -ForegroundColor White -BackgroundColor DarkCyan
$delaySec = $delayMin * 60
Write-Host
$refresh = $false
while ($delaySec -gt 0 -and $refresh -eq $false) {
if (($delaySec % 60) -eq 0) {
Write-Host ($delaySec / 60) -NoNewline -ForegroundColor gray
}
else {
if ( ($delaySec % 10) -eq 0 ) {
Write-Host "." -NoNewline -ForegroundColor gray
}
}
Start-Sleep -Seconds 1
$delaySec--
if ($host.UI.RawUI.KeyAvailable) {
$key = $Host.UI.RawUI.ReadKey("NoEcho, IncludeKeyDown")
#Write-Host "KEY->" $key.VirtualKeyCode
#pause
switch ($key.VirtualKeyCode) {
$keyEscape { $refresh = $true }
default {
Start-Sleep -Milliseconds 500
$host.UI.RawUI.FlushInputBuffer()
$key = $null
$refresh = $true
}
}
}
}
}
Just change the Servers, window title, windows size (or remove that part) and milliseconds before refresh. If you don’t have a static list you can use a AD query to get servers and do a foreach that will do same result (not recommending for anything over 100 servers)
I use the basics of this script as a template for all monitoring so there is irrelevant sections.
Well done Rob. I’ll test it out.
thanks