Test-ImapConnectivity Data Source

Microsoft.Exchange2007.TestImapConnectivity.DS (DataSourceModuleType)

Element properties:

TypeDataSourceModuleType
IsolationAny
AccessibilityInternal
RunAsMicrosoft.Exchange2007.Account.LocalSystem
OutputTypeSystem.PropertyBagData

Member Modules:

ID Module Type TypeId RunAs 
DS DataSource Microsoft.Exchange2007.PowerShell.PropertyBag.DS Default

Overrideable Parameters:

IDParameterTypeSelectorDisplay NameDescription
TrustAnySSLCertificatebool$Config/TrustAnySSLCertificate$Trust Any SSL CertificateTrust Any SSL Certificate
PerConnectionTimeoutint$Config/PerConnectionTimeout$Per Connection TimeoutPer Connection Timeout
Timeoutint$Config/Timeout$TimeoutTimeout
IntervalSecondsint$Config/IntervalSeconds$Interval SecondsInterval Seconds
SyncTimestring$Config/SyncTime$Sync TimeSync Time
TimeoutSecondsint$Config/TimeoutSeconds$Timeout SecondsTimeout Seconds

Source Code:

<DataSourceModuleType ID="Microsoft.Exchange2007.TestImapConnectivity.DS" Accessibility="Internal" RunAs="ExLibrary!Microsoft.Exchange2007.Account.LocalSystem" Batching="false">
<Configuration>
<xsd:element minOccurs="1" name="TrustAnySSLCertificate" type="xsd:boolean"/>
<xsd:element minOccurs="1" name="PerConnectionTimeout" type="xsd:integer"/>
<xsd:element minOccurs="1" name="Timeout" type="xsd:integer"/>
<xsd:element minOccurs="1" name="IntervalSeconds" type="xsd:integer"/>
<xsd:element minOccurs="0" name="SyncTime" type="xsd:string"/>
<xsd:element minOccurs="1" name="TimeoutSeconds" type="xsd:integer"/>
</Configuration>
<OverrideableParameters>
<OverrideableParameter ID="TrustAnySSLCertificate" Selector="$Config/TrustAnySSLCertificate$" ParameterType="bool"/>
<OverrideableParameter ID="PerConnectionTimeout" Selector="$Config/PerConnectionTimeout$" ParameterType="int"/>
<OverrideableParameter ID="Timeout" Selector="$Config/Timeout$" ParameterType="int"/>
<OverrideableParameter ID="IntervalSeconds" Selector="$Config/IntervalSeconds$" ParameterType="int"/>
<OverrideableParameter ID="SyncTime" Selector="$Config/SyncTime$" ParameterType="string"/>
<OverrideableParameter ID="TimeoutSeconds" Selector="$Config/TimeoutSeconds$" ParameterType="int"/>
</OverrideableParameters>
<ModuleImplementation Isolation="Any">
<Composite>
<MemberModules>
<DataSource ID="DS" TypeID="ExDiscovery!Microsoft.Exchange2007.PowerShell.PropertyBag.DS">
<ScriptName>TestImapConnectivity</ScriptName>
<ScriptBody><Script>
param ([String] $MailboxServer, [String] $TrustAnySSLCertificate, [Int] $PerConnectionTimeout, [Int] $Timeout)

$SCRIPT_NAME = "TestImapConnectivity"

$ErrorActionPreference = "Stop"

# Event type constants
$EVENT_TYPE_LOG = 0
$EVENT_TYPE_ERROR = 1
$EVENT_TYPE_WARNING = 2
$EVENT_TYPE_INFORMATION = 4

# Typed property bag constants
$PROPERTY_TYPE_ALERT = 0
$PROPERTY_TYPE_EVENT = 1
$PROPERTY_TYPE_PERFORMANCE = 2
$PROPERTY_TYPE_STATE = 3

# State type constants
$STATE_SUCCESS = "Success"
$STATE_WARNING = "Warning"
$STATE_ERROR = "Error"

$momAPI = new-object -comObject MOM.ScriptAPI


# Event ID or Messages
$LOCAL_SYSTEM_SRC = "CheckRunningLocalSystem"
$LOCAL_SYSTEM_ID = 104

