Src/EntityTypes.cs

using System;
using System.IO;
using System.Xml;
using System.Text;
using System.Globalization;
using System.Reflection;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Management.Automation;
using Microsoft.EnterpriseManagement;
using Microsoft.EnterpriseManagement.Common;
using Microsoft.EnterpriseManagement.Configuration;
using Microsoft.EnterpriseManagement.Configuration.IO;
using System.Text.RegularExpressions;
 
namespace SMLets
{
    public class EntityTypeHelper : SMCmdletBase
    {
        // Parameters
        private string _name = ".*";
        [Parameter(Position=0,ValueFromPipeline=true)]
        public string Name
        {
            get {return _name; }
            set { _name = value; }
        }
    }
 
    public abstract class GetGroupQueueCommand : ObjectCmdletHelper
    {
        // This needs to be overridden in the Get-Group/Queue cmdlet to
        // get the appropriate objects
        public abstract string neededClassName
        {
            get;
        }
 
        private string[] _displayname = { "*" };
        [Parameter(Position = 0, ParameterSetName = "DISPLAYNAME")]
        public string[] DisplayName
        {
            get { return _displayname; }
            set { _displayname = value; }
        }
        private string[] _name;
        [Parameter(ParameterSetName = "NAME", Position = 0)]
        public string[] Name
        {
            get { return _name; }
            set { _name = value; }
        }
 
        private Guid[] _id;
        [Parameter(Position = 0, ParameterSetName = "ID")]
        public Guid[] Id
        {
            get { return _id; }
            set { _id = value; }
        }
 
        protected override void BeginProcessing()
        {
            base.BeginProcessing();
        }
        protected override void EndProcessing()
        {
            // Short circuit the entire process if you got a collection of IDs
            if (ParameterSetName == "ID")
            {
                foreach (Guid g in Id)
                {
                    WriteObject(new EnterpriseManagementGroupObject(_mg.EntityObjects.GetObject<EnterpriseManagementObject>(g, ObjectQueryOptions.Default)));
                }
                return;
            }
            // OK - we're in the Name/DisplayName parametersets, so figure out what base class to get
            ManagementPackClass cig = null;
            foreach (ManagementPackClass c in _mg.EntityTypes.GetClasses())
            {
                // Microsoft.SystemCenter.ConfigItemGroup or System.WorkItemGroup
                if (String.Compare(c.Name, neededClassName, true) == 0)
                {
                    cig = c;
                }
            }
            foreach (EnterpriseManagementObject emo in _mg.EntityObjects.GetObjectReader<EnterpriseManagementObject>(cig, ObjectQueryOptions.Default))
            {
                switch (ParameterSetName)
                {
                    case "DISPLAYNAME":
                        foreach (string s in DisplayName)
                        {
                            WildcardPattern wc = new WildcardPattern(s, WildcardOptions.IgnoreCase | WildcardOptions.CultureInvariant);
                            if (wc.IsMatch(emo.DisplayName))
                            {
                                WriteObject(new EnterpriseManagementGroupObject(emo));
                            }
                        }
                        break;
                    case "NAME":
                        foreach (string s in Name)
                        {
                            WildcardPattern wc = new WildcardPattern(s, WildcardOptions.IgnoreCase | WildcardOptions.CultureInvariant);
                            // We need to match against the ClassName
                            if (wc.IsMatch(emo.GetLeastDerivedNonAbstractClass().Name))
                            {
                                WriteObject(new EnterpriseManagementGroupObject(emo));
                            }
                        }
                        break;
                    default:
                        ThrowTerminatingError(new ErrorRecord(new InvalidOperationException("Bad switch"), "GroupOutput", ErrorCategory.InvalidOperation, this));
                        break;
                }
            }
        }
    }
 
    [Cmdlet(VerbsCommon.Get,"SCSMClass")]
    public class GetSMClassCommand : EntityTypeHelper
    {
        private Guid _id = Guid.Empty;
        [Parameter]
        public Guid Id
        {
            get { return _id; }
            set { _id = value; }
        }
        protected override void ProcessRecord()
        {
            if ( Id != Guid.Empty )
            {
                try
                {
                    WriteObject(_mg.EntityTypes.GetClass(Id));
                }
                catch ( ObjectNotFoundException e )
                {
                    WriteError(new ErrorRecord(e, "Class not found", ErrorCategory.ObjectNotFound, Id));
                }
                catch ( Exception e )
                {
                    WriteError(new ErrorRecord(e, "Unknown error", ErrorCategory.NotSpecified, Id));
                }
            }
            else
            {
                Regex r = new Regex(Name, RegexOptions.IgnoreCase);
                foreach(ManagementPackClass o in _mg.EntityTypes.GetClasses())
                {
                    if ( r.Match(o.Name).Success )
                    {
                        WriteObject(o);
                    }
                }
            }
        }
    }
 
    [Cmdlet(VerbsCommon.Get,"SCSMRelationshipClass")]
    public class GetSMRelationshipClassCommand : EntityTypeHelper
    {
        private Guid _id = Guid.Empty;
        [Parameter]
        public Guid Id
        {
            get { return _id; }
            set { _id = value; }
        }
        protected override void ProcessRecord()
        {
            if ( Id != Guid.Empty )
            {
                try { WriteObject(_mg.EntityTypes.GetRelationshipClass(Id)); }
                catch ( ObjectNotFoundException e ) { WriteError(new ErrorRecord(e, "Relationship not found", ErrorCategory.ObjectNotFound, Id)); }
                catch ( Exception e ) { WriteError(new ErrorRecord(e, "Unknown error", ErrorCategory.NotSpecified, Id)); }
            }
            else
            {
                Regex r = new Regex(Name, RegexOptions.IgnoreCase);
                foreach(ManagementPackRelationship o in _mg.EntityTypes.GetRelationshipClasses())
                {
                    if ( r.Match(o.Name).Success )
                    {
                        WriteObject(o);
                    }
                }
            }
        }
    }
 
    [Cmdlet(VerbsCommon.Get,"SCSMTypeProjection")]
    public class GetSMTypeProjectionCommand : EntityTypeHelper
    {
        private Guid _id = Guid.Empty;
        [Parameter]
        public Guid Id
        {
            get { return _id; }
            set { _id = value; }
        }
        private SwitchParameter _noAdapt;
        [Parameter]
        public SwitchParameter NoAdapt
        {
            get { return _noAdapt; }
            set { _noAdapt = value; }
        }
             
