How to add custom mandatory properties to SCSM forms


I get asked very often how to make properties on SCSM forms mandatory. It requires customisation of the form concerned and also some C# coding, but it is not too difficult to achieve. In this post, I will show you how to make Description on the Incident Form required as an example.

This example is basically a rework of my post on disabling form controls here. If you used this solution, this will be very easy for you to do :)

Validation in SCSM is done via use of WPF ValidationRules. More on these can be found here.

Firstly, create a new WPF User Control Library in Visual Studio targeting the .NET Framework 3.5:


It is very important to target the 3.5 version of the framework. Your control will not work if you use a newer version!

Add the following references to Service Manager assemblies:


Not all of these are required for this example, but if you want to extend this solution to include adding validation to SCSM controls (such as UserPickers) you will need these.

Add a new folder called “Classes” and a new class called “Validation.cs”:


Replace all of the code in Validation.cs with this:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Controls;
using System.Globalization;

namespace IncidentFormValidationControl.Validation
    public class TextRule : ValidationRule
        public TextRule()

        public override ValidationResult Validate(object value, CultureInfo cultureInfo)
                if (value == null || (string)value == "") return new ValidationResult(false, "");
                return new ValidationResult(false, "");
            return new ValidationResult(true, null);

This defines a simple Validation rule. The variable “value” is checked, if it is null or empty, the rule fails. If it contains some text, the rule succeeds. The SCSM console form framework will automatically enable and disable the OK and Apply buttons based on failed Validation Rules.

Next, remove the default UserControl1 and add a new “UserControl (WPF)” called ValidationControl.xaml using “Right-click\Add\User Control” (this is easier than renaming the existing control):


Select your new control and hit SHIFT-F7 to open the XAML and replace it all with this:

<UserControl x:Class="IncidentFormValidationControl.ValidationControl"
             Width="Auto" Height="Auto" DataContextChanged="FormControl_DataContextChanged" >
    <Grid Height="Auto" Width="Auto">
        <TextBox Height="0" Margin="0,0,0,0" Name="textId" VerticalAlignment="Top" Width="0" Text="{Binding Path=$Id$, Mode=OneWay}" Visibility="Collapsed" />

This defines a simple hidden control with a binding to the main form data context (IDataItem) only.

Now hit F7 to view the code for this control and replace it all with:

