You may use the following Microsoft Windows PowerShell (.ps1) script to create an HTML file daily that provides an uptime report for the servers in your Information Technology (IT) infrastructure.

 

=====START=====

<######################################################################

# Author : Bhavik Solanki 

# Date : 28th March 2012 

# Version : 1.0

# Desctiption : This script will help to monitor Server availability.

#
######################################################################>

Function GetStatusCode
{
Param([int] $StatusCode)
switch($StatusCode)
{
0 {“Success”}
11001 {“Buffer Too Small”}
11002 {“Destination Net Unreachable”}
11003 {“Destination Host Unreachable”}
11004 {“Destination Protocol Unreachable”}
11005 {“Destination Port Unreachable”}
11006 {“No Resources”}
11007 {“Bad Option”}
11008 {“Hardware Error”}
11009 {“Packet Too Big”}
11010 {“Request Timed Out”}
11011 {“Bad Request”}
11012 {“Bad Route”}
11013 {“TimeToLive Expired Transit”}
11014 {“TimeToLive Expired Reassembly”}
11015 {“Parameter Problem”}
11016 {“Source Quench”}
11017 {“Option Too Big”}
11018 {“Bad Destination”}
11032 {“Negotiating IPSEC”}
11050 {“General Failure”}
default {“Failed”}
}
}

Function GetUpTime
{
param([string] $LastBootTime)
$Uptime = (Get-Date) – [System.Management.ManagementDateTimeconverter]::ToDateTime($LastBootTime)
“Days: $($Uptime.Days); Hours: $($Uptime.Hours); Minutes: $($Uptime.Minutes); Seconds: $($Uptime.Seconds)”
}

#Change value of the following parameter as needed
$OutputFile = “\\server.domain.com\Information Technology Reports\Server Uptime\Server Uptime – ” + $(Get-Date -Format ‘MM_dd_yyyy HH_mm tt’) + “.html”
$ServerList = Get-Content “C:\Scripts\Server_Uptime.txt”

$Result = @()
Foreach($ServerName in $ServerList)
{
$pingStatus = Get-WmiObject -Query “Select * from win32_PingStatus where Address=’$ServerName'”

$Uptime = $null
if($pingStatus.StatusCode -eq 0)
{
$OperatingSystem = Get-WmiObject Win32_OperatingSystem -ComputerName $ServerName -ErrorAction SilentlyContinue
$Uptime = GetUptime( $OperatingSystem.LastBootUpTime )
}

$Result += New-Object PSObject -Property @{
ServerName = $ServerName
IPV4Address = $pingStatus.IPV4Address
Status = GetStatusCode( $pingStatus.StatusCode )
Uptime = $Uptime
}
}

if($Result -ne $null)
{
$HTML = ‘<style type=”text/css”>
#Header{font-family:”Trebuchet MS”, Arial, Helvetica, sans-serif;width:100%;border-collapse:collapse;}
#Header td, #Header th {font-size:14px;border:1px solid #98bf21;padding:3px 7px 2px 7px;}
#Header th {font-size:14px;text-align:left;padding-top:5px;padding-bottom:4px;background-color:#A7C942;color:#fff;}
#Header tr.alt td {color:#000;background-color:#EAF2D3;}
</Style>’

$HTML += “<HTML><BODY><Table border=1 cellpadding=0 cellspacing=0 id=Header>
<TR>
<TH><B>Server Name</B></TH>
<TH><B>IP Address</B></TD>
<TH><B>Status</B></TH>
<TH><B>Uptime</B></TH>
</TR>”
Foreach($Entry in $Result)
{
if($Entry.Status -ne “Success”)
{
$HTML += “<TR bgColor=Red>”
}
else
{
$HTML += “<TR>”
}
$HTML += ”
<TD>$($Entry.ServerName)</TD>
<TD>$($Entry.IPV4Address)</TD>
<TD>$($Entry.Status)</TD>
<TD>$($Entry.Uptime)</TD>
</TR>”
}
$HTML += “</Table></BODY></HTML>”

$HTML | Out-File $OutputFile
}

=====END=====

This script assumes you have a Microsoft Notepad (.txt) file titled Server_Uptime.txt in the C:\Scripts directory that contains the Fully Qualified Domain Name (FQDN) of each server for the report.

Below you may view a sample report. For security reasons, I have removed the FQDN of each server as well as it’s Internet Protocol (IP) address.

Server_Uptime