        protected override void ProcessRecord()
        {
            if ( Id != Guid.Empty )
            {
                try { WriteObject(_mg.EntityTypes.GetTypeProjection(Id)); }
                catch ( ObjectNotFoundException e ) { WriteError(new ErrorRecord(e, "TypeProjection not found", ErrorCategory.ObjectNotFound, Id)); }
                catch ( Exception e ) { WriteError(new ErrorRecord(e, "Unknown error", ErrorCategory.NotSpecified, Id)); }
            }
            else
            {
                Regex r = new Regex(Name, RegexOptions.IgnoreCase);
                foreach(ManagementPackTypeProjection o in _mg.EntityTypes.GetTypeProjections())
                {
                    if ( r.Match(o.Name).Success )
                    {
                        if (NoAdapt)
                        {
                            WriteObject(o);
                        }
                        else
                        {
                            PSObject AP = AdaptProjection(o);
                            WriteObject(AP);
                        }
                    }
                }
            }
        }
        public PSObject AdaptProjection(ManagementPackTypeProjection projection)
        {
            PSObject o = new PSObject();
            o.Members.Add(new PSNoteProperty("__base",projection));
            o.Members.Add(new PSScriptMethod("GetAsXml",ScriptBlock.Create("[xml]($this.__base.CreateNavigator().OuterXml)")));
            o.TypeNames.Insert(0, projection.GetType().FullName);
            o.TypeNames.Insert(0, projection.Name);
            Type T = projection.GetType();
            foreach(PropertyInfo pi in T.GetProperties())
            {
                // no need to catch - just get what you can
                // I've seen problems with Item
                try
                {
                    o.Members.Add(new PSNoteProperty(pi.Name, T.InvokeMember(pi.Name, BindingFlags.GetProperty, null, projection, null, CultureInfo.CurrentCulture)));
                }
                catch
                {
                    ;
                }
            }
            return o;
        }
 
    }
 
    #region SCSMEnumeration cmdlets
 
    [Cmdlet(VerbsCommon.Get, "SCSMChildEnumeration")]
    public class GetSMChildEnumerationCommand : EntityTypeHelper
    {
        private TraversalDepth _depth = TraversalDepth.Recursive;
        [Parameter]
        public TraversalDepth Depth
        {
            get { return _depth; }
            set { _depth = value; }
        }
 
        private ManagementPackEnumeration _enumeration;
        [Parameter(Position = 0, Mandatory = true, ValueFromPipeline = true)]
        public ManagementPackEnumeration Enumeration
        {
            get { return _enumeration; }
            set { _enumeration = value; }
        }
 
        protected override void ProcessRecord()
        {
            foreach (ManagementPackEnumeration o in _mg.EntityTypes.GetChildEnumerations(Enumeration.Id, Depth))
            {
                WriteObject(o);
            }
        }
    }
 
    [Cmdlet(VerbsCommon.Get, "SCSMEnumeration")]
    public class GetSMEnumerationCommand : EntityTypeHelper
    {
        private Guid _id = Guid.Empty;
        [Parameter]
        public Guid Id
        {
            get { return _id; }
            set { _id = value; }
        }
        protected override void ProcessRecord()
        {
            if (Id != Guid.Empty)
            {
                try
                {
                    WriteObject(_mg.EntityTypes.GetEnumeration(Id));
                }
                catch (ObjectNotFoundException e)
                {
                    WriteError(new ErrorRecord(e, "Class not found", ErrorCategory.ObjectNotFound, Id));
                }
                catch (Exception e)
                {
                    WriteError(new ErrorRecord(e, "Unknown error", ErrorCategory.NotSpecified, Id));
                }
            }
            else
            {
                Regex r = new Regex(Name, RegexOptions.IgnoreCase);
                foreach (ManagementPackEnumeration o in _mg.EntityTypes.GetEnumerations())
                {
                    if (r.Match(o.Name).Success)
                    {
                        WriteObject(o);
                    }
                }
            }
        }
    }
 
    [Cmdlet(VerbsCommon.Remove, "SCSMEnumeration", SupportsShouldProcess = true)]
    public class RemoveSMEnumerationCommand : EntityTypeHelper
    {
        private ManagementPackEnumeration _enumeration;
 
        [Parameter(Mandatory = true, ValueFromPipeline = true)]
        public ManagementPackEnumeration Enumeration
        {
            get { return _enumeration; }
            set { _enumeration = value; }
 
        }
 
        protected override void ProcessRecord()
        {
            base.ProcessRecord();
            ManagementPackEnumeration enumeration = _mg.EntityTypes.GetEnumeration(_enumeration.Id);
            ManagementPack mp = enumeration.GetManagementPack();
            enumeration.Status = ManagementPackElementStatus.PendingDelete;
            string enumInfo = _enumeration.Name;
            if (_enumeration.DisplayName != null)
            {
                enumInfo = _enumeration.DisplayName;
            }
            if(ShouldProcess(enumInfo))
            {
                mp.AcceptChanges();
            }
        }
    }
 
