// Copyright (c) Microsoft Corporation. // Licensed under the MIT License. #region Using directives using System; using System.Collections; using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; using System.Management.Automation; #endregion namespace Microsoft.Management.Infrastructure.CimCmdlets { /// /// /// This Cmdlet creates an instance of a CIM class based on the class /// definition, which is an instance factory /// /// /// If -ClientOnly is not specified, New-CimInstance will create a new instance /// on the server, otherwise just create client in-memory instance /// /// [Cmdlet(VerbsCommon.New, "CimInstance", DefaultParameterSetName = CimBaseCommand.ClassNameComputerSet, SupportsShouldProcess = true, HelpUri = "https://go.microsoft.com/fwlink/?LinkId=227963")] [OutputType(typeof(CimInstance))] public class NewCimInstanceCommand : CimBaseCommand { #region constructor /// /// Constructor. /// public NewCimInstanceCommand() : base(parameters, parameterSets) { DebugHelper.WriteLogEx(); } #endregion #region parameters /// /// The following is the definition of the input parameter "ClassName". /// Name of the Class to use to create Instance. /// [Parameter( Mandatory = true, Position = 0, ValueFromPipelineByPropertyName = true, ParameterSetName = CimBaseCommand.ClassNameSessionSet)] [Parameter( Mandatory = true, Position = 0, ValueFromPipelineByPropertyName = true, ParameterSetName = CimBaseCommand.ClassNameComputerSet)] public string ClassName { get { return className; } set { className = value; base.SetParameter(value, nameClassName); } } private string className; /// /// /// The following is the definition of the input parameter "ResourceUri". /// Define the Resource Uri for which the instances are retrieved. /// /// [Parameter(Mandatory = true, ValueFromPipelineByPropertyName = true, ParameterSetName = CimBaseCommand.ResourceUriSessionSet)] [Parameter(Mandatory = true, ValueFromPipelineByPropertyName = true, ParameterSetName = CimBaseCommand.ResourceUriComputerSet)] public Uri ResourceUri { get { return resourceUri; } set { this.resourceUri = value; base.SetParameter(value, nameResourceUri); } } private Uri resourceUri; /// /// /// The following is the definition of the input parameter "Key". /// Enables the user to specify list of key property name. /// /// /// Example: -Key {"K1", "K2"} /// /// [Parameter( ValueFromPipelineByPropertyName = true, ParameterSetName = CimBaseCommand.ClassNameSessionSet)] [Parameter( ValueFromPipelineByPropertyName = true, ParameterSetName = CimBaseCommand.ClassNameComputerSet)] [Parameter( ValueFromPipelineByPropertyName = true, ParameterSetName = CimBaseCommand.ResourceUriSessionSet)] [Parameter( ValueFromPipelineByPropertyName = true, ParameterSetName = CimBaseCommand.ResourceUriComputerSet)] [SuppressMessage("Microsoft.Performance", "CA1819:PropertiesShouldNotReturnArrays")] public string[] Key { get { return key; } set { key = value; base.SetParameter(value, nameKey); } } private string[] key; /// /// The following is the definition of the input parameter "CimClass". /// The CimClass is used to create Instance. /// [Parameter( Mandatory = true, Position = 0, ValueFromPipeline = true, ParameterSetName = CimClassSessionSet)] [Parameter( Mandatory = true, Position = 0, ValueFromPipeline = true, ParameterSetName = CimClassComputerSet)] public CimClass CimClass { get { return cimClass; } set { cimClass = value; base.SetParameter(value, nameCimClass); } } private CimClass cimClass; /// /// /// The following is the definition of the input parameter "Property". /// Enables the user to specify instances with specific property values. /// /// /// Example: -Property @{P1="Value1";P2="Value2"} /// /// [Parameter( Position = 1, ValueFromPipelineByPropertyName = true)] [SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")] [Alias("Arguments")] public IDictionary Property { get { return property; } set { property = value; } } private IDictionary property; /// /// The following is the definition of the input parameter "Namespace". /// Namespace used to look for the classes under to store the instances. /// Default namespace is 'root\cimv2' /// [Parameter( ValueFromPipelineByPropertyName = true, ParameterSetName = CimBaseCommand.ClassNameSessionSet)] [Parameter( ValueFromPipelineByPropertyName = true, ParameterSetName = CimBaseCommand.ClassNameComputerSet)] [Parameter( ValueFromPipelineByPropertyName = true, ParameterSetName = CimBaseCommand.ResourceUriSessionSet)] [Parameter( ValueFromPipelineByPropertyName = true, ParameterSetName = CimBaseCommand.ResourceUriComputerSet)] public string Namespace { get { return nameSpace; } set { nameSpace = value; base.SetParameter(value, nameNamespace); } } private string nameSpace; /// /// The following is the definition of the input parameter "OperationTimeoutSec". /// Operation Timeout of the cmdlet in seconds. Overrides the value in the Cim /// Session. /// [Alias(AliasOT)] [Parameter] public UInt32 OperationTimeoutSec { get { return operationTimeout; } set { operationTimeout = value; } } private UInt32 operationTimeout; /// /// /// The following is the definition of the input parameter "CimSession". /// Identifies the CimSession which is to be used to create the instances. /// /// [Parameter( Mandatory = true, ValueFromPipeline = true, ParameterSetName = CimBaseCommand.ClassNameSessionSet)] [Parameter( Mandatory = true, ValueFromPipeline = true, ParameterSetName = CimBaseCommand.ResourceUriSessionSet)] [Parameter( Mandatory = true, ValueFromPipeline = true, ParameterSetName = CimClassSessionSet)] [SuppressMessage("Microsoft.Performance", "CA1819:PropertiesShouldNotReturnArrays")] public CimSession[] CimSession { get { return cimSession; } set { cimSession = value; base.SetParameter(value, nameCimSession); } } private CimSession[] cimSession; /// /// The following is the definition of the input parameter "ComputerName". /// Provides the name of the computer from which to create the instances. /// /// /// If no ComputerName is specified the default value is "localhost" /// /// [Alias(AliasCN, AliasServerName)] [Parameter( ValueFromPipelineByPropertyName = true, ParameterSetName = CimBaseCommand.ClassNameComputerSet)] [Parameter( ValueFromPipelineByPropertyName = true, ParameterSetName = CimBaseCommand.ResourceUriComputerSet)] [Parameter( ValueFromPipelineByPropertyName = true, ParameterSetName = CimClassComputerSet)] [SuppressMessage("Microsoft.Performance", "CA1819:PropertiesShouldNotReturnArrays")] public string[] ComputerName { get { return computerName; } set { computerName = value; base.SetParameter(value, nameComputerName); } } private string[] computerName; /// /// /// The following is the definition of the input parameter "ClientOnly". /// Indicates to create a client only ciminstance object, NOT on the server. /// /// [Alias("Local")] [Parameter( ParameterSetName = CimBaseCommand.ClassNameSessionSet)] [Parameter( ParameterSetName = CimBaseCommand.ClassNameComputerSet)] [Parameter( ParameterSetName = CimBaseCommand.CimClassComputerSet)] [Parameter( ParameterSetName = CimBaseCommand.CimClassSessionSet)] public SwitchParameter ClientOnly { get { return clientOnly; } set { clientOnly = value; base.SetParameter(value, nameClientOnly); } } private SwitchParameter clientOnly; #endregion #region cmdlet methods /// /// BeginProcessing method. /// protected override void BeginProcessing() { this.CmdletOperation = new CmdletOperationBase(this); this.AtBeginProcess = false; } /// /// ProcessRecord method. /// protected override void ProcessRecord() { base.CheckParameterSet(); this.CheckArgument(); if (this.ClientOnly) { string conflictParameterName = null; if (this.ComputerName != null) { conflictParameterName = @"ComputerName"; } else if (this.CimSession != null) { conflictParameterName = @"CimSession"; } if (conflictParameterName != null) { ThrowConflictParameterWasSet(@"New-CimInstance", conflictParameterName, @"ClientOnly"); return; } } CimNewCimInstance cimNewCimInstance = this.GetOperationAgent(); if (cimNewCimInstance == null) { cimNewCimInstance = CreateOperationAgent(); } cimNewCimInstance.NewCimInstance(this); cimNewCimInstance.ProcessActions(this.CmdletOperation); } /// /// EndProcessing method. /// protected override void EndProcessing() { CimNewCimInstance cimNewCimInstance = this.GetOperationAgent(); if (cimNewCimInstance != null) { cimNewCimInstance.ProcessRemainActions(this.CmdletOperation); } } #endregion #region helper methods /// /// /// Get object, which is /// used to delegate all New-CimInstance operations. /// /// CimNewCimInstance GetOperationAgent() { return (this.AsyncOperation as CimNewCimInstance); } /// /// /// Create object, which is /// used to delegate all New-CimInstance operations. /// /// /// CimNewCimInstance CreateOperationAgent() { CimNewCimInstance cimNewCimInstance = new CimNewCimInstance(); this.AsyncOperation = cimNewCimInstance; return cimNewCimInstance; } /// /// Check argument value. /// private void CheckArgument() { switch (this.ParameterSetName) { case CimBaseCommand.ClassNameComputerSet: case CimBaseCommand.ClassNameSessionSet: // validate the classname this.className = ValidationHelper.ValidateArgumentIsValidName(nameClassName, this.className); break; default: break; } } #endregion #region private members #region const string of parameter names internal const string nameClassName = "ClassName"; internal const string nameResourceUri = "ResourceUri"; internal const string nameKey = "Key"; internal const string nameCimClass = "CimClass"; internal const string nameProperty = "Property"; internal const string nameNamespace = "Namespace"; internal const string nameCimSession = "CimSession"; internal const string nameComputerName = "ComputerName"; internal const string nameClientOnly = "ClientOnly"; #endregion /// /// Static parameter definition entries. /// static Dictionary> parameters = new Dictionary> { { nameClassName, new HashSet { new ParameterDefinitionEntry(CimBaseCommand.ClassNameSessionSet, true), new ParameterDefinitionEntry(CimBaseCommand.ClassNameComputerSet, true), } }, { nameResourceUri, new HashSet { new ParameterDefinitionEntry(CimBaseCommand.ResourceUriSessionSet, true), new ParameterDefinitionEntry(CimBaseCommand.ResourceUriComputerSet, true), } }, { nameKey, new HashSet { new ParameterDefinitionEntry(CimBaseCommand.ClassNameSessionSet, false), new ParameterDefinitionEntry(CimBaseCommand.ClassNameComputerSet, false), new ParameterDefinitionEntry(CimBaseCommand.ResourceUriComputerSet, false), new ParameterDefinitionEntry(CimBaseCommand.ResourceUriSessionSet, false), } }, { nameCimClass, new HashSet { new ParameterDefinitionEntry(CimBaseCommand.CimClassSessionSet, true), new ParameterDefinitionEntry(CimBaseCommand.CimClassComputerSet, true), } }, { nameNamespace, new HashSet { new ParameterDefinitionEntry(CimBaseCommand.ClassNameSessionSet, false), new ParameterDefinitionEntry(CimBaseCommand.ClassNameComputerSet, false), new ParameterDefinitionEntry(CimBaseCommand.ResourceUriComputerSet, false), new ParameterDefinitionEntry(CimBaseCommand.ResourceUriSessionSet, false), } }, { nameCimSession, new HashSet { new ParameterDefinitionEntry(CimBaseCommand.ClassNameSessionSet, true), new ParameterDefinitionEntry(CimBaseCommand.ResourceUriSessionSet, true), new ParameterDefinitionEntry(CimBaseCommand.CimClassSessionSet, true), } }, { nameComputerName, new HashSet { new ParameterDefinitionEntry(CimBaseCommand.ClassNameComputerSet, false), new ParameterDefinitionEntry(CimBaseCommand.ResourceUriComputerSet, false), new ParameterDefinitionEntry(CimBaseCommand.CimClassComputerSet, false), } }, { nameClientOnly, new HashSet { new ParameterDefinitionEntry(CimBaseCommand.ClassNameSessionSet, true), new ParameterDefinitionEntry(CimBaseCommand.ClassNameComputerSet, true), new ParameterDefinitionEntry(CimBaseCommand.CimClassSessionSet, true), new ParameterDefinitionEntry(CimBaseCommand.CimClassComputerSet, true), } }, }; /// /// Static parameter set entries. /// static Dictionary parameterSets = new Dictionary { { CimBaseCommand.ClassNameSessionSet, new ParameterSetEntry(2) }, { CimBaseCommand.ClassNameComputerSet, new ParameterSetEntry(1, true) }, { CimBaseCommand.CimClassSessionSet, new ParameterSetEntry(2) }, { CimBaseCommand.CimClassComputerSet, new ParameterSetEntry(1) }, { CimBaseCommand.ResourceUriSessionSet, new ParameterSetEntry(2) }, { CimBaseCommand.ResourceUriComputerSet, new ParameterSetEntry(1) }, }; #endregion } }