# Checks if the script is running under local system account
function CheckRunningLocalSystem
{
$UserWindowsIdentity = [System.Security.Principal.WindowsIdentity]::GetCurrent()
$UserSecurityIdentifier = $UserWindowsIdentity.User
$UserSID = $UserSecurityIdentifier.Value

$UserName = $UserWindowsIdentity.Name

Write-Verbose "The powershell module is running as $UserName"

if ($UserSID -ne "S-1-5-18")
{
$momAPI.LogScriptEvent($LOCAL_SYSTEM_SRC, $LOCAL_SYSTEM_ID, $EVENT_TYPE_ERROR, $SCRIPT_NAME)

Write-Warning "The powershell module is not running as Local System Account"
Exit
}
}


# Enter condition is to have set all four variables: ObjectName CounterName InstanceName and Value
function CreatePerformancePropertyBag
{
param ($ObjectName = $ObjectName, $CounterName = $CounterName, $InstanceName = $InstanceName, $Value = $Value)

if ($ObjectName -eq $null -or $CounterName -eq $null -or $InstanceName -eq $null -or $Value -eq $null)
{
Write-Warning "$SCRIPT_NAME - Performance property is not properly defined"
return
}

$PerformancePropertyBag = $momAPI.CreateTypedPropertyBag($PROPERTY_TYPE_PERFORMANCE)

if ($PerformancePropertyBag -eq $null)
{
Write-Warning "$SCRIPT_NAME - Unable to create performance property bag"
return
}

$PerformancePropertyBag.AddValue('ObjectName', $ObjectName)
Write-Verbose "$SCRIPT_NAME - added performance property bag value for object name $ObjectName"

$PerformancePropertyBag.AddValue('CounterName', $CounterName)
Write-Verbose "$SCRIPT_NAME - added performance property bag value for counter name $CounterName"

$PerformancePropertyBag.AddValue('InstanceName', $InstanceName)
Write-Verbose "$SCRIPT_NAME - added performance property bag value for instance name $InstanceName"

$PerformancePropertyBag.AddValue('Value', $Value)
Write-Verbose "$SCRIPT_NAME - added performance property bag value for value $Value"

# submitting performance property bag
$PerformancePropertyBag

Write-Host "$SCRIPT_NAME - performance property bag returned"
}


# Enter condition is to have set StateProperty variable and Message variable is optional when STATE_SUCCESS
function CreateStatePropertyBag
{
param ($StateProperty = $StateProperty, $Message = $Message)

if ($StateProperty -ne $STATE_SUCCESS -and $StateProperty -ne $STATE_WARNING -and $StateProperty -ne $STATE_ERROR)
{
Write-Warning "$SCRIPT_NAME - State property is not properly defined: $StateProperty"
return
}

$StatePropertyBag = $momAPI.CreateTypedPropertyBag($PROPERTY_TYPE_STATE)

if ($StatePropertyBag -eq $null)
{
Write-Warning "$SCRIPT_NAME - Unable to create state property bag"
return
}

$StatePropertyBag.AddValue('State', $StateProperty)
Write-Verbose "$SCRIPT_NAME - added state property bag value for state $StateProperty"

if ($Message -ne $null)
{
$StatePropertyBag.AddValue('Message', $Message)
Write-Verbose "$SCRIPT_NAME - added state property bag value for message $Message"
}

# Submitting state property bag
$StatePropertyBag

Write-Host "$SCRIPT_NAME - state property bag returned"
}


CheckRunningLocalSystem

Write-Host "$SCRIPT_NAME - Executing Test-ImapConnectivity to $MailboxServer"

$TrustAnySSLCertificateBool = [Boolean]::Parse($TrustAnySSLCertificate)

$ErrorActionPreference = "Continue"

$ImapConnectivity = Test-ImapConnectivity -MailboxServer:$MailboxServer -MonitoringContext:$true -ConnectionType:2 -TrustAnySSLCertificate:$TrustAnySSLCertificateBool -LightMode:$true -Timeout:$Timeout -PerConnectionTimeOut:$PerConnectionTimeOut -ResetTestAccountCredentials:$false

$ErrorActionPreference = "Stop"

Write-Host "$SCRIPT_NAME - Test IMAP Connectivity to $MailboxServer Executed"

if ($ImapConnectivity -eq $null)
{
$StateProperty = $STATE_ERROR
$Message = "Unable to execute Test-ImapConnectivity cmdlet. "

if ($Error[0] -ne $null)
{
$Message = $Message + $Error[0].ToString()
}

Write-Warning "$SCRIPT_NAME - $Message"

CreateStatePropertyBag $StateProperty $Message

exit
}

