Summary:
This post describes how to create PowerShell SCOM Console Tasks in XML along three examples.
Introduction:
Console Tasks are executed on the SCOM Management Server. Three examples show how to create them using Visual Studio.
-
Task 1: Displaying a Management Server’s Last-Boot-Time [DisplayLastBootTime]
- Executes a PowerShell script which displays the result in a MessageBox
-
Task 2: Show all new alerts related to selected Computer [ShowNewAlerts]
- Passes the Computer principal name property (aka FQDN) to the script which then uses a GridView to display the alerts
-
Task 3: Listing the top N processes running on a Management Server [ListTopNProcesses]
- An InputBox let the user specify the number (N) of top process on the Management server which is retrieved by script and shown via GridView
Requirements:
This blog assumes that you have created already a management pack before. If not, or if you feel difficulties please visit the section ‘Reading’ and go through the links.
The used software is Visual Studio 2017 (2013 and 2015 should work as well) plus the Visual Studio Authoring Extension. Additionally, the ‘PowerShell Tools for Visual Studio 2017’ are installed.
The Community Edition of Visual Studio technically works. – Please check the license terms in advance. – If you are working for a ‘normal company’ you will most likely require Visual Studio Professional.
Realization:
Initial steps in Visual Studio
à Create a new project based on Management Pack / Operations Manager 2012 R2 Management Pack template.
à Name it SCOM.Custom.ConsoleTasks
à Create a folder named Health Model and a sub folder of it named Tasks
à Add an Empty Management Pack Fragment to the root and name it Project.mpx.
Project File Project.mpx Content:
<ManagementPackFragment SchemaVersion="2.0" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <LanguagePacks> <LanguagePack ID="ENU" IsDefault="true"> <DisplayStrings> <DisplayString ElementID="SCOM.Custom.ConsoleTasks"> <Name>SCOM Custom ConsoleTasks</Name> </DisplayString> </DisplayStrings> </LanguagePack> </LanguagePacks> </ManagementPackFragment>
Your screen should look like this now:
VSAE-ProjectFile.gif
Creating DisplayLastBootTime task
Within the Tasks folder create a class file named ConsoleTasks.mpx and remove all XML insight the file.
ConsoleTasks.mpx firstly only contains the code for the task DisplayLastBootTime and will be successively extended with the other two tasks.
Content of ConsoleTasks.mpx :
<ManagementPackFragment SchemaVersion="2.0" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <Categories> <Category ID ="SCOM.Custom.ConsoleTasks.DisplayLastBootTime.ConsoleTaskCategory" Target="SCOM.Custom.ConsoleTasks.DisplayLastBootTime.ConsoleTask" Value ="System!System.Internal.ManagementPack.ConsoleTasks.MonitoringObject"/> </Categories> <Presentation> <ConsoleTasks> <ConsoleTask ID="SCOM.Custom.ConsoleTasks.DisplayLastBootTime.ConsoleTask" Accessibility="Public" Enabled="true" Target="SC!Microsoft.SystemCenter.RootManagementServer" RequireOutput="false"> <Assembly>SCOM.Custom.ConsoleTasks.DisplayLastBootTime.Assembly</Assembly> <Handler>ShellHandler</Handler> <Parameters> <Argument Name="WorkingDirectory" /> <Argument Name="Application">powershell.exe</Argument> <Argument><![CDATA[-noprofile -Command "& { $IncludeFileContent/Health Model/Tasks/DisplayManagementServerLastBootTime.ps1$ }"]]></Argument> </Parameters> </ConsoleTask> </ConsoleTasks> </Presentation> <LanguagePacks> <LanguagePack ID="ENU" IsDefault="true"> <DisplayStrings> <DisplayString ElementID="SCOM.Custom.ConsoleTasks.DisplayLastBootTime.ConsoleTask"> <Name>Custom Console-Tasks: Display LastBootTime</Name> <Description></Description> </DisplayString> </DisplayStrings> </LanguagePack> </LanguagePacks> <Resources> <Assembly ID ="SCOM.Custom.ConsoleTasks.DisplayLastBootTime.Assembly" Accessibility="Public" FileName ="SCOM.Custom.ConsoleTasks.DisplayLastBootTime.Assembly.File" HasNullStream ="true" QualifiedName ="SCOM.Custom.ConsoleTasks.DisplayLastBootTime.Assembly" /> </Resources> </ManagementPackFragment>
Key points explanation for ConsoleTasks.mpx
Categories
- Category Value specifies that this element is a console task
Presentation
ConsoleTask Target defines against what this task is launched. In this case it’s the Management Server. You can only see the task if you click on a View that is targeting the corresponding class. E.g.:
Console-ManagementServer-Tasks.gif
- Parameters, Argument Name “Application” sets PowerShell.exe to be called for execution
- Parameters, Argument <![CDATA … defines the file within this Visual Studio project that contains the PowerShell code to be processed when the task is launched ( not handled yet ).
LanguagePack
- DisplayString maps the Console Task ID to a text that is more user friendly. This will be shown in the SCOM console
Within the Tasks folder create a PowerShell file named DisplayManagementServerLastBootTime.ps1
Content of DisplayManagementServerLastBootTime.ps1 :
$regPat = '[0-9]{8}' $bootInfo = wmic os get lastbootuptime $bootDateNumber = Select-String -InputObject $bootInfo -Pattern $regPat | Select-Object -ExpandProperty Matches | Select-Object -ExpandProperty Value $bootDate = ([DateTime]::ParseExact($bootDateNumber,'yyyyMMdd',[Globalization.CultureInfo]::InvariantCulture)) $lastBootTime = $bootDate | Get-Date -Format 'yyyy-MM-dd' $null = [System.Reflection.Assembly]::LoadWithPartialName('Microsoft.VisualBasic') $null = [Microsoft.VisualBasic.Interaction]::MsgBox($lastBootTime,0,"""Last Boot time of $($env:COMPUTERNAME)""")
Deploy this Management Pack to the SCOM Server and test it. The following screenshot shows the expected result:
Console-DisplayLastBootTime.gif
Creating ShowNewAlerts task
Keep the content of ConsoleTasks.mpx unchanged. Add the new code into the proper places.
Additional Content for ConsoleTasks.mpx for ShowNewAlerts:
<Category ID ="SCOM.Custom.ConsoleTasks.ShowNewAlerts.ConsoleTaskCategory" Target="SCOM.Custom.ConsoleTasks.ShowNewAlerts.ConsoleTask" Value ="System!System.Internal.ManagementPack.ConsoleTasks.MonitoringObject"/><ConsoleTask ID="SCOM.Custom.ConsoleTasks.ShowNewAlerts.ConsoleTask" Accessibility="Public" Enabled="true" Target="Windows!Microsoft.Windows.Computer" RequireOutput="false"> <Assembly>SCOM.Custom.ConsoleTasks.ShowNewAlerts.Assembly</Assembly> <Handler>ShellHandler</Handler> <Parameters> <Argument Name="WorkingDirectory" /> <Argument Name="Application">powershell.exe</Argument> <Argument><![CDATA[-noprofile -noexit -Command "& { $IncludeFileContent/Health Model/Tasks/ShowNewAlertsForThisComputer.ps1$ }"]]></Argument> <Argument>"$Target/Property[Type='Windows!Microsoft.Windows.Computer']/PrincipalName$"</Argument> </Parameters> </ConsoleTask> <DisplayString ElementID="SCOM.Custom.ConsoleTasks.ShowNewAlerts.ConsoleTask"> <Name>Custom Console-Tasks: Display ShowNewAlertsForThisComputer</Name> <Description></Description> </DisplayString> <Assembly ID ="SCOM.Custom.ConsoleTasks.ShowNewAlerts.Assembly" Accessibility="Public" FileName ="SCOM.Custom.ConsoleTasks.ShowNewAlerts.Assembly.File" HasNullStream ="true" QualifiedName ="SCOM.Custom.ConsoleTasks.ShowNewAlerts.Assembly" />
Key points explanation for ConsoleTasks.mpx for ShowNewAlerts
Categories
- Category Value specifies that this element is a console task
Presentation
- ConsoleTask Target defines against what this task is launched. In this case it’s the Windows Computer. – This task is visible when in a View that shows Computer objects.
- Parameters, Argument Name “Application” sets PowerShell.exe to be called for execution
- Parameters, Argument <![CDATA … defines the file within this Visual Studio project that contains the PowerShell code to be processed when the task is launched ( not handled yet ).
- Parameters, Argument “$Target/Property […]/PrincipalName$” gets the FQDN (principal name attribute) of the selected computer and makes it available for retrieving it in the script.
Content of ShowNewAlertsForThisComputer.ps1 :
param($ComputerName) $allNewAlerts = Get-SCOMAlert | Select-Object -Property Name, Description, MonitoringObjectDisplayName, IsMonitorAlert, ResolutionState, Severity, PrincipalName, TimeRaised | Where-Object {$_.PrincipalName -eq $ComputerName -and $_.ResolutionState -eq '0'} if ($allNewAlerts) { $allNewAlerts | Out-GridView } else { Write-Host 'No new alerts available for the computer: ' + $ComputerName }
Deploy this Management Pack to the SCOM Server and test it. The following screenshot shows the expected result:
Console-ShowNewAlerts
Creating ListTopNProcesses task
Keep the content of ConsoleTasks.mpx unchanged. Add the new code into the proper places.
Additional Content for ConsoleTasks.mpx for ListTopNProcesses:
<Category ID ="SCOM.Custom.ConsoleTasks.ListTopNProcesses.ConsoleTaskCategory" Target="SCOM.Custom.ConsoleTasks.ListTopNProcesses.ConsoleTask" Value ="System!System.Internal.ManagementPack.ConsoleTasks.MonitoringObject"/> <ConsoleTask ID="SCOM.Custom.ConsoleTasks.ListTopNProcesses.ConsoleTask" Accessibility="Public" Enabled="true" Target="SC!Microsoft.SystemCenter.RootManagementServer" RequireOutput="false"> <Assembly>SCOM.Custom.ConsoleTasks.ListTopNProcesses.Assembly</Assembly> <Handler>ShellHandler</Handler> <Parameters> <Argument Name="WorkingDirectory" /> <Argument Name="Application">powershell.exe</Argument> <Argument><![CDATA[-noprofile -noexit -Command "& { $IncludeFileContent/Health Model/Tasks/ListTopNProcesses.ps1$ }"]]></Argument> </Parameters> </ConsoleTask> <DisplayString ElementID="SCOM.Custom.ConsoleTasks.ListTopNProcesses.ConsoleTask"> <Name>Custom Console-Tasks: Display ListTopNProcesses</Name> <Description></Description> </DisplayString> <Assembly ID ="SCOM.Custom.ConsoleTasks.ListTopNProcesses.Assembly" Accessibility="Public" FileName ="SCOM.Custom.ConsoleTasks.ListTopNProcesses.Assembly.File" HasNullStream ="true" QualifiedName ="SCOM.Custom.ConsoleTasks.ListTopNProcesses.Assembly" />
Key points explanation for ConsoleTasks.mpx for ListTopNProcesses
Categories
- Category Value specifies that this element is a console task
Presentation
- ConsoleTask Target defines against what this task is launched. In this case it’s the Windows Computer. – This task is visible when in a View that shows Computer objects.
- Parameters, Argument Name “Application” sets PowerShell.exe to be called for execution
- Parameters, Argument <![CDATA … defines the file within this Visual Studio project that contains the PowerShell code to be processed when the task is launched ( not handled yet ).
Content of ListTopNProcesses.ps1 :
$null = [System.Reflection.Assembly]::LoadWithPartialName('Microsoft.VisualBasic') $receivedValue = [Microsoft.VisualBasic.Interaction]::InputBox("""Enter the number of top processes to be shown""", """List top processes:""", "10") Get-Process | Sort-Object -Property CPU -Descending | Select-Object -First $receivedValue | Out-GridView
Deploy this Management Pack to the SCOM Server and test it. The following screenshot shows the expected result:
Console-ListTopNProcesses.gif
Reading:
If you are new to management pack authoring I suggest the free training material from Brian Wren. – It was made for SCOM 2012 R2 but is still valid until today (current SCOM 1807 in year 2018).
On Microsoft’s Virtual Academy: System Center 2012 R2 Operations Manager Management Pack
On Microsoft’s Wiki: System Center Management Pack Authoring Guide
Closing:
If you have questions, comments or feedback feel free to feedback in our SCOM – Gitter – Community on: https://gitter.im/SCOM-Community/Lobby
The Visual Studio solution file is downloadable here:
Thanks!
Ruben Zimmermann
Know more about Ruben and get in touch with him here:
Ruben Zimmermann (A fantastic person who has a lot of great ideas) [Interview]