    [Cmdlet(VerbsCommon.Add, "SCSMEnumeration", SupportsShouldProcess = true)]
    public class AddSCSMEnumerationCommand : SMCmdletBase
    {
        #region Parameters
        private ManagementPackEnumeration _parent;
        [Parameter(Position = 0, Mandatory = true)]
        [ValidateNotNullOrEmpty]
        public ManagementPackEnumeration Parent
        {
            get { return _parent; }
            set { _parent = value; }
        }
        private String _name;
        [Parameter(Position = 1, Mandatory = true, ValueFromPipelineByPropertyName = true)]
        public String Name
        {
            get { return _name; }
            set { _name = value; }
        }
        private String _displayName;
        [Parameter]
        public String DisplayName
        {
            get { return _displayName; }
            set { _displayName = value; }
        }
        private Double _ordinal;
        [Parameter(Position = 2, Mandatory = true, ValueFromPipelineByPropertyName = true)]
        public Double Ordinal
        {
            get { return _ordinal; }
            set { _ordinal = value; }
        }
        private ManagementPack _mp;
        [Parameter(Position = 3, Mandatory = true, ParameterSetName = "MP")]
        [Alias("mp")]
        public ManagementPack ManagementPack
        {
            get { return _mp; }
            set { _mp = value; }
        }
        private String _mpName;
        [Parameter(Position = 3, Mandatory = true, ParameterSetName = "MPName")]
        [Alias("MPName")]
        public String ManagementPackName
        {
            get { return _mpName; }
            set { _mpName = value; }
        }
        private SwitchParameter _passThru;
        [Parameter]
        public SwitchParameter PassThru
        {
            get { return _passThru; }
            set { _passThru = value; }
        }
        #endregion
        EnterpriseManagementGroup emg;
        protected override void BeginProcessing()
        {
            base.BeginProcessing();
            emg = Parent.ManagementGroup;
            if (!emg.IsConnected)
            {
                emg.Reconnect();
            }
            if (ParameterSetName == "MPName")
            {
                WildcardPattern wp = new WildcardPattern(ManagementPackName, WildcardOptions.CultureInvariant | WildcardOptions.IgnoreCase);
                int mpMatchCount = 0;
                foreach (ManagementPack m in emg.ManagementPacks.GetManagementPacks())
                {
                    if ((wp.IsMatch(m.Name) || wp.IsMatch(m.DisplayName)) && m.Sealed)
                    {
                        mpMatchCount++;
                        ManagementPack = m;
                    }
                }
                if (mpMatchCount == 0)
                {
                    ThrowTerminatingError(new ErrorRecord(new ObjectNotFoundException(ManagementPackName + " could not be found"), "No MP", ErrorCategory.ObjectNotFound, ManagementPackName));
                }
                else if (mpMatchCount > 1)
                {
                    ThrowTerminatingError(new ErrorRecord(new ObjectNotFoundException(ManagementPackName + " matched multiple mps"), "Multiple MP", ErrorCategory.ObjectNotFound, ManagementPackName));
                }
            }
            if (ManagementPack.Sealed)
            {
                ThrowTerminatingError(new ErrorRecord(new InvalidOperationException(ManagementPack.Name + " is sealed"), "Sealed MP", ErrorCategory.InvalidOperation, ManagementPack));
            }
        }
        protected override void ProcessRecord()
        {
            base.ProcessRecord();
            ManagementPackEnumeration e = new ManagementPackEnumeration(ManagementPack, Name, ManagementPackAccessibility.Public);
            e.Ordinal = Ordinal;
            e.Parent = Parent;
            ManagementPack ParentMP = Parent.GetManagementPack();
            if (DisplayName != null) { e.DisplayName = DisplayName; }
 
            if (ShouldProcess(e.Name))
            {
                if (!ManagementPack.References.ContainsValue(ParentMP))
                {
                    WriteVerbose("Adding reference to " + ParentMP.Name);
                    // Errors here are not fatal
                    // but could be later (The MP may not have the appropriate references)
                    try { ManagementPack.References.Add(ParentMP.Name.Replace('.', '_'), ParentMP); } catch { ; }
                }
                ManagementPack.AcceptChanges();
            }
            if (PassThru)
            {
                WriteObject(e);
            }
        }
    }
 
    [Cmdlet(VerbsCommon.Get, "SCSMTopLevelEnumeration")]
    public class GetSMTopLevelEnumerationCommand : EntityTypeHelper
    {
        protected override void ProcessRecord()
        {
            Regex r = new Regex(Name, RegexOptions.IgnoreCase);
            foreach (ManagementPackEnumeration o in _mg.EntityTypes.GetTopLevelEnumerations())
            {
                if (r.Match(o.Name).Success)
                {
                    WriteObject(o);
                }
            }
        }
    }
 
    #endregion
 
    #region GroupCmdlets
    #region GetSCGroup
    [Cmdlet("Get", "SCGroup", DefaultParameterSetName = "DISPLAYNAME")]
    public class GetSCGroupCommand : GetGroupQueueCommand
    {
        public override string neededClassName
        {
            get { return "Microsoft.SystemCenter.ConfigItemGroup"; }
        }
    }
    #endregion
 
    #region NewSCGroup
    /// <summary>
    /// This cmdlet creates a new group
    /// TODO: Support dynamic members
    /// </summary>
    [Cmdlet("New", "SCGroup", SupportsShouldProcess = true)]
    public class NewSCGroupCommand : ObjectCmdletHelper
    {
        #region parameters
        private string _managementPackName = null;
        [Parameter(Position = 1, ParameterSetName = "MPName")]
        public string ManagementPackName
        {
            get { return _managementPackName; }
            set { _managementPackName = value; }
        }
        private string _managementPackFriendlyName = null;
        [Parameter(ParameterSetName = "MPName")]
        public string ManagementPackFriendlyName
        {
            get { return _managementPackFriendlyName; }
            set { _managementPackFriendlyName = value; }
        }
 
        private EnterpriseManagementObject[] _include = null;
        [Parameter(Position = 2, ValueFromPipeline = true, ValueFromPipelineByPropertyName = true)]
        public EnterpriseManagementObject[] Include
        {
            get { return _include; }
            set { _include = value; }
        }
        private EnterpriseManagementObject[] _exclude = null;
        [Parameter(ValueFromPipelineByPropertyName = true)]
        public EnterpriseManagementObject[] Exclude
        {
            get { return _exclude; }
            set { _exclude = value; }
        }
        private EnterpriseManagementGroupObject[] _subGroup = null;
        [Parameter]
        public EnterpriseManagementGroupObject[] SubGroup
        {
            get { return _subGroup; }
            set { _subGroup = value; }
        }
        private string _name = null;
        [Parameter(Position = 0)]
        public string Name
        {
            get { return _name; }
            set { _name = value; }
        }
 
        private string _description;
        [Parameter(ParameterSetName = "MPName")]
        public string Description
        {
            get { return _description; }
            set { _description = value; }
        }
 
        private ManagementPack _managementPack;
        [Parameter(Position = 1, Mandatory = true, ParameterSetName = "FromMP")]
        public ManagementPack ManagementPack
        {
            get { return _managementPack; }
            set { _managementPack = value; }
        }
 
        private SwitchParameter _passThru;
        [Parameter]
        public SwitchParameter PassThru
        {
            get { return _passThru; }
            set { _passThru = value; }
        }
 
        private SwitchParameter _import;
        [Parameter]
        public SwitchParameter Import
        {
            get { return _import; }
            set { _import = value; }
        }
        public enum __GroupType { InstanceGroup, WorkItemGroup };
        private __GroupType _groupType = __GroupType.InstanceGroup;
        [Parameter]
        public __GroupType GroupType
        {
            get { return _groupType; }
            set { _groupType = value; }
        }
        private SwitchParameter _force;
        [Parameter]
        public SwitchParameter Force
        {
            get { return _force; }
            set { _force = value; }
        }
        #endregion
        // private String myGroupType;
        // private Guid InstanceGroupRelationship;
        private ManagementPackModuleType GroupPopulatorModuleType;
 
        private Dictionary<ManagementPackClass, List<Guid>> excludedList;
        private Dictionary<ManagementPackClass, List<Guid>> includedList;
        private List<EnterpriseManagementGroupObject> subGroupCollection;
 
        private string myGroupName;
        private string myDiscoveryName;
 
