PowerShell Script to Simulate Outlook Web Access URL User Logon

Recently I came across with a requirement to do user logon synthetic transaction on Outlook Web Access URL and capture its performance. This can be accomplished using Invoke-WebRequest PowerShell command let. The command let returns form elements which needs to be filled with username and password and the login page is invoked with the post data. The output is analyzed for successful login and logon results are returned. 

001002003004005006007008009010011012013014015016017018019020021022023024025026027028029030031032033034035036037038039040041042043044045046047048049050051052053054055056057058059060061062063064065066067068069070071072073074075076077078079080081082083084085086087088089090091092093094095096097098099100101102103104105106107108109110111112113114115116117118119120 #Parameters Block #URL = "https://myserver.mydoamin.com/owa param(  [Parameter(Mandatory=$true)]  $URL,  [Parameter(Mandatory=$true)]  $Domain,  [Parameter(Mandatory=$true)]  $Username,  [Parameter(Mandatory=$true)]  $Password ) #Initialize default values $Result = $False $StatusCode = 0 $Latency = 0 $Username = $Domain + "\" + $Username try{ ######################### #Work around to Trust All Certificates is is from this post add-type @" using System.Net; using System.Security.Cryptography.X509Certificates; public class TrustAllCertsPolicy : ICertificatePolicy { public bool CheckValidationResult( ServicePoint srvPoint, X509Certificate certificate, WebRequest request, int certificateProblem) { return true; } } "@ [System.Net.ServicePointManager]::CertificatePolicy = New-Object TrustAllCertsPolicy #Initialize Stop Watch to calculate the latency. $StopWatch = [system.diagnostics.stopwatch]::startNew() #Invoke the login page $Response = Invoke-WebRequest -Uri $URL -SessionVariable owa #Login Page - Fill Logon Form if ($Response.forms[0].id -eq "logonform") { $Form = $Response.Forms[0] $Form.fields.username= $Username $form.Fields.password= $Password $authpath = "$URL/auth/owaauth.dll" #Login to OWA $Response = Invoke-WebRequest -Uri $authpath -WebSession $owa -Method POST -Body $Form.Fields #SuccessfulLogin if ($Response.forms[0].id -eq "frm") {   #Retrieve Status Code   $StatusCode = $Response.StatusCode   # Logoff Session   $logoff = "$URL/auth/logoff.aspx?Cmd=logoff&src=exch"   $Response = Invoke-WebRequest -Uri $logoff -WebSession $owa   #Calculate Latency   $StopWatch.stop()   $Latency = $StopWatch.Elapsed.TotalSeconds   $Result = $True } #Fill Out Language Form, if it is first login elseif ($Response.forms[0].id -eq "lngfrm") {   $Form = $Response.Forms[0]   #Set Default Values   $Form.Fields.add("lcid",$Response.ParsedHtml.getElementById("selLng").value)   $Form.Fields.add("tzid",$Response.ParsedHtml.getElementById("selTZ").value)   $langpath = "$URL/lang.owa"   $Response = Invoke-WebRequest -Uri $langpath -WebSession $owa -Method $form.Method -Body $form.fields   #Retrieve Status Code   $StatusCode = $Response.StatusCode   # Logoff Session   $logoff = "$URL/auth/logoff.aspx?Cmd=logoff&src=exch"   $Response = Invoke-WebRequest -Uri $logoff -WebSession $owa   #Calculate Latency   $StopWatch.stop()   $Latency = $StopWatch.Elapsed.TotalSeconds   $Result = $True } elseif ($Response.forms[0].id -eq "logonform") {   #We are still in LogonPage   #Retrieve Status Code   $StatusCode = $Response.StatusCode   #Calculate Latency   $StopWatch.stop()   $Latency = $StopWatch.Elapsed.TotalSeconds   $Result = "Failed to logon $username. Check the password or account." } } } #Catch Exception, If any catch {   #Retrieve Status Code   $StatusCode = $Response.StatusCode   if ($StatusCode -notmatch '\d\d\d') {$StatusCode = 0}   #Calculate Latency   $StopWatch.stop()   $Latency = $StopWatch.Elapsed.TotalSeconds   $Result = $_.Exception.Message } #Display Results Write-Host "Status Code: $StatusCode`nResult: $Result`nLatency: $Latency Seconds"

Happy Scripting..