PowerShell: Network Device Status Monitor Release 1.0

With this script I set out to generate a status report from a CSV file with a list of network devices and their IP addresses. This script is derived from my Windows Server Status Monitor PowerShell script, with all of the WMI queries removed.

This script is available to download from the Microsoft TechNet Gallery and the PowerShell Gallery.

 

Features and Requirements

The script will do the following:

  • Display the network device name as specified in the CSV file.
  • Display the IP address of the network device name as specified in the CSV file.
  • Display Online/Offline status.
  • Display the response time of the network device.
  • Can be configured to export a CSV file instead of a web page.
  • Can be configured to run and monitor continuously.
  • Can be configured as a one time status report.
  • Can be configured to e-mail the report.

The script has been tested running on Windows 10 and Windows Server 2016, monitoring network devices with IP v4 addresses.

 

CSV File Structure

The structure of the CSV file of the network devices that the script should monitor is as follows: IP,Name

For example:

IP,Name
10.30.1.1,Router
10.30.1.5,NAS
10.30.1.10,Switch 1

 

Generating an encrypted password file

If you’ve used a previous version I’ve changed how the script handles configuring a password for the log notification e-mail. Specifically the password must now be in an encrypted text file. The advantage of this is that the password will no longer be in plain text, which is a security risk. The downside is that you will now need to generate a password file. The command to do this is pretty simple, but it must be generated on the computer the script will be running on, and as the user used to run the script.

To generate the password file, run the following command in PowerShell. When running the command you will be prompted for a username and password, these are the credentials you want to use to authenticate to your SMTP server.

$creds = Get-Credential
$creds.Password | ConvertFrom-SecureString | Set-Content c:\scripts\ps-script-pwd.txt

After running the commands, you should have a text file contained the encrypted password. Enter the path and filename for the -pwd switch to configure authenticated e-mail notification.

 

Configuration

The configuration of the script can be done via command line switches. Here’s a list of all the switches and examples.

Command Line Switch Mandatory Description Example
-list Yes The CSV file with the network devices you wish to check. C:\foo\NetworkDevices.csv
-o Yes The location to store the HTML file. C:\foo
-refresh No The number of seconds the script should wait before refreshing the status.

The minimum refresh period is 300 seconds (5 minutes) and the maximum is 28800 (8 hours).

600
-light No Configure the exported web page to have a light theme. N/A
-csv No Export a CSV file, instead of a web page. N/A
-sendto No The email address to send the report to. me@contoso.com
-from No* The email address that the report should be sent from.

*This switch isn’t mandatory but is required if you wish to email the report.

Server-Status@contoso.com
-smtp No* SMTP server address to use for the email functionality.

*This switch isn’t mandatory but is required if you wish to email the report.

mail01.contoso.com

OR

smtp.live.com

OR

smtp.office365.com

-user No* The username of the account to use for SMTP authentication.

*This switch isn’t mandatory but may be required depending on the configuration of the SMTP server.

example@contoso.com
-pwd No* The location of the file containing the encrypted password of the account to use for SMTP authentication.

*This switch isn’t mandatory but may be required depending on your SMTP server.

 

c:\scripts\ps-script-pwd.txt
-usessl No* Add this option if you wish to use SSL with the configured SMTP server.

Tip: If you wish to send email to outlook.com or office365.com you will need this.

*This switch isn’t mandatory but may be required depending on the configuration of the SMTP server.

N/A

 

Change Log

2018-06-13 Version 1.0

  • First public release.
  • Based off Windows Server Status Monitor Version 1.5 code.

-Mike

Twitter – @Digressive

 

PowerShell Code


<#PSScriptInfo .VERSION 1.0 .GUID ea6c9f59-1659-4ab5-9d2f-8aa26a7d32b9 .AUTHOR Mike Galvin twitter.com/digressive .COMPANYNAME .COPYRIGHT (C) Mike Galvin. All rights reserved. .TAGS Network Device Status Report Monitor .LICENSEURI .PROJECTURI https://gal.vin/2018/06/14/network-device-status .ICONURI .EXTERNALMODULEDEPENDENCIES .REQUIREDSCRIPTS .EXTERNALSCRIPTDEPENDENCIES .RELEASENOTES #>