        private string myRelationshipName;
        protected override void BeginProcessing()
        {
            base.BeginProcessing();
            if (ParameterSetName == "MPName")
            {
                if (ManagementPackName == null)
                {
                    ManagementPackName = "MP_" + Guid.NewGuid().ToString().Replace("-", "");
                }
                if (ManagementPackFriendlyName == null)
                {
                    ManagementPackFriendlyName = ManagementPackName;
                }
            }
            if (Name == null)
            {
                Name = "Group_" + Guid.NewGuid().ToString().Replace("-", "");
            }
            includedList = new Dictionary<ManagementPackClass, List<Guid>>();
            excludedList = new Dictionary<ManagementPackClass, List<Guid>>();
            // Handle the case where you get something on the command line
            if (Exclude != null)
            {
                foreach (EnterpriseManagementObject emo in Exclude)
                {
                    ManagementPackClass c = emo.GetLeastDerivedNonAbstractClass();
                    if (!excludedList.ContainsKey(c))
                    {
                        List<Guid> l = new List<Guid>();
                        excludedList.Add(c, l);
                    }
                    excludedList[c].Add(emo.Id);
                }
            }
            if (Include != null)
            {
                foreach (EnterpriseManagementObject emo in Include)
                {
                    ManagementPackClass c = emo.GetLeastDerivedNonAbstractClass();
                    if (!includedList.ContainsKey(c))
                    {
                        List<Guid> l = new List<Guid>();
                        includedList.Add(c, l);
                    }
                    WriteVerbose("In BeginProcessing, adding " + emo.Id.ToString() + " to include list");
                    includedList[c].Add(emo.Id);
                }
            }
            if (SubGroup != null)
            {
                foreach (EnterpriseManagementGroupObject go in SubGroup)
                {
                    if (!go.ManagementPack.Sealed)
                    {
                        WriteError(new ErrorRecord(new InvalidOperationException(go.ManagementPack.Name + " is not sealed"), "Error adding SubGroup", ErrorCategory.InvalidOperation, go));
                    }
                    else
                    {
                        if (subGroupCollection == null)
                        {
                            subGroupCollection = new List<EnterpriseManagementGroupObject>();
                        }
                        subGroupCollection.Add(go);
                    }
                }
            }
        }
        protected override void ProcessRecord()
        {
            myGroupName = "Group_" + Guid.NewGuid().ToString().Replace("-", "");
            myDiscoveryName = myGroupName + ".Discovery";
            myRelationshipName = myGroupName + "_Contains_WorkItem";
            if (Include != null)
            {
                foreach (EnterpriseManagementObject o in Include)
                {
                    ManagementPackClass c = o.GetLeastDerivedNonAbstractClass();
                    if (!includedList.ContainsKey(c))
                    {
                        includedList.Add(c, new List<Guid>());
                    }
                    // This test is needed because we may have added to the include list in
                    // BeginProcessing
                    if (!includedList[c].Contains(o.Id))
                    {
                        WriteVerbose("ProcessRecord, adding " + o.Id.ToString() + " to include list");
                        includedList[c].Add(o.Id);
                    }
                }
            }
        }
        protected override void EndProcessing()
        {
            // We know that we need these at least.
            // for now, we'll just build a new MP and ignore the one we're handed
            ManagementPack mp;
            if (ParameterSetName == "FromMP")
            {
                mp = ManagementPack;
            }
            else
            {
                mp = new ManagementPack(ManagementPackName, ManagementPackFriendlyName, new Version(1, 0, 0, 0), _mg);
            }
            // Now collect MPs which we'll use in our references section
            #region References
            ManagementPack SysMP = _mg.ManagementPacks.GetManagementPack(SystemManagementPack.System);
            ManagementPack scl = _mg.ManagementPacks.GetManagementPack(SystemManagementPack.SystemCenter);
#if ( _SERVICEMANAGER_R2_ ) // R2 allows for version to be null
            ManagementPack IGL = _mg.ManagementPacks.GetManagementPack("Microsoft.SystemCenter.InstanceGroup.Library", SysMP.KeyToken, null);
            ManagementPack WI = _mg.ManagementPacks.GetManagementPack("System.WorkItem.Library", SysMP.KeyToken, null);
            ManagementPack SWAL = _mg.ManagementPacks.GetManagementPack("System.WorkItem.Activity.Library", SysMP.KeyToken, null);
            ManagementPack SNL = _mg.ManagementPacks.GetManagementPack("System.Notifications.Library", SysMP.KeyToken, null);
#else
            ManagementPack IGL = _mg.ManagementPacks.GetManagementPack("Microsoft.SystemCenter.InstanceGroup.Library", SysMP.KeyToken, SysMP.Version);
            ManagementPack WI = _mg.ManagementPacks.GetManagementPack("System.WorkItem.Library", SysMP.KeyToken, SysMP.Version);
            ManagementPack SWAL = _mg.ManagementPacks.GetManagementPack("System.WorkItem.Activity.Library", SysMP.KeyToken, SysMP.Version);
            ManagementPack SNL = _mg.ManagementPacks.GetManagementPack("System.Notifications.Library", SysMP.KeyToken, SysMP.Version);
#endif
            ManagementPack Windows = _mg.ManagementPacks.GetManagementPack(SystemManagementPack.Windows);
            List<ManagementPack> mplist = new List<ManagementPack>();
            mplist.Add(SysMP);
            mplist.Add(scl);
            mplist.Add(IGL);
            mplist.Add(WI);
            mplist.Add(Windows);
            mplist.Add(SWAL);
            mplist.Add(SNL);
            foreach (ManagementPack m in mplist)
            {
                if (!mp.References.ContainsValue(m))
                {
                    try { mp.References.Add(m.Name.Replace('.', '_'), m); } catch { ; }
                }
            }
 
            GroupPopulatorModuleType = _mg.Monitoring.GetModuleType("Microsoft.SystemCenter.GroupPopulator", scl);
            #endregion
            ManagementPackClass baseClass = _mg.EntityTypes.GetClass("Microsoft.SystemCenter.ConfigItemGroup", IGL);
            if (GroupType == __GroupType.WorkItemGroup)
            {
                baseClass = _mg.EntityTypes.GetClass("System.WorkItemGroup", WI);
            }
 
            c = GetNewClass(mp, myGroupName, baseClass);
 
            ManagementPackDiscovery d = GetNewDiscovery(mp, myDiscoveryName, c);
            ManagementPackRelationship relationshipForWorkItemGroup = null;
            if (GroupType == __GroupType.WorkItemGroup)
            {
                // We need to create a new relationship type based on the object that we got.
                relationshipForWorkItemGroup = AddRelationship(mp, baseClass);
            }
 
            AddDiscoveryRelationship(d, GroupType, relationshipForWorkItemGroup, _mg);
 
            AddLanguagePack(mp, c, d, Name, Description);
 
            #region Configuration
            string alias = String.Empty;
            StringBuilder sb = new StringBuilder();
            sb.Append("<RuleId>$MPElement$</RuleId>");
            sb.Append(String.Format("<GroupInstanceId>$MPElement[Name=\"{0}\"]$</GroupInstanceId>", myGroupName));
            sb.Append("<MembershipRules>");
            List<ManagementPackClass> IncludedAndExcluded = new List<ManagementPackClass>();
            foreach (ManagementPackClass key in includedList.Keys) { if (!IncludedAndExcluded.Contains(key)) { WriteVerbose("Adding key for " + key.Name); IncludedAndExcluded.Add(key); } }
            foreach (ManagementPackClass key in excludedList.Keys) { if (!IncludedAndExcluded.Contains(key)) { WriteVerbose("Adding key for " + key.Name); IncludedAndExcluded.Add(key); } }
            foreach (ManagementPackClass lc in IncludedAndExcluded)
            {
                bool found = false;
                sb.Append("<MembershipRule>");
                foreach (KeyValuePair<string, ManagementPackReference> kv in mp.References)
                {
                    if (lc.GetManagementPack() == kv.Value.GetManagementPack())
                    {
                        WriteVerbose("found a reference for " + lc.Name + " in " + lc.GetManagementPack().Name);
                        alias = kv.Key;
                        found = true;
                    }
                }
                if (!found)
                {
                    WriteVerbose("Adding reference for " + lc.GetManagementPack().Name);
                    // Add a reference!
                    alias = lc.GetManagementPack().Name.Replace('.', '_');
                    try { mp.References.Add(alias, lc.GetManagementPack()); } catch { ; }
                }
                if (alias == String.Empty) { throw new InvalidOperationException("could not find alias"); }
                string monitorString = String.Format("<MonitoringClass>$MPElement[Name=\"{0}!{1}\"]$</MonitoringClass>", alias, lc.Name);
                sb.Append(monitorString);
                // JWT
                sb.Append(String.Format("<RelationshipClass>$MPElement[Name=\"{0}!Microsoft.SystemCenter.InstanceGroupContainsEntities\"]$</RelationshipClass>", IGL.Name.Replace('.', '_')));
                if (includedList.ContainsKey(lc))
                {
                    sb.Append("<IncludeList>");
                    foreach (Guid g in includedList[lc])
                    {
                        sb.Append(String.Format("<MonitoringObjectId>{0}</MonitoringObjectId>", g));
                    }
                    sb.Append("</IncludeList>");
                }
                if (excludedList.ContainsKey(lc))
                {
                    sb.Append("<ExcludeList>");
                    foreach (Guid g in excludedList[lc])
                    {
                        sb.Append(String.Format("<MonitoringObjectId>{0}</MonitoringObjectId>", g));
                    }
                    sb.Append("</ExcludeList>");
                }
                sb.Append("</MembershipRule>");
            }
            sb.Append("</MembershipRules>");
            WriteVerbose(sb.ToString());
            d.DataSource.Configuration = sb.ToString();
            #endregion
            // Verification errors are fatal
            try
            {
                mp.AcceptChanges(ManagementPackVerificationTypes.XSDVerification);
                mp.Verify();
            }
            catch (Exception e)
            {
                ThrowTerminatingError(new ErrorRecord(e, "MPVerify", ErrorCategory.InvalidResult, mp));
            }
            // Import errors are fatal
            if (Import)
            {
                try
                {
                    if (ShouldProcess("Import " + myGroupName))
                    {
                        _mg.ManagementPacks.ImportManagementPack(mp);
                    }
                }
                catch (Exception e)
                {
                    if (Force)
                    {
                        WriteObject(mp);
                    }
                    ThrowTerminatingError(new ErrorRecord(e, "ImportGroupMP", ErrorCategory.InvalidResult, mp));
                }
            }
            if (PassThru)
            {
                if (ParameterSetName == "FromMP")
                {
                    WriteObject(c);
                }
                else
                {
                    WriteObject(mp);
                }
            }
        }
 
