################################################################################################################ # # # PowerShell script to monitor the IIS process on all servers & send email alerts upon failure & success # # Last Revised By - Alex Alborzfard # # Last Revision Date - 05/20/09 # # Input: A text file with the IP address of all servers in Princeton, one per line # # # ################################################################################################################ # Define Global Variables Param($list = $(Throw "List is required!"),$count=4,$email,[switch]$Verbose) # Test WebDAV service function function Test-WebDav () { param ( $Url = "$( throw 'URL parameter is required.')" ) $xhttp = New-Object -ComObject msxml2.xmlhttp $xhttp.open("OPTIONS", $url, $false) $xhttp.send() if ( $xhttp.getResponseHeader("DAV") ) { $true } else { $false } } foreach ($Url in $MyListOfUrls) { if( test-webdav -url $url ) { DoStuffHere } else { ItBrokeDoSomethingElse } } # Send Email Function function Send-Mail{ Param($msg,$relay,$from,$to,$c,$cc,$subject,[switch]$html,$time) $SmtpClient = new-object system.net.mail.smtpClient $MailMessage = New-Object system.net.mail.mailmessage $SmtpClient.Host = $relay $mailmessage.from = $from $mailmessage.To.add($to) if($cc) { foreach($c in $cc){$mailmessage.CC.add($c)} } $mailmessage.Subject = $subject if($html) { $mailmessage.IsBodyHtml = 1 $mailmessage.Body = $msg } else { $mailmessage.Body = $msg } $smtpclient.Send($mailmessage) } # Check Process on Servers Function function Check-Process { Param([string]$server) $ProcessItems = Get-WmiObject Win32_Process -namespace "root\cimv2" -computername $Server | where {$_.name -like "inetinfo.exe"} if($ProcessItems.statuscode -eq 0) {$true} else {$false} } if($Verbose){$VerbosePreference = "Continue"} $status = @{} $time = Get-Date -format g while($true) { foreach($server in (get-Content $list)) { $x = 0 Write-Verbose "Processing Server $Server" for($i=0;$i -lt 4;$i++) { Write-Verbose " Process Count $i" $result = Check-Process $Server if(!$result) { Write-Verbose ' Process Not Available Upping $x' $x++ if($x -gt 3) { if($status.$Server -ne "Down") { Write-Verbose "Setting Process Status to Down" $Status.$Server = "Down" Send-Mail -msg "Process IIS on Server $Server is down" -relay bb.pharmanet.com -from SrvrMonitor@pharmanet.com -to aalborzfard@pharmanet.com -subject "Process IIS on Server $Server is down at $time" } } } else { if($status.$Server -ne "Up") { Write-Verbose "Setting Process Status to Up" $Status.$Server = "Up" Send-Mail -msg "Process IIS on Server $Server is up" -relay bb.pharmanet.com -from SrvrMonitor@pharmanet.com -to aalborzfard@pharmanet.com -subject "Process IIS on Server $Server is up at $time" } } } } start-Sleep 60 }