<# .SYNOPSIS Creates a status report of Network Devices. .DESCRIPTION Creates a status report of Network Devices. This script will: Generate a HTML or CSV status report from a configurable list of network devices. Please note: to send a log file using ssl and an SMTP password you must generate an encrypted password file. The password file is unique to both the user and machine. The command is as follows: $creds = Get-Credential $creds.Password | ConvertFrom-SecureString | Set-Content c:\foo\ps-script-pwd.txt .PARAMETER List The path to a CSV file with a list of IP addresses and device names to monitor separated by a comma. Example: IP,Name 127.0.0.1,localhost .PARAMETER O The path where the HTML or CSV report should be output to. The filename will be NetDev-Status-Report.html/csv. .PARAMETER Refresh The number of seconds that she script should wait before running again. The minimum is 300 seconds (5 minutes) and the maximum is 28800 (8 hours). If not configured the script will run once and then exit. .PARAMETER Light Use a light theme for the web page generated. This setting had no effect on a CSV file report. .PARAMETER Csv Output a CSV file instead of a HTML file for the report. .PARAMETER SendTo The e-mail address the log should be sent to. .PARAMETER From The from address the log should be sent from. .PARAMETER Smtp The DNS or IP address of the SMTP server. .PARAMETER User The user account to connect to the SMTP server. .PARAMETER Pwd The txt file containing the encrypted password for the user account. .PARAMETER UseSsl Connect to the SMTP server using SSL. .EXAMPLE NetDev-Status.ps1 -List C:\foo\networkdevices.csv -O C:\foo -Refresh 300 -Light The script will execute using the list of network devices and output a html report called NetDev-Status-Report.htm to C:\foo. The status of the network devices will refresh every 5 minutes, and the web page will have a light theme instead of a dark theme. #>

## Set up command line switches and what variables they map to
[CmdletBinding()]
Param(
    [Parameter(Mandatory=$True)]
    [Alias("List")]
    [ValidateScript({Test-Path -Path $_ -PathType Leaf})]
    [string]$DeviceFile,
    [Parameter(Mandatory=$True)]
    [Alias("O")]
    [ValidateScript({Test-Path $_ -PathType 'Container'})]
    [string]$OutputPath,
    [Alias("Refresh")]
    [ValidateRange(300,28800)]
    [int]$RefreshTime,
    [switch]$Light,
    [switch]$Csv,
    [Alias("SendTo")]
    [string]$MailTo,
    [Alias("From")]
    [string]$MailFrom,
    [Alias("Smtp")]
    [string]$SmtpServer,
    [Alias("User")]
    [string]$SmtpUser,
    [Alias("Pwd")]
    [string]$SmtpPwd,
    [switch]$UseSsl)