        private ManagementPackClass GetNewClass(ManagementPack m, string name, ManagementPackClass baseClass)
        {
            ManagementPackClass c = new ManagementPackClass(m, name, ManagementPackAccessibility.Public);
            c.Base = baseClass;
            c.Abstract = false;
            c.Hosted = false;
            c.Singleton = true;
            c.Extension = false;
            return c;
        }
        private ManagementPackDiscovery GetNewDiscovery(ManagementPack m, string name, ManagementPackClass target)
        {
            ManagementPackDiscovery d = new ManagementPackDiscovery(m, myDiscoveryName);
            d.Category = ManagementPackCategoryType.Discovery;
            d.Enabled = ManagementPackMonitoringLevel.@true;
            d.Target = target;
            d.ConfirmDelivery = false;
            d.Remotable = true;
            d.Priority = ManagementPackWorkflowPriority.Normal;
            return d;
        }
 
        private void AddDiscoveryRelationship(ManagementPackDiscovery d, __GroupType groupType, ManagementPackRelationship r, EnterpriseManagementGroup emg)
        {
            ManagementPackDiscoveryRelationship dr = new ManagementPackDiscoveryRelationship();
            if (groupType == __GroupType.InstanceGroup)
            {
                ManagementPack mpIGL = SMHelpers.GetManagementPack(ManagementPacks.Microsoft_SystemCenter_InstanceGroup_Library, emg);
                dr.TypeID = _mg.EntityTypes.GetRelationshipClass("Microsoft.SystemCenter.InstanceGroupContainsEntities", mpIGL);
            }
            else
            {
                dr.TypeID = r;
            }
            d.DiscoveryRelationshipCollection.Add(dr);
            ManagementPackDataSourceModule dsm = new ManagementPackDataSourceModule(d, "GroupPopulationDataSource");
            dsm.TypeID = (ManagementPackDataSourceModuleType)GroupPopulatorModuleType;
            d.DataSource = dsm;
            return;
        }
        private void AddLanguagePack(ManagementPack m, ManagementPackClass c, ManagementPackDiscovery d, string name, string classDescription)
        {
            ManagementPackLanguagePack lp = new ManagementPackLanguagePack(m, "ENU");
            lp.IsDefault = true;
            ManagementPackDisplayString ds1 = new ManagementPackDisplayString(c, "ENU");
            ds1.Name = name;
            ds1.Description = classDescription;
            ManagementPackDisplayString ds2 = new ManagementPackDisplayString(d, "ENU");
            ds2.Name = name + "_Discovery";
            ds2.Description = "Discovery for Group " + name;
        }
        private ManagementPackRelationship AddRelationship(ManagementPack m, ManagementPackClass targetClass)
        {
            ManagementPackRelationship r = new ManagementPackRelationship(m, myRelationshipName, ManagementPackAccessibility.Public);
            r.Accessibility = ManagementPackAccessibility.Public;
            r.Abstract = false;
            r.Base = SMHelpers.GetManagementPackRelationship(RelationshipTypes.Microsoft_SystemCenter_InstanceGroupContainsEntities, SMHelpers.GetManagementPack(ManagementPacks.Microsoft_SystemCenter_InstanceGroup_Library, _mg), _mg);
            ManagementPackRelationshipEndpoint source = new ManagementPackRelationshipEndpoint(r, "ContainedByGroup");
            source.MinCardinality = 0;
            source.MaxCardinality = Int32.MaxValue;
            source.Type = c;
            r.Source = source;
            ManagementPackRelationshipEndpoint target = new ManagementPackRelationshipEndpoint(r, "GroupContains");
            target.MinCardinality = 0;
            target.MaxCardinality = Int32.MaxValue;
            target.Type = targetClass;
            r.Target = target;
            return r;
        }
 