if ($ImapConnectivity.Count -eq $null)
{
$ImapConnectivityContext = $ImapConnectivity

$StateProperty = $STATE_ERROR
$Message = "Unable to obtain Test-ImapConnectivity result"

Write-Warning "$SCRIPT_NAME - $Message"
}
elseif ($ImapConnectivity.Count -ne 2)
{
$ImapConnectivityCount = $ImapConnectivity.Count
Write-Warning "$SCRIPT_NAME - Test-ImapConnectivity not returning two items but returns: $ImapConnectivityCount"
exit
}
else
{
$ImapConnectivityResult = $ImapConnectivity.Get(0)

if ($ImapConnectivityResult -eq $null)
{
Write-Warning "$SCRIPT_NAME - Unable to return IMAP Connectivity Result"
exit
}

$LatencySeconds = $ImapConnectivityResult.Latency.TotalSeconds

Write-Verbose "$SCRIPT_NAME - Test IMAP Connectivity latency is $LatencySeconds"

$ImapConnectivityContext = $ImapConnectivity.Get(1)

if ($ImapConnectivityContext -eq $null)
{
Write-Warning "$SCRIPT_NAME - Unable to return IMAP Connectivity Monitoring Context"
exit
}

if ($ImapConnectivityResult.EventType.CompareTo([Microsoft.Exchange.Monitoring.EventTypeEnumeration]::Success) -eq 0)
{
$StateProperty = $STATE_SUCCESS

if ($LatencySeconds -gt $Timeout)
{
$StateProperty = $STATE_ERROR
$Message = "Test-ImapConnectivity timed out"

Write-Warning "$SCRIPT_NAME - $Message"
}
}
else
{
$StateProperty = $STATE_ERROR
$Message = $ImapConnectivityResult.Error

Write-Warning "$SCRIPT_NAME - $Message"
}
}

$Events = $ImapConnectivityContext.Events

if ($Events -eq $null -or $Events.Count -eq 0)
{
Write-Warning "$SCRIPT_NAME - no events are retrieved"

$StateProperty = $STATE_ERROR
$Message = "$Message - no events are retrieved"
}
else
{
foreach ($event in $Events)
{
$EventIdentifier = $event.EventIdentifier
$EventMessage = $event.EventMessage

if ($event.EventType.CompareTo([Microsoft.Exchange.Monitoring.EventTypeEnumeration]::Success) -eq 0 -or $event.EventType.CompareTo([Microsoft.Exchange.Monitoring.EventTypeEnumeration]::Information) -eq 0)
{
Write-Host "$SCRIPT_NAME - $EventMessage"
}
else
{
$StateProperty = $STATE_ERROR
$Message = "$Message - $EventIdentifier: $EventMessage"

Write-Warning "$SCRIPT_NAME - Event $EventIdentifier - $EventMessage"
}
}
}

CreateStatePropertyBag $StateProperty $Message

if ($LatencySeconds -le 0)
{
Write-Warning "$SCRIPT_NAME - Latency Second is not retrieved; performance counter data will not be collected."
exit
}

$ObjectName = "MSExchange IMAP Connectivity"
$CounterName = "Logon Latency"
$InstanceName = $MailboxServer
$Value = $LatencySeconds

CreatePerformancePropertyBag $ObjectName $CounterName $InstanceName $Value

</Script></ScriptBody>
<SnapIns>
<SnapIn>Microsoft.Exchange.Management.PowerShell.Admin</SnapIn>
<SnapIn>Microsoft.Exchange.Management.Powershell.Support</SnapIn>
</SnapIns>
<Parameters>
<Parameter>
<Name>MailboxServer</Name>
<Value>$Target/Property[Type='ExLibrary!Microsoft.Exchange2007.Synthetics']/TargetServer$</Value>
</Parameter>
<Parameter>
<Name>TrustAnySSLCertificate</Name>
<Value>$Config/TrustAnySSLCertificate$</Value>
</Parameter>
<Parameter>
<Name>PerConnectionTimeout</Name>
<Value>$Config/PerConnectionTimeout$</Value>
</Parameter>
<Parameter>
<Name>Timeout</Name>
<Value>$Config/Timeout$</Value>
</Parameter>
</Parameters>
<IntervalSeconds>$Config/IntervalSeconds$</IntervalSeconds>
<SyncTime>$Config/SyncTime$</SyncTime>
<TimeoutSeconds>$Config/TimeoutSeconds$</TimeoutSeconds>
</DataSource>
</MemberModules>
<Composition>
<Node ID="DS"/>
</Composition>
</Composite>
</ModuleImplementation>
<OutputType>System!System.PropertyBagData</OutputType>
</DataSourceModuleType>