## Begining of the loop. At the bottom of the script the loop is broken if the refresh option is not configured.
Do
{
    ## Setting the location of the CSV file if configured.
    If ($Csv)
    {
        $OutputFile = "$OutputPath\NetDev-Status-Report.csv"
        
        ## If the CSV file already exists, clear it so information is not duplicated.
        $CsvT = Test-Path -Path $OutputFile

        If ($CsvT)
        {
            Clear-Content -Path $OutputFile
        }
    }

    ## If CSV file is not configured, output a HTML report.
    Else
    {
        $OutputFile = "$OutputPath\NetDev-Status-Report.htm"
    }

    ## Settings colours used in HTML report as variables.
    $Green = "00e600"
    $Grey = "e6e6e6"
    $Red = "ff4d4d"
    $Black = "1a1a1a"

    ## Import the CSV file data.
    $DeviceList = Import-Csv -Path $DeviceFile

    ## Creating the Result array.
    $Result = @()

    ## Sort devices in the device list alphabetically based on Name.
    $DeviceList = $DeviceList | Sort-Object -Property Name

    ## This ForEach loop puts offline devices at the top of the list.
    ForEach ($Device in $DeviceList)
    {
        $PingStatus = Test-Connection -ComputerName $Device.IP -Count 1 -Quiet

        If ($PingStatus -eq $False)
        {
            $DevicesOffline += @($Device)
        }

        Else
        {
            $DevicesOnline += @($Device)
        }
    }

    $DeviceListFinal = $DevicesOffline + $DevicesOnline

    ## Ping the devices in the final device list generated above.
    ForEach ($Device in $DeviceListFinal)
    {
        $PingStatus = Test-Connection -ComputerName $Device.IP -Count 1 -Quiet
        
        If ($PingStatus -eq $True)
        {
            $ResponseTime = Test-Connection -ComputerName $Device.IP -Count 1 | Select-Object -ExpandProperty ResponseTime
        }

        ## Put the results together in the array.
        $Result += New-Object PSObject -Property @{
            Status = $PingStatus
            DeviceName = $Device.Name
            DeviceIP = $Device.IP
            ResponseTime = $ResponseTime
	    }

        ## Clear the variables after obtaining and storing the results, otherwise duplicate data is entered.
        If ($DeviceListFinal)
        {
            Clear-Variable DeviceList
        }

        If ($DevicesOffline)
        {
            Clear-Variable DevicesOffline
        }

        If ($DevicesOnline)
        {
            Clear-Variable DevicesOnline
        }

        If ($PingStatus)
        {
            Clear-Variable PingStatus
        }

        If ($ResponseTime)
        {
            Clear-Variable ResponseTime
        }
    }

    ## If the result is not empty, put the report file together.
    If ($Result -ne $null)
    {
        ## If CSV report is specified, output a CSV file.
        If ($Csv)
        {
            ForEach($Entry in $Result)
            {
                If ($Entry.Status -eq $True)
                {
                    Add-Content -Path "$OutputFile" -Value "$($Entry.DeviceIP),$($Entry.DeviceName),Online,$($Entry.ResponseTime) ms"
                }

                Else
                {
                    Add-Content -Path "$OutputFile" -Value "$($Entry.DeviceIP),$($Entry.DeviceName),Offline,N/A"
                }
            }
        }

        ## If a CSV report is not specified, output a HTML file.
        Else
        {
            ## If the light theme is specified, use a lighter css theme.
            If ($Light)
            {
            ## HTML Code goes here! HTML doesn't format properly with PowerShell on WordPress.
            Download the script from TechNet or the PowerShell Gallery to see the complete code!
            }

            ## Output the HTML file
            $HTML | Out-File $OutputFile
        }

        ## If email was configured, set the variables for the email subject and body
        If ($SmtpServer)
        {
            $MailSubject = "Network Device Status Report"
            $MailBody = Get-Content -Path $OutputFile | Out-String

            ## If an email password was configured, create a variable with the username and password
            If ($SmtpPwd)
            {
                $SmtpPwdEncrypt = Get-Content $SmtpPwd | ConvertTo-SecureString
                $SmtpCreds = New-Object System.Management.Automation.PSCredential -ArgumentList ($SmtpUser, $SmtpPwdEncrypt)

                ## If ssl was configured, send the email with ssl
                If ($UseSsl)
                {
                    Send-MailMessage -To $MailTo -From $MailFrom -Subject $MailSubject -Body $MailBody -BodyAsHtml -SmtpServer $SmtpServer -UseSsl -Credential $SmtpCreds
                }

                ## If ssl wasn't configured, send the email without ssl
                Else
                {
                    Send-MailMessage -To $MailTo -From $MailFrom -Subject $MailSubject -Body $MailBody -BodyAsHtml -SmtpServer $SmtpServer -Credential $SmtpCreds
                }
            }

            ## If an email username and password were not configured, send the email without authentication
            Else
            {
                Send-MailMessage -To $MailTo -From $MailFrom -Subject $MailSubject -Body $MailBody -BodyAsHtml -SmtpServer $SmtpServer
            }
        }

        ## If the refresh time option is configured, wait the specifed number of seconds then loop.
        If ($RefreshTime -ne 0)
        {
            Start-Sleep -Seconds $RefreshTime
        }
    }
}

## If the refresh time option is not configured, stop the loop.
Until ($RefreshTime -eq 0)

## End

 

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google+ photo

You are commenting using your Google+ account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

w

Connecting to %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.