PowerShell cmdlet Get Unhealthy Agents in SCOM

In customer environments where resources are strained and agent health may have degraded over time this PowerShell cmdlet could help identify the agents in your environment that are currently not functioning. This sample cmdlet can verify if unavailable agents are responding to ping and also remotely check if the HealthService is installed, running and whether it is disabled or set to automatic startup. It also remotely gets the last five or six event log errors from the OpsMgr Event log to help with diagnosing agent issues.

Cmdlet gets all agents that are reporting to the specified Management Group (RMS Server) and returns systems that are “Unavailable” and not in maintenance mode. A System in maintenance mode returns unavailable as it is not currently monitoring, so we exclude those systems from the list returned.

This sample cmdlet takes two parameters:

• First parameter is the RMS Server name, example MyRMSServer

• Second parameter is YES or NO, where YES will perform the remote checking via ping and WMI query to get the state of the HealthService. NO will only return the system names

Below are the instructions on how to install this sample cmdlet on Windows Server 2008 R2 64 bit.

I ran this in a test environment and it does not have to run on a RMS or MS to work. It must meet the below requirements in order to run successfully:

• .NET 4.0 Framework

• PowerShell

• SCOM R2 Console (User Interface installed)

• Run as account that has administrative rights to the SCOM Management Group

• When using “YES” for second parameter: Run as account that has admin rights to systems remotely checking HealthService state OR will not return data for HealthService state

Download the ZIP file that contains PowerShell cmdlet dll file and xml help file (GetUnhealthySCOMAgent.dll and UnhealthyAgentCheck.dll-Help.xml) and save to c:\cmdlets.

PowerShell can read from Powershell.exe.config file that adjusts settings PowerShell uses. If the Powershell.exe.config file does not exist in C:\WINDOWS\system32\WindowsPowerShell\v1.0 then create a Powershell.exe.config file in that directory. If the file exists verify that it is similar to below if required add supportedRuntime v4 line to ensure the cmdlet built on v4 of .NET will work.

Copy the contents below into the config file and save:

<?xml version=”1.0″?/> <configuration><startup useLegacyV2RuntimeActivationPolicy=”true><supportedRuntime version=”v4.0.30319″ /> <supportedRuntime version=”v2.0.50727″/> </startup> </configuration>

Open PowerShell and Run as administrator.

Run commands below:

set-alias installutil $env:windir\Microsoft.Net\Framework64\v4.0.30319\installutil

cd c:\cmdlets

installutil .\GetUnhealthySCOMAgent.dll

get-Pssnapin -registered

Verify the cmdlet is displayed in the registered list.

add-pssnapin GetUnhealthySCOMAgentPSSnapin

Get-UnhealthyAgent MMSCOMRMS NO

It is likely that your list is larger than mine, so you may want to pipe results to some file and then copy the contents to excel.

Strings are tab delimited so it will format nicely with a paste into Excel.

Get-UnhealthyAgent MMSCOMRMS YES | out-file c:\cmdlets\output.txt

Then you can open the file and copy and paste to Excel.

NOTE: This is the command line to use if you want to uninstall the cmdlet:

installutil /u .\GetUnhealthySCOMAgent.dll

Cmdlets can help automate many tasks to reduce workload and improve your environments health. Let me know what you think.

Disclaimer: This example is provided “AS IS” with no warranty expressed or implied. Run at your own risk. The opinions and views expressed in this blog are those of the author and do not necessarily state or reflect those of Microsoft.