/*Custom control to add validation to the SCSM 012 Incident Form
 * Rob Ford 2014

//Standard for .NET 3.5 WPF control
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

using System.ComponentModel;
using System.ComponentModel.Design;

using Microsoft.EnterpriseManagement;
using Microsoft.EnterpriseManagement.Common;
using Microsoft.EnterpriseManagement.Configuration;
using Microsoft.EnterpriseManagement.UI.DataModel;
using Microsoft.EnterpriseManagement.UI.SdkDataAccess;
using Microsoft.EnterpriseManagement.ConsoleFramework;
using Microsoft.EnterpriseManagement.UI.WpfControls;
using Microsoft.EnterpriseManagement.GenericForm;

using IncidentFormValidationControl.Validation;

namespace IncidentFormValidationControl
    public partial class ValidationControl : UserControl
        public ValidationControl()

        private void FormControl_DataContextChanged(object sender, DependencyPropertyChangedEventArgs e)
            if (this.DataContext != null && this.DataContext is IDataItem)
                //Do not add validation if in template mode
                if (!FormUtilities.Instance.IsFormInTemplateMode(this)) ProcessControls();

        private void ProcessControls()
                //Attempt to get the parent TabControl of our custom control
                //There is a TabControl near the top of the tree, we want the one below that
                DependencyObject doParentRoot = GetParentDependancyObject(this, "System.Windows.Controls.TabControl");

                //Did we get the TabControl?
                if (doParentRoot != null)
                    //Now process each TabItem on the tab control
                    foreach (DependencyObject doChild in LogicalTreeHelper.GetChildren(doParentRoot))
                        //Is this a TabItem?
                        if (doChild.GetType().ToString() == "System.Windows.Controls.TabItem")
                            //Process each child on current tab to find ones we want and add validation rules

        //Navigates the Logical tree for passed parent and adds required validation
        private void AddValidation(DependencyObject rootparent)
            //Navigate the logical tree for the children          
            foreach (var rootChild in LogicalTreeHelper.GetChildren(rootparent))
                    if (rootChild is DependencyObject)

                        if (rootChild is TextBox && ((TextBox)rootChild).Name == "IncidentDescription")
                            //Add the rule so that this property is now required
                            TextBox tb = (TextBox)rootChild;
                            TextRule rule = new TextRule();
                            BindingOperations.GetBinding(tb, TextBox.TextProperty).ValidationRules.Add(rule);

                //Process further logical children of this child
                if (rootChild is DependencyObject) AddValidation(rootChild as DependencyObject);

        //Returns specified parent object, if found, if name is empty, then navigate to top
        private DependencyObject GetParentDependancyObject(DependencyObject child, string name)
                //We need the logical tree to get our parent
                DependencyObject parent = LogicalTreeHelper.GetParent(child);
                DependencyObject lastparent = null;

                //Is the parent our specified control?
                if (name != "" && parent.GetType().ToString() == name) return parent;

                //No, process further
                while (parent != null)
                    string s = parent.GetType().ToString();
                    if (s == name && name != "") return parent;
                    parent = LogicalTreeHelper.GetParent(parent);
                    if (parent != null) lastparent = parent;
                //Return results
                if (name != "") return null;
                else return lastparent;
                return null;

This code checks to see if the form is in template mode when the data context changes (FormControl_DataContextChanged), if not, it adds the validation. It is very important to not add validation when in template mode, otherwise, you may not be able to save any templates.

The control navigates on the WPF visual and logical trees to find the parent Tab Control on the form, and then process each Tab Item (ProcessControls) to find controls of the required type (in this case, TextBox) and of the required name (in this case, “IncidentDescription”) and adds the validation rules (AddValidation).

Hit F6 to build your new DLL and copy it somewhere for the next step, creating a Management Pack to customise your Incident form. If you already have a customised Incident Form, jump to the step below that explains how to add this DLL to your Management Pack.

To make this step easier, I have included a complete Management Pack for you:

<ManagementPack ContentReadable="true" SchemaVersion="2.0" OriginalSchemaVersion="1.1" xmlns:xsd="" xmlns:xsl="">
      <Reference Alias="System">
      <Reference Alias="Console">
      <Reference Alias="Alias_14edb292_d724_401a_b2a2_fb0fe0b79b77">
      <Reference Alias="Alias_b95f4b7a_d0ad_4151_a8d1_65504c4a8ae3">
      <Reference Alias="Alias_532d0597_93b6_4ffa_91dc_6f91a9413a4d">
      <Reference Alias="Alias_f9a8dd13_131c_42d2_ad8a_679890dc833a">
      <Reference Alias="Alias_7175ef0f_429a_4777_9a37_15e4fb0d7314">
      <Reference Alias="Alias_d2a776f9_11cf_43f3_97e8_0fb064eca23a">
        <TypeProjection ID="CustomForm_307806ba_d764_4d35_b1b2_c527da8a6f69_TypeProjection" Accessibility="Public" Type="Alias_b95f4b7a_d0ad_4151_a8d1_65504c4a8ae3!System.WorkItem.Incident">
          <Component Path="$Context/Path[Relationship='Alias_b95f4b7a_d0ad_4151_a8d1_65504c4a8ae3!System.WorkItem.IncidentPrimaryOwner']$" Alias="PrimaryOwner" />
          <Component Path="$Context/Path[Relationship='Alias_532d0597_93b6_4ffa_91dc_6f91a9413a4d!System.WorkItemAffectedUser']$" Alias="AffectedUser" />
          <Component Path="$Context/Path[Relationship='Alias_532d0597_93b6_4ffa_91dc_6f91a9413a4d!System.WorkItemAssignedToUser']$" Alias="AssignedUser" />
          <Component Path="$Context/Path[Relationship='Alias_532d0597_93b6_4ffa_91dc_6f91a9413a4d!System.WorkItemCreatedByUser']$" Alias="CreatedByUser" />
          <Component Path="$Context/Path[Relationship='Alias_532d0597_93b6_4ffa_91dc_6f91a9413a4d!System.WorkItem.TroubleTicketClosedByUser']$" Alias="ClosedByUser" />
          <Component Path="$Context/Path[Relationship='Alias_532d0597_93b6_4ffa_91dc_6f91a9413a4d!System.WorkItem.TroubleTicketResolvedByUser']$" Alias="ResolvedByUser" />
          <Component Path="$Context/Path[Relationship='Alias_532d0597_93b6_4ffa_91dc_6f91a9413a4d!System.WorkItem.TroubleTicketHasActionLog']$" Alias="ActionLogs" />
          <Component Path="$Context/Path[Relationship='Alias_532d0597_93b6_4ffa_91dc_6f91a9413a4d!System.WorkItem.TroubleTicketHasUserComment']$" Alias="UserComments" />
          <Component Path="$Context/Path[Relationship='Alias_532d0597_93b6_4ffa_91dc_6f91a9413a4d!System.WorkItem.TroubleTicketHasAnalystComment']$" Alias="AnalystComments" />
          <Component Path="$Context/Path[Relationship='Alias_532d0597_93b6_4ffa_91dc_6f91a9413a4d!System.WorkItem.TroubleTicketHasNotificationLog' TypeConstraint='Alias_532d0597_93b6_4ffa_91dc_6f91a9413a4d!System.WorkItem.TroubleTicket.SmtpNotificationLog']$" Alias="SMTPNotifications" />
          <Component Path="$Context/Path[Relationship='Alias_f9a8dd13_131c_42d2_ad8a_679890dc833a!System.WorkItemContainsActivity']$" Alias="Activities">
            <Component Path="$Context/Path[Relationship='Alias_f9a8dd13_131c_42d2_ad8a_679890dc833a!System.WorkItemContainsActivity' SeedRole='Target']$" Alias="ParentWorkItem" />
            <Component Path="$Context/Path[Relationship='Alias_532d0597_93b6_4ffa_91dc_6f91a9413a4d!System.WorkItemCreatedByUser']$" Alias="ActivityCreatedBy" />
            <Component Path="$Context/Path[Relationship='Alias_532d0597_93b6_4ffa_91dc_6f91a9413a4d!System.WorkItemAssignedToUser']$" Alias="ActivityAssignedTo" />
            <Component Path="$Context/Path[Relationship='Alias_532d0597_93b6_4ffa_91dc_6f91a9413a4d!System.WorkItemAboutConfigItem']$" Alias="ActivityAboutConfigItem" />
          <Component Path="$Context/Path[Relationship='Alias_532d0597_93b6_4ffa_91dc_6f91a9413a4d!System.WorkItemRelatesToWorkItem']$" Alias="RelatedWorkItems">
            <Component Path="$Context/Path[Relationship='Alias_532d0597_93b6_4ffa_91dc_6f91a9413a4d!System.WorkItemAffectedUser']$" Alias="RWIAffectedUser" />
            <Component Path="$Context/Path[Relationship='Alias_532d0597_93b6_4ffa_91dc_6f91a9413a4d!System.WorkItemAssignedToUser']$" Alias="RWIAssignedUser" />
          <Component Path="$Context/Path[Relationship='Alias_532d0597_93b6_4ffa_91dc_6f91a9413a4d!System.WorkItemRelatesToWorkItem' SeedRole='Target']$" Alias="RelatedWorkItemsSource">
            <Component Path="$Context/Path[Relationship='Alias_532d0597_93b6_4ffa_91dc_6f91a9413a4d!System.WorkItemAffectedUser']$" Alias="RWIAffectedUser" />
            <Component Path="$Context/Path[Relationship='Alias_532d0597_93b6_4ffa_91dc_6f91a9413a4d!System.WorkItemAssignedToUser']$" Alias="RWIAssignedUser" />
          <Component Path="$Context/Path[Relationship='Alias_532d0597_93b6_4ffa_91dc_6f91a9413a4d!System.WorkItemAboutConfigItem']$" Alias="AffectedConfigItems" />
          <Component Path="$Context/Path[Relationship='Alias_532d0597_93b6_4ffa_91dc_6f91a9413a4d!System.WorkItemRelatesToConfigItem']$" Alias="RelatedConfigItems" />
          <Component Path="$Context/Path[Relationship='Alias_532d0597_93b6_4ffa_91dc_6f91a9413a4d!System.WorkItemAboutConfigItem' TypeConstraint='System!System.Service']$" Alias="RelatedServiceRequests" />
          <Component Path="$Context/Path[Relationship='Alias_7175ef0f_429a_4777_9a37_15e4fb0d7314!System.EntityLinksToKnowledgeDocument']$" Alias="RelatedKnowledgeArticles" />
          <Component Path="$Context/Path[Relationship='Alias_532d0597_93b6_4ffa_91dc_6f91a9413a4d!System.WorkItemHasFileAttachment']$" Alias="FileAttachments">
            <Component Path="$Context/Path[Relationship='Alias_d2a776f9_11cf_43f3_97e8_0fb064eca23a!System.FileAttachmentAddedByUser']$" Alias="FileAttachmentAddedBy" />
    <Category ID="CustomIncidentForm.Category" Value="Console!Microsoft.EnterpriseManagement.ServiceManager.ManagementPack">
      <!--You must change this value to your own public key token-->
      <Form ID="CustomForm_307806ba_d764_4d35_b1b2_c527da8a6f69" Accessibility="Public" Target="CustomForm_307806ba_d764_4d35_b1b2_c527da8a6f69_TypeProjection" BaseForm="Alias_14edb292_d724_401a_b2a2_fb0fe0b79b77!System.WorkItem.Incident.ConsoleForm" TypeName="Microsoft.EnterpriseManagement.ServiceManager.Incident.Forms.IncidentFormControl">
          <AddControl Parent="UpperGeneralGrid" Assembly="IncidentFormValidationControl" Type="IncidentFormValidationControl.ValidationControl" Left="49.5" Top="458" Right="0" Bottom="0" Row="0" Column="0" />
    <LanguagePack ID="ENU" IsDefault="true">
        <DisplayString ElementID="CustomIncidentForm">
        <DisplayString ElementID="CustomForm_307806ba_d764_4d35_b1b2_c527da8a6f69">
          <Name>Customised Incident Form</Name>
          <Description>Adds additional validation to the Incident Form</Description>
    <Assembly ID="IncidentFormValidationControl.assembly" Accessibility="Public" QualifiedName="IncidentFormValidationControl" FileName="IncidentFormValidationControl.dll" />

If you already have a customised Incident Form, add this line to the end of your “Customization” block:

<AddControl Parent="UpperGeneralGrid" Assembly="IncidentFormValidationControl" Type="IncidentFormValidationControl.ValidationControl" Left="49.5" Top="458" Right="0" Bottom="0" Row="0" Column="0" />

And add the assembly resource for the DLL:

  <Assembly ID="IncidentFormValidationControl.assembly" Accessibility="Public" QualifiedName="IncidentFormValidationControl" FileName="IncidentFormValidationControl.dll" />

Note – how to determine where and how to add such a custom control is explained here.

You must now seal your Management Pack by following these instructions on using fastseal.exe.

You can seal using the Authoring Tool, but sometimes this tool will remove customisations it does not understand, so just be careful and check the results.

You will need to follow the instructions on sealing to change your public key token value for ManagementPackPublicKeyToken if using fastseal.exe. If you are using the AT, you must remove this value by removing this part of the Management Pack category (remove this entire line):


Next, you need to bundle your Management Pack. To do this, follow the instructions part way down on this post.

Now, import your new Management Pack into Service Manager. Sometimes, on certain systems, you might have to restart the Management Server services to pick up MP changes. Restart your SCSM console and open an Incident and now you should see that the Description is required:


Lastly, in order to find the name of the controls you wish to add validation to, use the Authoring Tool to examine the form, select the required control and obtain the control’s name:


That’s it! Now you can use this example to add all the required properties you need.

For different types of control, you may require new Validation Rules, for example, to make a UserPicker required use:

public class UserPickerRule : ValidationRule
    public UserPickerRule()

    public override ValidationResult Validate(object value, CultureInfo cultureInfo)
            if (value == null) return new ValidationResult(false, null);
            return new ValidationResult(true, null);
            return new ValidationResult(false, null);

And adjust the code in AddValidation() to look for your UserPicker:

else if (rootChild is UserPicker && ((UserPicker)rootChild).Name == "userpicker1")
    UserPicker up = (UserPicker)rootChild;
    UserPickerRule rule = new UserPickerRule();
    BindingOperations.GetBinding(up, UserPicker.UserProperty).ValidationRules.Add(rule);

This technique works on any form, you just need to change the control names to look for and the Parent for the AddControl customisation block.

Posted in Code, Management Packs | Tagged , , , | 13 Comments

Cireson Time Tracker app


Anyone familiar with System Center Service Manager will recognise that the above image is taken from the Incident Form. The Resolution tab has an area that allows analysts to record time worked on an Incident.

Strangely, this feature is only included for Incidents. If you want to record analyst time like this for the other Work Item classes, it is impossible.

Or is it?

This is the definition for the Billable Time relationship:

      <RelationshipType ID="System.WorkItemHasBillableTime" Accessibility="Public" Abstract="false" Base="System!System.Membership">
          <Source ID="BillableTime" MinCardinality="0" MaxCardinality="2147483647" Type="System.WorkItem" />
          <Target ID="AppliesToWorkItem" MinCardinality="0" MaxCardinality="2147483647" Type="System.WorkItem.BillableTime" />

This is defined in the Management Pack “System.WorkItem.Library” and the Source type is “System.WorkItem”. Therefore, Billable time is valid for and can be added to any Work Item class.

Take a look at this, the Problem form:


Looks familiar, but how was this done? Easy – import the Cireson Time Tracker app.

What does this app do?

Well, it adds a “Time Worked” console task for most Work Item classes:


This task allows Analysts to immediately enter Time Worked via a view or directly from a form for supported classes:


The app also includes optional default form customisation Management Packs for supported classes:

The supported Work Item classes are:

Release Record
Review Activity
Service Request
Change Request
Manual Activity

If you have not customised these forms, simply import our custom form and you are all done. We supply the snk used to seal these and the original .xml versions so you can extend the forms as needed. Each imported Management Pack adds the Time Worked tab as shown above.

If you have already customised one or more of these forms, this is not a problem as you can very easily add the Time Tracker control to your existing form customisations by adding a new Tab and adding the control to that tab, for example:

    <AddControl Parent="tabControl" Assembly="PresentationFramework, Version=, Culture=neutral, PublicKeyToken=31bf3856ad364e35" Type="System.Windows.Controls.TabItem" Left="401" Top="21" Right="0" Bottom="0" Row="0" Column="0" />
          <PropertyChange Object="TabItem_1" Property="Header">
            <NewValue>[Time Worked]</NewValue>
          <AddControl Parent="Grid_1" Assembly="Cireson.TimeTracker, Version=, Culture=neutral, PublicKeyToken=98ba2176e2a9efbc" Type="Cireson.TimeTracker.Controls.TimeTrackerFormControl" Left="20" Top="20" Right="20" Bottom="20" Row="0" Column="0" />

Or course, you can add the Time Tracker anywhere you like (that doesn’t cause any console strangeness!).

The only other thing you need to do is to make sure that the Type Projection that your existing custom form targets includes the required components with the correctly named aliases:

  <Component Path="$Target/Path[Relationship='WI!System.WorkItemHasBillableTime']$" Alias="BillableTime">
            <Component Path="$Target/Path[Relationship='WI!System.WorkItem.BillableTimeHasWorkingUser']$" Alias="WorkingUser"/>

Simple, another great app from Cireson!

To learn more, click “Cireson” on the header area above or visit

Posted in App, Cireson | Tagged , | 7 Comments

All good things…


Well, it has certainly been some time since I last blogged, I just don’t know where the time goes to!

My MVP renewal was due on the 1st of April (which was yesterday for me) and I have been trying to chase this up as I’d not heard anything about it. So, today, I hear that I have not been renewed for 2014 as the Product Group believe I have not met the grade over the last year, and they are probably right, I have been so busy working on Cireson apps that I’ve had little time to spend on such things. Well, this and the fact that PGI meetings are always at 2am for me in New Zealand :)

I have no passion for “clouds” so I have always found it strange that SCSM is part of “System Centre Cloud and Data Centre Management” but, needless to say, I shall continue working with SCSM, as I have done for the last 4 or more years, ever since I got my hands on the 2010 Beta.

Whether or not I continue with this blog, I don’t know. I started this blog because of my MVP award and now I am no longer an MVP, so I am not sure. However, only last week I met someone who said it has been of great help so you never know!

To all my ex-fellow MVPs, you’re a great bunch and keep up the good work!

Hope to see some of you in Houston (gah!) for TechEd soon!

Posted in Misc | 4 Comments

SLA Caching explained on the new Cireson View Builder


Cireson recently released our new View Builder app, see the press release here.

Amongst other things, this app allows you to add some custom columns to your views, including some that show SLA data:


You can add these columns to any view to automatically show this SLA data like this:


As you can see, I am not very good at meeting my SLAs :)

This data is shown even if you do not target your view to a combination class (type projection) containing the SLA information, the data is pulled automatically behind the scenes for you.

In fact, you shouldn’t target such views to include the SLA data because in this case it will be pulled twice.

However, pulling this data can result in very poor performance, especially on views containing a large number of items or views that are using a large combination class that targets a lot of relationships.

To help with this, you should always target views using a combination class that is the narrowest one possible, that contains only the relationships that you want to display data from. So, using the “Incident (Advanced)” combination class to display Incident data is usually a very poor idea as your view needs to pull the following data for every single Incident:

Incident class data
Work Item is related to Work Item
About Configuration Item
Affected User
Assigned To User
Closed By User
Contains Activity

It you only want to display the Assigned To User and Affected User it is much better to use the “Incident (Typical)” combination class instead, for example.

To especially help with the problem of pulling large amounts of SLA data, the View Builder app caches the SLA data for you based on the following View Builder administration setting:


When you first load such a view, the entire SLA data is loaded as the view items are displayed. Items that are off the screen that you need to scroll down to see do not have their SLA data loaded until you scroll down and make them visible. You will notice a slight pause as you scroll down to view each page of data. So, if you scroll from the first item to last, all of the SLA data is loaded.

This means you can now refresh the view to see new items, scroll up and down and order by columns without having to load the entire SLA data again, until the cache expires.

The caching setting lets you set how old the cache is before pulling the data again. In the above image, I have set this to 2 minutes. This means that SLA data is up to 2 minutes old. You can set this value to meet your SLA needs versus console view performance.

Some people have mentioned that you cannot sort by the custom SLA columns. This is true. And this is the same for the out-of-the-box views that show SLA data (they actually sort on something like Created Date). This is because the view columns need a class property to sort on, and they cannot sort on a value that is returned “behind the scenes” in this way.

Lastly, if you noticed the options for colour coded columns above, here is what they look like:


Don’t worry, the choice of colours can be configured via the admin settings :)

Posted in Cireson | Tagged | 1 Comment

Sit down and hold your jaw closed with one hand before reading this…

…as I don’t want you to end up looking like this:


Ready? Good! Now read on…


I have some amazing and exciting news that I can hardly believe myself!

Travis “Service Manager” Wright is leaving Microsoft to join the team at Cireson!

For those of you who don’t know what Travis looks like (is there anyone?!) here is his photo:

Travis Wright

At Microsoft, Travis was a Principal Program Manager on the Windows Server & System Center engineering team.

A very BIG welcome to the team, Travis!

Here is the official press release from Cireson:

Microsoft’s Travis Wright Joins Cireson as Partner, and Director of Product Management 

SAN DIEGO, Sept. 25TH, 2013  

Today, Cireson makes official the news that Travis Wright, a long time Microsoft Principal Program Manager behind System Center Operations Manager and Service Manager, as well as a beloved figure in the community, will join the Cireson team as an integral part of the company’s growth. Wright leaves Microsoft after 11 years of dedicated work and many outstanding accomplishments, which include the first versions of Microsoft Operations Manager 2000, major redesigns for Operations Manager 2005, and 2007/R2 and Service Manager 2010 and 2012. His new role brings about considerable excitement for both parties, as they feel this synergy will prove to be a critical inflection point in the company’s growth and global expansion. 

Making the big move to such an energetic, committed, and passionate team, Travis Wright sees great potential for the future, and comments on this landmark career move, saying, “I wouldn’t be leaving Microsoft after so many great years if I didn’t truly believe that Cireson was such an exceptional company with amazing people and tremendous opportunity.  Cireson’s products and services take System Center to the next level.” He also looks forward to the high level of collaboration, innovation, and development that will come with working alongside such a talented group of people.  

Partners Paul Sutton and Shaun Ericson welcome Wright as Partner and Director of Product Management, who will focus on managing the product development of Cireson’s market leading Service Manager apps and will continue to be deeply involved with the System Center community.  

Remarking on this momentous addition, Ericson and Sutton reveal, “We are extremely happy that Travis is joining the Cireson Management Team as we continue our rapid growth by taking System Center and Asset Management to new heights. Travis is a very well known, visionary leader in the user and product experience of System Center. We look forward to working with Travis to enhance Cireson’s app offerings for our over 500 customers and the greater System Center community.” 

The excitement that surrounds this announcement will be the first in a number of developments regarding major news for the company as they continue their role as industry leaders. Furthering the tone of great progress witnessed over the last year including record growth, enhanced app features, and new products such as the upcoming Self-Service Portal, Cireson wholeheartedly welcomes Wright with big ideas and even greater plans for the future.  

For individuals interested in learning more about this big announcement, Travis will be hosting a webinar, scheduled October 2nd at 09:30am US Pacific / 12:30pm US Eastern  /18:30 Europe – to discuss his reasons for joining Cireson, the future of Service Manager, and how Cireson will be at the forefront of this strategy. Register here: 

More information regarding Cireson’s leading apps and services can be found at Join the conversation on Twitter @teamcireson, as well as on Facebook, Google Plus, and LinkedIn. 

Media Contact

Jacqueline Lage  Cireson (541) 513-6191


Posted in Cireson | 6 Comments

SCSM view editor does not support criteria using a decimal data type


Suppose you have a custom class and you added a property with a decimal data type. If you create a view from the SCSM console and try to add criteria that includes this property, the view will fail.

I will use the Software Asset class from the Cireson Asset Management solution as an example:


Here I am creating a simple view that will show all Software Assets where Cost (decimal) is greater than 1000. When saving and loading the view, I get this error:


When trying to edit this view again the criteria might be broken and you may see a message similar to:


So, why is this? Well, I think it is simply that Microsoft have never tested the view editor with criteria that uses a decimal. And the reason why I say this is because if you run this query on a vanilla Service Manager database:


you will get no results returned.

Luckily, this is easy to fix.

From the console, via Administration\Management Packs, export your Management Pack that contains your problem view and open the .XML file in a suitable editor.

Search for the following text:

<Value />

And edit this as required. As I wanted “greater than 1000” I will change this to:


And now the complete expression looks like:


Save the XML and reimport the Management Pack.

Now the view will work as expected (after restarting your console):


The downside here is that if you ever need to edit the view again from the console, it will break the view once more and you’ll need to edit the XML again, so try and get your view working the way you want first then add the decimal criteria and fix it up.

Posted in Misc | Tagged , | 6 Comments

Cireson Asset Management: New Feature Highlights

Cireson recently released Asset Management version 3 for System Center Service Manager, here is a brief overview…

After recently releasing the newest version of the Asset Management app for Microsoft System Center (Features Press Release), this post goes a little more in depth to explain some of the amazing features included in this latest release. Always striving to make life easier and more productive for those who use and implement SCSM, they put a lot of thought into the features clients asked for and updates everyone was clamouring for.

Highlighted below are a few of notable enhancements, including the Cireson full Asset Catalogue, Location to IP Awareness, Contract Management and Reporting.

The full Asset Catalogue found within the Cireson Asset Management app allows users to define standard hardware types, as well as information such as model, manufacturer, and price. With access to a comprehensive yet simple and informative page view with all the relevant information in one place, users can better manage the standardization of asset types no matter what the scale of the organization.


Location to IP Awareness is now also an incredibly exciting feature. This function tracks where hardware assets exist, and also allows for hardware to location awareness based on IP address – information which is provided by System Center 2012 Configuration Manager.  This is a great example of how Cireson works to utilize all System Center components in order to provide the most insightful and rich experience possible.


Expanding on the extensive Contract Management capabilities of the Asset Management app, the new version boasts the ability to perform full contract management with different types of contracts that relate to various software and hardware assets under management. Support and maintenance contracts, leases, and warranties represent the main areas of contract management. Highly unique to the Cireson app is the ability to manage contract status via a built-in SLA engine, with notifications upon near breach or expiration of a contract’s end date.


In addition, the superior reporting functions of this new version allows for comprehensive reporting based on asset data from the data warehouse and cube reporting engine within Service Manager. These rich out-of-the-box reporting solutions cover contract, hardware asset, license, and software asset reports, amongst others.


Other enhanced capabilities of the Cireson Asset Management app now include, app metering data tracking against software asset types to understand installation vs. utilization vs. purchased count, and over 250 brand new features that make the System Center Service Manager experience better than ever before.

For more information, videos, and overviews relating to Cireson Asset Management for System Center, visit the app store at

Posted in Cireson | Tagged , , | Leave a comment

Data Warehouse – custom report Management Pack deployment can fail with Event Ids 33411, 33403 and 33410 during an upgrade


This problem was bugging me sometime back and I’ve only just got around to blogging about it…

Suppose you create a SQL Server Reporting Services report and you bundle this report up into a Service Manager Management Pack and deploy it to the Data Warehouse.

If you are watching the deployment process running under Data Warehouse\Management Packs, you may see that the deployment status changes from “Running” to “Failed” very briefly. After a few seconds it will change from “Failed” to “Completed”. You’ll not even notice the brief failure unless you are sitting there hitting F5 or perhaps if you later examine the Operations Manager event log on the Data Warehouse server. Especially as your report will now appear in the console and run perfectly, well, assuming you made no mistakes :)

But suppose you make changes to your report and rebundle your Management Pack after increasing the version by at least one…?

When you import the new version and deployment starts to run, you will see the deployment status change from “Running” to “Failed” and now it will never change to “Completed”.

If you see this, then you have hit this issue.

If you look in the Operations Manager event log on the Data Warehouse server you will see:

Event 33411, Deployment

Report deployment failed for report with ID c510195c-f3ee-b95c-e414-f184eaca7e5a and name YourReport.
One possible reason for this error is the Microsoft.EnterpriseManagement.Reporting.Code.dll may be missing. 
Please make sure you follow the instructions in the Service Manager Deployment Guide to deploy this DLL to the Reporting Services server.

This event is a complete red herring, it is nothing to do with Microsoft.EnterpriseManagement.Reporting.Code.dll, unless you actually haven’t configured it correctly as per the documentation, in which case, you wouldn’t even have got this far…

Next you will see:

Event 33403, Deployment

Deployment Execution Infrastructure encountered an error while executing a deployer.  
MP element ID: 17cf36cc-31ec-f306-bb8f-03e71138240b 
MP name: YourReportMP
MP version:
Operation: Update 
Error message: Microsoft.EnterpriseManagement.Deployers.DeploymentException: 
Install 'Report' operation failed from within 'install' Installing reports  
store = http://YourSSRSServer:80/ReportServer/ReportService2005.asmx parameters are folderpath = 
/SystemCenter/ServiceManager/YourReportsFolder, report name = YourReport in AddReport within SRSResourceStore AddReport ; 
After initialize within SRSResourceStore AddReport ;Object reference not set to an instance of an object.   
at Microsoft.SystemCenter.ResourceAccessLayer.SrsResourceStore.AddReport(String folderPath, String name, 
String reportDescription, String reportId, IResource rdl, Boolean overwrite, Boolean visible) 
at Microsoft.EnterpriseManagement.Deployers.ReportDeployer.CreateReport(Boolean overwrite)

   at Microsoft.EnterpriseManagement.Deployers.ReportDeployer.CreateReport(Boolean overwrite)
   at Microsoft.EnterpriseManagement.Deployers.ReportDeployer.Update()
   at Microsoft.SystemCenter.DeploymentEngine.ExecutionManager.Run(DeployerBase deployer)
   at Microsoft.SystemCenter.DeploymentEngine.ExecutionManager.Run(IXPathNavigable instance)

Followed by:

Event 33410, Deployment

Deployment Execution Infrastructure has retried the maximum number of times and is giving up on this execution step.  
MP Element ID: 17cf36cc-31ec-f306-bb8f-03e71138240b 
MP name: YourReportMP
MP version: 
Operation: Update 
Error message: Install 'Report' operation failed from within 'install' Installing reports  
store = http://YourSSRSServer:80/ReportServer/ReportService2005.asmx parameters are folderpath = 
/SystemCenter/ServiceManager/YourReportsFolder, report name = YourReport in AddReport within SRSResourceStore AddReport ; 
After initialize within SRSResourceStore AddReport ;Object reference not set to an instance of an object.   
at Microsoft.SystemCenter.ResourceAccessLayer.SrsResourceStore.AddReport(String folderPath, String name, 
String reportDescription, String reportId, IResource rdl, Boolean overwrite, Boolean visible) 
at Microsoft.EnterpriseManagement.Deployers.ReportDeployer.CreateReport(Boolean overwrite)

The only error here is “Object reference not set to an instance of an object” which, of course, is not very helpful.

If you, the reader, also has this problem, here is how to fix it…

When you save your report from Report Builder, it will automatically reset the DataSource path (if you used it) and the property ReportServerUrl. These need fixing.

Open your report RDL file in Visual Studio or another appropriate editor directly.

At the top, find this section:


And remove the path in DataSourceReference:


Next scroll to the end of the file and locate this line:


Remove this line completely.

Now, if you created your report by copying an existing one, you must make this a new Guid:


You can easily create a new Guid from Visual Studio via Tools\Create GUID, selecting “Registry Format” and clicking “Copy”.

Paste in the new guid, replacing the old one, and removing the {}:


You only need to change the Guid once if required, do not change it again but you must check and make the other changes every time before you rebundle your changes.

OK, the next thing to know is that this won’t fix your currently imported Management Pack. You must delete it and wait for the Status under Data Warehouse\Data Warehouse Jobs\MPSyncJob to say “Disassociated”. Order the jobs by Batch Id descending and monitor the latest one. Disassociation will delete everything the Management Pack defines. For this reason, you should never put anything else into your reports MPs such as Data Warehouse extensions or class extensions.

Now you can import your new Management Pack and if you always reset the data source path and remove the SSRS server URL your Management Pack will now upgrade correctly every time!

Posted in Data Warehouse | Tagged , | Leave a comment

Chris Ross joins the Team at Cireson



This is a quick post with some big news. Chris Ross, formally of Catapult Systems, has joined the Team at Cireson as Principal Consultant and Corporate Practice Lead.

Here is the official announcement:

Leading Microsoft System Center Partner Cireson Welcomes New Principal Consultant Chris Ross

Well done, Chris and a huge welcome to you!

Posted in Misc | Leave a comment

SCSM ListPicker control can cause an unhandled exception or console crash when used on custom forms


I noticed a strange problem today. In case anyone else gets stuck on this, I’ll explain the problem and the solution I found…

On a console task that displayed a WPF form using the Wizard framework, I had a ListPicker control (Microsoft.EnterpriseManagement.UI.WpfControls.ListPicker from Microsoft.EnterpriseManagement.UI.SMControls.dll) pointing at the Incident Resolution enumeration:


On ListPickers, you can search the contents by typing some text. This worked OK if the list contained only one level. However, if the target list contained two or maybe 3 or more levels (like the above image), it did not work.

If I typed “test”, for example, the ListPicker would throw an unhandled exception:


This exception will either crash the task or the entire console, depending on where the control is loaded.

It took me a while to figure it out, but this is caused by a lack of styling on the control. If you look at a ListPicker on an OOB form or OOB console task, or on a custom form you created for a class, it will look like this:


The console has applied a WPF style to the ListPicker. If you place the same control on a WPF Form for a console task without this style then it will look like this:


Notice the main difference on the drop-down arrow?

The border and height are different, too. If you have a custom form for a class, the console framework automatically applies the correct styling and you don’t see this problem.

Also, I noticed if I typed text from the start or certain areas of matching enumerations, the exception was not thrown.

To fix this, you firstly need to add a Resource Dictionary to your Visual Studio Project:


Next, make the contents of the Resource Dictionary point to the required styles from Service Manager by replacing all of its contents with:

<ResourceDictionary xmlns=""
        <ResourceDictionary Source="/Microsoft.EnterpriseManagement.ServiceManager.SharedResources;component/SMControls/SMControlsCollection.xaml"/>

Now make your WPF control reference this new Resource Dictionary by declaring it in your UserControl resources, after the initial control declaration block and before anything else like this:

<!--The > above is end of my initial wpfwiz:WizardRegularPageBase declaring this control-->

    <ResourceDictionary >
            <ResourceDictionary Source="/YourAssembly;component/YourFolder/YourResourceDictionary.xaml" />

You need to replace the “Yours” with your assembly name, any subfolder and the name of the Resource Dictionary that you created above. Also, you cannot declare any other resources here. If you have existing resources here, move them to your main Grid or other relevant container or control.

Now if you recompile and display your custom form the control will look like the OOB ListPickers and it will no longer throw an unhandled exception:


But why does this solve the problem? I am guessing that the styling adds a PART or other object that the internal search code references. Without it, you can get the unhandled exception “object reference not set to an instance of an object” and with it the control works as expected.

Posted in Code, SDK | Tagged , , | Leave a comment