Check out this blog post from Microsoft first. Mine’s mostly based on that but tailored to my specific situation.
We have a CAS server that’s purely for internal admin ECP functions. Managed Availability was running some ActiveSync tests on it and failing (because they don’t exist) with errors like these in SCOM:
1 2 3 4 5 6 7 8 |
ActiveSync is failing on ClientAccess server XXXXX. Incident start time: 7/29/2018 1:54:55 PM Last failed result: Failing Component - EAS Failure Reason - Unknown Reason: 503 <snip> |
So my mission, which I’ve chosen to accept (I saw “Mission Impossible: Fallout” this weekend!) is to disable this. :)
Managed Availability has the concept of health sets. From this page which lists all the health sets in Exchange 2013:
In Managed Availability, each component in Exchange 2013 monitors itself using probes, monitors and responders. Each Exchange 2013 component that implements Managed Availability is referred to as a health set.
So what are the unhealthy health sets on my server?
1 |
Get-HealthReport -Identity <server name> | ?{ $_.AlertValue -ne "Healthy" } |
The result of this in my case are the following:
1 2 3 4 5 6 7 |
Server State HealthSet AlertValue LastTransitionTime MonitorCount ------ ----- --------- ---------- ------------------ ------------ <server> NotApplicable ActiveSync Unhealthy 7/29/2018 2:24:5... 2 <server> Offline ActiveSync.Proxy Unhealthy 4/24/2018 8:55:3... 1 <server> Offline EWS.Proxy Unhealthy 4/24/2018 8:55:4... 1 <server> Offline OAB.Proxy Unhealthy 4/24/2018 8:56:2... 1 <server> NotApplicable EWS Unhealthy 4/25/2018 12:55:... 3 |
So how do I find which monitors in these health sets are failing? The following cmdlet can help:
1 |
Get-ServerHealth <server name> |
I’ll just pipe both cmdlets to get a list of monitors across all unhealthy health sets:
1 |
Get-HealthReport -Identity <server name> | ?{ $_.AlertValue -ne "Healthy" } | %{ Get-ServerHealth -Identity <server name> -HealthSet $_.HealthSet } |
In my case I get:
1 2 3 4 5 6 7 8 9 10 |
Server State Name TargetResource HealthSetName AlertValue ServerComponent ------ ----- ---- -------------- ------------- ---------- --------------- <server> NotApplicable ActiveSyncCTPMonitor ActiveSync ActiveSync Unhealthy None <server> NotApplicable RequestsQueuedGt500Monitor MSExchangeSyncAppPool ActiveSync Healthy None <server> Offline ActiveSyncProxyTestMonitor MSExchangeSyncAppPool ActiveSync.Proxy Unhealthy ActiveSyncProxy <server> Offline EWSProxyTestMonitor MSExchangeServicesAppPool EWS.Proxy Unhealthy EwsProxy <server> Offline OABProxyTestMonitor MSExchangeOABAppPool OAB.Proxy Unhealthy OabProxy <server> NotApplicable EWSCtpMonitor <redacted> EWS Unhealthy None <server> NotApplicable MaintenanceFailureMonitor.EWS EWS Healthy None <server> NotApplicable MaintenanceTimeoutMonitor.EWS EWS Healthy None |
Should probably have filtered to just the unhealthy monitors:
1 |
Get-HealthReport -Identity <server name> | ?{ $_.AlertValue -ne "Healthy" } | %{ Get-ServerHealth -Identity <server name> -HealthSet $_.HealthSet } | ?{ $_.AlertValue -ne "Healthy" } |
Update: Re-reading this later, I realize this is all complicate and wrong. All I really need to do is Get-ServerHealth -Identity <server name>
. I don’t need to loop over each health set.
Anyways, the SCOM error referred to an EAS component, but I don’t see anything with that name. ActiveSyncProxy is probably the one it was referring to?
As an aside, if I want to see the components of a health set (i.e. the monitors, probes, responders) I can do the following:
1 |
Get-MonitoringItemIdentity -Identity <health set name> -Server <server name> | ft Identity,ItemType,TargetResource -AutoSize |
In the case of the ActiveSync.Proxy health set (which has the ActiveSyncProxy component) I can see:
1 2 3 4 5 6 7 8 |
Identity ItemType TargetResource -------- -------- -------------- ActiveSync.Proxy\ActiveSyncProxyTestProbe\MSExchangeSyncAppPool Probe MSExchangeSyncAppPool ActiveSync.Proxy\ActiveSyncProxyTestMonitor\MSExchangeSyncAppPool Monitor MSExchangeSyncAppPool ActiveSync.Proxy\ActiveSyncProxyTestRecycleAppPool\MSExchangeSyncAppPool Responder MSExchangeSyncAppPool ActiveSync.Proxy\ActiveSyncProxyTestOffline\MSExchangeSyncAppPool Responder MSExchangeSyncAppPool ActiveSync.Proxy\ActiveSyncProxyTestOfflineFailedEscalate\MSExchangeSyncAppPool Responder MSExchangeSyncAppPool ActiveSync.Proxy\ActiveSyncProxyTestEscalate\MSExchangeSyncAppPool Responder MSExchangeSyncAppPool |
Note that the ActiveSyncProxyTestMonitor monitor is what was showing as unhealthy earlier.
To disable a monitor I need to use the Add-ServerMonitoringOverride
cmdlet. This is of the format:
1 |
Add-ServerMonitoringOverride -Server <server name> -Identity <HealthSet>\<MonitoringItemName>[\<TargetResource>] -ItemType <Probe | Monitor | Responder | Maintenance> -PropertyName Enabled -PropertyValue 0 |
In my case, to disable ActiveSync.Proxy (health set) ActiveSyncProxyTestMonitor (monitoring item – you can see this in the list of unhealthy monitors as well as in the list above) I do:
1 |
Add-ServerMonitoringOverride -Server <server name> -Identity ActiveSync.Proxy\ActiveSyncProxyTestMonitor -ItemType Monitor -PropertyName Enabled -PropertyValue 0 |
That’s it. Wait a while and now it will appear as disabled.
1 2 3 4 5 6 7 8 9 |
PS> Get-HealthReport -Identity <server> | ?{ $_.alertvalue -ne "Healthy" } | %{ Get-ServerHealth -Identity <server> -HealthSet $_.HealthSet } | ?{ $_.AlertValue -ne "Healthy" } | ft -AutoSize Server State Name TargetResource HealthSetName AlertValue ServerComponent ------ ----- ---- -------------- ------------- ---------- --------------- <server> NotApplicable ActiveSyncCTPMonitor ActiveSync ActiveSync Unhealthy None <server> Offline ActiveSyncProxyTestMonitor MSExchangeSyncAppPool ActiveSync.Proxy Disabled ActiveSyncProxy <server> Offline EWSProxyTestMonitor MSExchangeServicesAppPool EWS.Proxy Unhealthy EwsProxy <server> Offline OABProxyTestMonitor MSExchangeOABAppPool OAB.Proxy Unhealthy OabProxy <server> NotApplicable EWSCtpMonitor <redacted> EWS Unhealthy None |
Next thing is how do I find out why the ActiveSync health set is unhealthy? Let’s take a look at the probes in that:
1 2 3 4 5 6 7 8 9 |
PS>Get-MonitoringItemIdentity -Identity "ActiveSync" -Server ca1exchangeecp | ft Identity,ItemType,TargetResource -autosize Identity ItemType TargetResource -------- -------- -------------- ActiveSync\ActiveSyncCTPProbe\MSExchangeSyncAppPool Probe MSExchangeSyncAppPool ActiveSync\ActiveSyncCTPMonitor\ActiveSync Monitor ActiveSync ActiveSync\RequestsQueuedGt500Monitor\MSExchangeSyncAppPool Monitor MSExchangeSyncAppPool ActiveSync\ActiveSyncCTPEscalate\ActiveSync Responder ActiveSync ActiveSync\RequestsQueuedGt500Escalate\MSExchangeSyncAppPool Responder MSExchangeSyncAppPool |
I can invoke the probe manually using the following cmdlet:
1 |
Invoke-MonitoringProbe <health set name>\<probe name> -Server <server name> |
Pipe this out as a list to read better. Here’s what I did:
1 |
Invoke-MonitoringProbe ActiveSync\ActiveSyncCTPProbe\MSExchangeSyncAppPool -Server <server name> | fl |
The output gives the errors encountered by the tests. I could see that it was related to EAS so decided to disable it too.
Lastly, if you are curious as to what overrides exist the following cmdlet will help:
1 |
Get-ServerMonitoringOverride -Server <server name> |
Also, if you want to double check that a particular component on the Exchange server is inactive (and that’s why monitors are failing) the following cmdlet will help (I sort it by state for easy reading but that’s optional):
1 |
Get-ServerComponentState -Identity <server name> | Sort-Object State |
The last section of the article I referred to at the beginning of this post on editing C:\Program Files\Microsoft\Exchange Server\V15\Bin\Monitoring\Config\ClientAccessProxyTest.xml
to disable certain probes. Not sure why they suggest that instead of disabling probes via the cmdlet – I think that’s because the cmdlets way is more of a temporary thing (for a certain duration) while modify the config file is a permanent fix. I should probably do the config file in my case.