Link to home
Start Free TrialLog in
Avatar of Findwise
Findwise

asked on

Task problem for Exchange powershell script

I have created a script that is going to update the mailbox RpcClientAccessServer if a failover occur. This is my first script ever so bear with me on this. The script works great if run from cmd or from run field or powershell of course.

However when I add it as an scheduled task to start with the computer it looks like it freezes on Get-MailboxDatabaseCopyStatus. Can somebody help me with what I'm doing wrong?

I run the scheudled task as: powershell.exe -command "&{C:\Script\FailoverMon.ps1}"

 
Set-PSDebug -Trace 0

$MailTo = "Name <first.lastname@comapny.com>"	# E-mail address where the failover e-mails will be send to
$MailFrom = "IT <irst.lastname@comapny.com"	# E-mail address shown in the from field
$UserName = "username"
$UserPassword = "Password"
$MailDB = "MAILDB"

$MailText = "Failover fix start on server: "
$MailTextEnd = "Failover fix ended on server: "

$secpasswd = ConvertTo-SecureString $UserPassword -AsPlainText -Force
$mycreds = New-Object System.Management.Automation.PSCredential ($UserName, $secpasswd)

$objIPProperties = [System.Net.NetworkInformation.IPGlobalProperties]::GetIPGlobalProperties()
$hostName = "{0}.{1}" -f $objIPProperties.HostName, $objIPProperties.DomainName

$File ="C:\Script\FailoverMon.txt"

$currentSite = [System.DirectoryServices.ActiveDirectory.ActiveDirectorySite]::GetComputerSite().name

# Build Exchange 2010 Powershell session
$Session = New-PSSession -Configurationname Microsoft.Exchange -ConnectionUri "http://$hostName/powershell"
Import-PSSession $Session

Get-Date | Out-File $File
Write-Output "FailoverMon started" | Out-File $File -append 

# The actual function doing all the work
Function Do-Check (){
		If ((Get-MailboxDatabaseCopyStatus).Status -eq "Mounted") {
			Write-Output "Mailbox Mounted!" | Out-File $File -append
			$siteCAS = (Get-ClientAccessArray -Site $currentSite | Format-wide -Property Fqdn -Column 1 | Out-String).TrimStart().TrimEnd()
			$curentCAS = (Get-MailboxDatabase | Format-wide -Property RpcClientAccessServer -Column 1 | Out-String).TrimStart().TrimEnd()
			if ($siteCAS.CompareTo($curentCAS) -eq 0) {
				Write-Output "CAS array is set corectlly" | Out-File $File -append
			} else {
				Write-Output "CAS array is NOT set corectlly!" | Out-File $File -append
				Send-MailMessage -To $MailTo -Subject "Exchange Failover Fix: start" -From $MailFrom -Body ($MailText + $hostName +" ("+$curentCAS+")") -SmtpServer $hostName -Priority High -Credential $mycreds -UseSsl
				Write-Output "Updating array!" | Out-File $File -append
				Set-MailboxDatabase -Identity $MailDB -RpcClientAccessServer $siteCAS
				Get-Mailbox | Update-Recipient
				$newCurentCAS = (Get-MailboxDatabase | Format-wide -Property RpcClientAccessServer -Column 1 | Out-String).TrimStart().TrimEnd()
				Send-MailMessage -To $MailTo -Subject "Exchange Failover Fix: end" -From $MailFrom -Body ($MailTextEnd + $hostName +" ("+$newCurentCAS+")") -SmtpServer $hostName -Priority High -Credential $mycreds -UseSsl
				Write-Output "Updating array: Done" | Out-File $File -append
			}
		} Else {
			Write-Output "Not Mounted!" | Out-File $File -append
		}
	
        Sleep 60
		# Do check again
		Do-Check
}

# Starting the function
Do-Check

Open in new window

ASKER CERTIFIED SOLUTION
Avatar of Dan Arseneau
Dan Arseneau
Flag of Canada image

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
Avatar of Findwise
Findwise

ASKER

Wow that easy. So strange that it worked when I started the script from cmd. However adding your line solved everything. Thanks.

Now hope more people can enjoy this script since I've understood that this something that Microsoft missed. Just place it on both your DAG members and it will automatically switch.
thanks for your help
FYI.  Creating a CAS array negates the need for this.
My dag is cross site. And you can't do this over sites sadly. So when failover occurs to the other site this updates so that all users point to the cas array for that site.