        ManagementPackClass c;
    }
    #endregion
 
    #region RemoveSCGroup
    [Cmdlet(VerbsCommon.Remove, "SCGroup", SupportsShouldProcess = true)]
    public class RemoveSCGroupCommand : SMCmdletBase
    {
        private EnterpriseManagementGroupObject[] _group;
        [Parameter(Position = 0, ValueFromPipeline = true, Mandatory = true)]
        public EnterpriseManagementGroupObject[] Group
        {
            get { return _group; }
            set { _group = value; }
        }
        protected override void ProcessRecord()
        {
            foreach (EnterpriseManagementGroupObject g in Group)
            {
                if (g.ManagementPack.Sealed)
                {
                    WriteError(new ErrorRecord(new InvalidOperationException("Can't remove from sealed management pack"), "SealedMP", ErrorCategory.InvalidOperation, g));
                }
                else
                {
                    if (ShouldProcess(g.DisplayName))
                    {
                        g.ManagementPack.DeleteEnterpriseManagementObjectGroup(g.__EnterpriseManagementObject);
                    }
                }
            }
        }
    }
    #endregion
 
    #region UpdateSCGroup
    /// <summary>
    /// This cmdlet updates a group
    /// </summary>
    ///
    /* Commenting out until it is completed
    [Cmdlet(VerbsData.Update, "SCGroup")]
    public class UpdateSCGroupCommand : ObjectCmdletHelper
    {
        private EnterpriseManagementGroupObject _group;
        [Parameter(Mandatory = true, Position = 0, ValueFromPipeline = true)]
        public EnterpriseManagementGroupObject Group
        {
            get { return _group; }
            set { _group = value; }
        }
        override protected void ProcessRecord()
        {
            ThrowTerminatingError(new ErrorRecord(new NotImplementedException(), "Not yet", ErrorCategory.InvalidOperation, this));
        }
 
    }
    */
    #endregion
    #endregion
 
    #region QueueCmdlets
    #region GetSCQueue
    [Cmdlet("Get", "SCQueue", DefaultParameterSetName = "DISPLAYNAME")]
    public class GetSCQueueCommand : GetGroupQueueCommand
    {
        public override string neededClassName
        {
            get { return "System.WorkItemGroup"; }
        }
    }
    #endregion
 
    #region NewSCQueue
    /// <summary>
    /// Create a new queue
    /// Usage Pattern is:
    /// "Status -eq 'Active'" | new-scqueue -class (get-scsmclass workitem.incident$) -mp (get-scsmmanagementpack default)
    /// "DisplayName -eq 'foo'","DisplayName -eq 'bar'" | new-scqueue -class (get-scsmclass workitem.incident$) -mp (get-scsmmanagementpack default)
    /// etc
    /// which will create
    /// </summary>
    [Cmdlet(VerbsCommon.New, "SCQueue", SupportsShouldProcess = true)]
    public class NewSCQueueCommand : ObjectCmdletHelper
    {
        #region parameters
        private string _name;
        [Parameter(Position = 0)]
        public string Name
        {
            get { return _name; }
            set { _name = value; }
        }
        private string _description;
        [Parameter]
        public string Description
        {
            get { return _description; }
            set { _description = value; }
        }
        private ManagementPack _managementPack;
        [Parameter(Position = 1, ParameterSetName = "MP")]
        [Alias("MP")]
        public ManagementPack ManagementPack
        {
            get { return _managementPack; }
            set { _managementPack = value; }
        }
        private string _managementPackName;
        [Parameter(Position = 1, ParameterSetName = "MPName", Mandatory = true)]
        public string ManagementPackName
        {
            get { return _managementPackName; }
            set { _managementPackName = value; }
        }
        private string _managementPackFriendlyName;
        [Parameter(ParameterSetName = "MPName")]
        public string ManagementPackFriendlyName
        {
            get { return _managementPackFriendlyName; }
            set { _managementPackFriendlyName = value; }
        }
        private ManagementPackClass _class;
        [Parameter(Position = 2, Mandatory = true)]
        public ManagementPackClass Class
        {
            get { return _class; }
            set { _class = value; }
        }
 
        private string[] _filter;
        [Parameter(Position = 3, Mandatory = true, ValueFromPipeline = true)]
        public string[] Filter
        {
            get { return _filter; }
            set { _filter = value; }
        }
        private SwitchParameter _passThru;
        [Parameter]
        public SwitchParameter PassThru
        {
            get { return _passThru; }
            set { _passThru = value; }
        }
        private SwitchParameter _import;
        [Parameter]
        public SwitchParameter Import
        {
            get { return _import; }
            set { _import = value; }
        }
        // if force, then output the MP even if not verified
        private SwitchParameter _force;
        [Parameter]
        public SwitchParameter Force
        {
            get { return _force; }
            set { _force = value; }
        }
        #endregion
 
        private string FilterToDiscoveryCriteria(string filter, ManagementPackClass c)
        {
            Regex r = new Regex(" or | -or ", RegexOptions.IgnoreCase | RegexOptions.CultureInvariant);
            if (r.Match(filter).Success)
            {
                ThrowTerminatingError(new ErrorRecord(new InvalidOperationException("OR is not allowed, only '-AND'"), "Bad Filter", ErrorCategory.InvalidOperation, filter));
            }
            ReadOnlyCollection<string> GenericProperties = EnterpriseManagementObjectCriteria.GetSpecialPropertyNames();
            CreatableEnterpriseManagementObject cemo = new CreatableEnterpriseManagementObject(c.ManagementGroup, c);
            ReadOnlyCollection<ManagementPackProperty> propertyList = (ReadOnlyCollection<ManagementPackProperty>)cemo.GetProperties();
            List<string> pNamelist = new List<string>();
 
 
            r = new Regex(" AND | -AND ", RegexOptions.CultureInvariant | RegexOptions.IgnoreCase);
            string[] subfilters = r.Split(filter);
            StringBuilder sb = new StringBuilder();
            sb.Append("<Expression>\r\n");
            bool multipleExpressions = false;
            if (subfilters.Length > 1)
            {
                multipleExpressions = true;
                sb.Append(" <And>\r\n");
            }
            foreach (string subfilter in subfilters)
            {
                bool found = false;
                ManagementPackProperty currentProperty = null;
                if (multipleExpressions)
                {
                    sb.Append(" <Expression>\r\n");
                }
                string sub = subfilter.Trim();
                PropertyOperatorValue POV = new PropertyOperatorValue(sub);
                sb.Append(" <SimpleExpression>\r\n");
                sb.Append(" <ValueExpression>\r\n");
                foreach (string s in GenericProperties)
                {
                    if (string.Compare(s, POV.Property, true) == 0)
                    {
                        found = true;
                        sb.Append(" <GenericProperty>" + s + "</GenericProperty>\r\n");
                    }
                }
                foreach (ManagementPackProperty p in propertyList)
                {
                    if (!found && string.Compare(p.Name, POV.Property, true) == 0)
                    {
                        // sb.Append(" <Property>" + p.Id + "</Property>\r\n");
                        sb.Append(String.Format(" <Property>$Context/Property[Type='{0}!{1}']/{2}$</Property>\r\n", c.GetManagementPack().Name.Replace('.', '_'), c.Name, p.Name));
                        currentProperty = p;
                    }
                }
                sb.Append(" </ValueExpression>\r\n");
                sb.Append(" <Operator>" + POV.Operator + "</Operator>\r\n");
                sb.Append(" <ValueExpression>\r\n");
                if (currentProperty != null && currentProperty.SystemType == typeof(Enum))
                {
                    ManagementPackElementReference<ManagementPackEnumeration> mpe = currentProperty.EnumType;
                    ManagementPackEnumeration e = SMHelpers.GetEnum(POV.Value, mpe.GetElement());
                    sb.Append(" <Value>{" + e.Id.ToString() + "}</Value>\r\n");
                }
                else
                {
                    sb.Append(" <Value>" + POV.Value + "</Value>\r\n");
                }
                sb.Append(" </ValueExpression>\r\n");
                sb.Append(" </SimpleExpression>\r\n");
                if (multipleExpressions)
                {
                    sb.Append(" </Expression>\r\n");
                }
            }
            if (multipleExpressions)
            {
                sb.Append(" </And>\r\n");
            }
            sb.Append("</Expression>\r\n");
 
            return sb.ToString();
        }
        private string myQueueName;
        private string myRelationshipName;
        private ManagementPackModuleType GroupPopulatorModuleType;
        protected override void BeginProcessing()
        {
            base.BeginProcessing();
            if (Name == null)
            {
                Name = "WorkItemGroup." + Guid.NewGuid().ToString().Replace("-", "");
            }
            if (ParameterSetName == "MPName" && ManagementPackFriendlyName == null)
            {
                ManagementPackFriendlyName = ManagementPackName;
            }
            myQueueName = "WorkItemGroup." + Guid.NewGuid().ToString().Replace("-", "");
            myDiscoveryName = myQueueName + ".Discovery";
            myRelationshipName = myQueueName + "_Contains_" + Class.Name;
        }
        private string convertedFilter;
        protected override void ProcessRecord()
        {
            foreach (string f in Filter)
            {
                convertedFilter = FilterToDiscoveryCriteria(f, Class);
                WriteVerbose(convertedFilter);
            }
        }
        private string myDiscoveryName;
        protected override void EndProcessing()
        {
            ManagementPack mp;
 
            if (ParameterSetName == "MP")
            {
                mp = ManagementPack;
            }
            else
            {
                mp = new ManagementPack(ManagementPackName, ManagementPackFriendlyName, new Version(1, 0, 0, 0), _mg);
            }
 
            #region References
 
            // Now collect MPs which we'll use in our references section
            ManagementPack SysMP = _mg.ManagementPacks.GetManagementPack(SystemManagementPack.System);
            ManagementPack scl = _mg.ManagementPacks.GetManagementPack(SystemManagementPack.SystemCenter);
            ManagementPack Windows = _mg.ManagementPacks.GetManagementPack(SystemManagementPack.Windows);
#if ( _SERVICEMANAGER_R2_ ) // R2 allows for version to be null
            ManagementPack IGL = _mg.ManagementPacks.GetManagementPack("Microsoft.SystemCenter.InstanceGroup.Library", SysMP.KeyToken, null);
            ManagementPack WI = _mg.ManagementPacks.GetManagementPack("System.WorkItem.Library", SysMP.KeyToken, null);
            ManagementPack SWAL = _mg.ManagementPacks.GetManagementPack("System.WorkItem.Activity.Library", SysMP.KeyToken, null);
            ManagementPack SNL = _mg.ManagementPacks.GetManagementPack("System.Notifications.Library", SysMP.KeyToken, null);
#else
            ManagementPack IGL = _mg.ManagementPacks.GetManagementPack("Microsoft.SystemCenter.InstanceGroup.Library", SysMP.KeyToken, SysMP.Version);
            ManagementPack WI = _mg.ManagementPacks.GetManagementPack("System.WorkItem.Library", SysMP.KeyToken, SysMP.Version);
            ManagementPack SWAL = _mg.ManagementPacks.GetManagementPack("System.WorkItem.Activity.Library", SysMP.KeyToken, SysMP.Version);
            ManagementPack SNL = _mg.ManagementPacks.GetManagementPack("System.Notifications.Library", SysMP.KeyToken, SysMP.Version);
#endif
            ManagementPack classMP = Class.GetManagementPack();
            List<ManagementPack> mplist = new List<ManagementPack>();
            mplist.Add(SysMP);
            mplist.Add(scl);
            mplist.Add(IGL);
            mplist.Add(WI);
            mplist.Add(Windows);
            mplist.Add(SWAL);
            mplist.Add(SNL);
            mplist.Add(classMP);
            foreach (ManagementPack m in mplist)
            {
                if (!mp.References.ContainsValue(m))
                {
                    try { mp.References.Add(m.Name.Replace('.', '_'), m); } catch { ; }
                }
            }
 
            #endregion
 
            GroupPopulatorModuleType = _mg.Monitoring.GetModuleType("Microsoft.SystemCenter.GroupPopulator", scl);
 
            ManagementPackClass classWorkItemGroup = _mg.EntityTypes.GetClass("System.WorkItemGroup", WI);
 
            ManagementPackClass c = GetNewClass(mp, myQueueName, classWorkItemGroup);
 
            ManagementPackDiscovery d = GetNewDiscovery(mp, myDiscoveryName, c);
 
            ManagementPackRelationship relationshipForWorkItemGroup = AddRelationship(mp, Class, c);
 
            AddDiscoveryRelationship(d, relationshipForWorkItemGroup);
 
            AddLanguagePack(mp, c, d, Name, Description);
 
            #region Configuration
 
            string alias = String.Empty;
            StringBuilder sb = new StringBuilder();
            sb.Append("<RuleId>$MPElement$</RuleId>\r\n");
            sb.Append(String.Format("<GroupInstanceId>$MPElement[Name=\"{0}\"]$</GroupInstanceId>\r\n", myQueueName));
            sb.Append("<MembershipRules>\r\n");
            sb.Append("<MembershipRule>\r\n");
            sb.Append(String.Format("<MonitoringClass>$MPElement[Name=\"{0}!{1}\"]$</MonitoringClass>\r\n", Class.GetManagementPack().Name.Replace('.', '_'), Class.Name));
            sb.Append(String.Format("<RelationshipClass>$MPElement[Name=\"{0}\"]$</RelationshipClass>\r\n", myRelationshipName));
 
 
            sb.Append(convertedFilter);
            sb.Append("</MembershipRule>\r\n");
            sb.Append("</MembershipRules>\r\n");
            WriteVerbose(sb.ToString());
            d.DataSource.Configuration = sb.ToString();
 
            #endregion
 
            // Verification errors are fatal
            try
            {
                mp.AcceptChanges(ManagementPackVerificationTypes.XSDVerification);
                mp.Verify();
            }
            catch (Exception e)
            {
                ThrowTerminatingError(new ErrorRecord(e, "MPVerify", ErrorCategory.InvalidResult, mp));
            }
            // Import errors are fatal
            if (Import)
            {
                try
                {
                    if (ShouldProcess("Import " + myQueueName))
                    {
                        _mg.ManagementPacks.ImportManagementPack(mp);
                    }
                }
                catch (Exception e)
                {
                    ThrowTerminatingError(new ErrorRecord(e, "ImportGroupMP", ErrorCategory.InvalidResult, mp));
                }
            }
            if (PassThru)
            {
                if (ParameterSetName == "MP")
                {
                    WriteObject( c );
                }
                else
                {
                    WriteObject( mp );
                }
            }
 
        }
        private ManagementPackClass GetNewClass(ManagementPack m, string name, ManagementPackClass baseClass)
        {
            ManagementPackClass c = new ManagementPackClass(m, name, ManagementPackAccessibility.Public);
            c.Base = baseClass;
            c.Abstract = false;
            c.Hosted = false;
            c.Singleton = true;
            c.Extension = false;
            return c;
        }
        private ManagementPackDiscovery GetNewDiscovery(ManagementPack m, string name, ManagementPackClass target)
        {
            ManagementPackDiscovery d = new ManagementPackDiscovery(m, myDiscoveryName);
            d.Category = ManagementPackCategoryType.Discovery;
            d.Enabled = ManagementPackMonitoringLevel.@true;
            d.Target = target;
            d.ConfirmDelivery = false;
            d.Remotable = true;
            d.Priority = ManagementPackWorkflowPriority.Normal;
            return d;
        }
        private void AddDiscoveryRelationship(ManagementPackDiscovery d, ManagementPackRelationship r)
        {
            ManagementPackDiscoveryRelationship dr = new ManagementPackDiscoveryRelationship();
            dr.TypeID = r;
            d.DiscoveryRelationshipCollection.Add(dr);
            ManagementPackDataSourceModule dsm = new ManagementPackDataSourceModule(d, "GroupPopulationDataSource");
            dsm.TypeID = (ManagementPackDataSourceModuleType)GroupPopulatorModuleType;
            d.DataSource = dsm;
            return;
        }
        private void AddLanguagePack(ManagementPack m, ManagementPackClass c, ManagementPackDiscovery d, string name, string classDescription)
        {
            ManagementPackLanguagePack lp = new ManagementPackLanguagePack(m, "ENU");
            lp.IsDefault = true;
            ManagementPackDisplayString ds1 = new ManagementPackDisplayString(c, "ENU");
            ds1.Name = name;
            ds1.Description = classDescription;
            ManagementPackDisplayString ds2 = new ManagementPackDisplayString(d, "ENU");
            ds2.Name = name + "_Discovery";
            ds2.Description = "Discovery for Group " + name;
        }
        private ManagementPackRelationship AddRelationship(ManagementPack m, ManagementPackClass targetClass, ManagementPackClass sourceClass)
        {
            ManagementPackRelationship r = new ManagementPackRelationship(m, myRelationshipName, ManagementPackAccessibility.Public);
            r.Accessibility = ManagementPackAccessibility.Public;
            r.Abstract = false;
            r.Base = SMHelpers.GetManagementPackRelationship(RelationshipTypes.System_WorkItemGroupContainsWorkItems, SMHelpers.GetManagementPack(ManagementPacks.System_WorkItem_Library, _mg), _mg);
            ManagementPackRelationshipEndpoint source = new ManagementPackRelationshipEndpoint(r, "ContainedByGroup");
            source.MinCardinality = 0;
            source.MaxCardinality = Int32.MaxValue;
            source.Type = sourceClass;
            r.Source = source;
            ManagementPackRelationshipEndpoint target = new ManagementPackRelationshipEndpoint(r, "GroupContains");
            target.MinCardinality = 0;
            target.MaxCardinality = Int32.MaxValue;
            target.Type = targetClass;
            r.Target = target;
            return r;
        }
 
    }
    #endregion
 
    #region RemoveSCQueue
    [Cmdlet(VerbsCommon.Remove, "SCQueue", SupportsShouldProcess = true)]
    public class RemoveSCQueueCommand : SMCmdletBase
    {
        private EnterpriseManagementGroupObject[] _queue;
        [Parameter(Position = 0, ValueFromPipeline = true, Mandatory = true)]
        public EnterpriseManagementGroupObject[] Queue
        {
            get { return _queue; }
            set { _queue = value; }
        }
        protected override void ProcessRecord()
        {
            foreach (EnterpriseManagementGroupObject q in Queue)
            {
                if (q.ManagementPack.Sealed)
                {
                    WriteError(new ErrorRecord(new InvalidOperationException("Can't remove from sealed management pack"), "SealedMP", ErrorCategory.InvalidOperation, q));
                }
                else
                {
                    if (ShouldProcess(q.DisplayName))
                    {
                        q.ManagementPack.DeleteEnterpriseManagementObjectGroup(q.__EnterpriseManagementObject);
                    }
                }
            }
        }
    }
    #endregion
    #endregion
}