MegaBites-AI/Windows-powershell
0308
1// Copyright (c) Microsoft Corporation.2// Licensed under the MIT License.3 4#region Using directives5using System;6using System.Collections;7using System.Collections.Generic;8using System.Diagnostics.CodeAnalysis;9using System.Management.Automation;10#endregion11 12namespace Microsoft.Management.Infrastructure.CimCmdlets13{14 /// <summary>15 /// This cmdlet enables the user to invoke a static method on a CIM class using16 /// the arguments passed as a list of name value pair dictionary.17 /// </summary>18 [Alias("icim")]19 [Cmdlet(20 "Invoke",21 "CimMethod",22 SupportsShouldProcess = true,23 DefaultParameterSetName = CimBaseCommand.ClassNameComputerSet,24 HelpUri = "https://go.microsoft.com/fwlink/?LinkId=227965")]25 public class InvokeCimMethodCommand : CimBaseCommand26 {27 #region constructor28 29 /// <summary>30 /// Initializes a new instance of the <see cref="InvokeCimMethodCommand"/> class.31 /// </summary>32 public InvokeCimMethodCommand()33 : base(parameters, parameterSets)34 {35 DebugHelper.WriteLogEx();36 }37 38 #endregion39 40 #region parameters41 42 /// <summary>43 /// The following is the definition of the input parameter "ClassName".44 /// Specifies the Class Name, on which to invoke static method.45 /// </summary>46 [Parameter(Mandatory = true,47 Position = 0,48 ValueFromPipelineByPropertyName = true,49 ParameterSetName = CimBaseCommand.ClassNameComputerSet)]50 [Parameter(Mandatory = true,51 Position = 0,52 ValueFromPipelineByPropertyName = true,53 ParameterSetName = CimBaseCommand.ClassNameSessionSet)]54 [Alias("Class")]55 public string ClassName56 {57 get58 {59 return className;60 }61 62 set63 {64 className = value;65 base.SetParameter(value, nameClassName);66 }67 }68 69 private string className;70 71 /// <summary>72 /// <para>73 /// The following is the definition of the input parameter "ResourceUri".74 /// Define the Resource Uri for which the instances are retrieved.75 /// </para>76 /// </summary>77 [Parameter(ValueFromPipelineByPropertyName = true,78 ParameterSetName = CimBaseCommand.CimInstanceComputerSet)]79 [Parameter(ValueFromPipelineByPropertyName = true,80 ParameterSetName = CimBaseCommand.CimInstanceSessionSet)]81 [Parameter(Mandatory = true,82 ValueFromPipelineByPropertyName = true,83 ParameterSetName = CimBaseCommand.ResourceUriComputerSet)]84 [Parameter(Mandatory = true,85 ValueFromPipelineByPropertyName = true,86 ParameterSetName = CimBaseCommand.ResourceUriSessionSet)]87 public Uri ResourceUri88 {89 get90 {91 return resourceUri;92 }93 94 set95 {96 this.resourceUri = value;97 base.SetParameter(value, nameResourceUri);98 }99 }100 101 private Uri resourceUri;102 103 /// <summary>104 /// The following is the definition of the input parameter "CimClass".105 /// Specifies the <see cref="CimClass"/> object, on which to invoke static method.106 /// </summary>107 [Parameter(Mandatory = true,108 Position = 0,109 ValueFromPipeline = true,110 ParameterSetName = CimClassComputerSet)]111 [Parameter(Mandatory = true,112 Position = 0,113 ValueFromPipeline = true,114 ParameterSetName = CimClassSessionSet)]115 public CimClass CimClass116 {117 get118 {119 return cimClass;120 }121 122 set123 {124 cimClass = value;125 base.SetParameter(value, nameCimClass);126 }127 }128 129 private CimClass cimClass;130 131 /// <summary>132 /// The following is the definition of the input parameter "Query".133 /// Specifies the <see cref="CimClass"/> object, on which to invoke static method.134 /// </summary>135 [Parameter(Mandatory = true,136 ValueFromPipelineByPropertyName = true,137 ParameterSetName = CimBaseCommand.QueryComputerSet)]138 [Parameter(Mandatory = true,139 ValueFromPipelineByPropertyName = true,140 ParameterSetName = CimBaseCommand.QuerySessionSet)]141 public string Query142 {143 get144 {145 return query;146 }147 148 set149 {150 query = value;151 base.SetParameter(value, nameQuery);152 }153 }154 155 private string query;156 157 /// <summary>158 /// <para>159 /// The following is the definition of the input parameter "QueryDialect".160 /// Specifies the dialect used by the query Engine that interprets the Query161 /// string.162 /// </para>163 /// </summary>164 [Parameter(ValueFromPipelineByPropertyName = true,165 ParameterSetName = CimBaseCommand.QueryComputerSet)]166 [Parameter(ValueFromPipelineByPropertyName = true,167 ParameterSetName = CimBaseCommand.QuerySessionSet)]168 public string QueryDialect169 {170 get171 {172 return queryDialect;173 }174 175 set176 {177 queryDialect = value;178 base.SetParameter(value, nameQueryDialect);179 }180 }181 182 private string queryDialect;183 184 /// <summary>185 /// The following is the definition of the input parameter "InputObject".186 /// Takes a CimInstance object retrieved by a Get-CimInstance call.187 /// Invoke the method against the given instance.188 /// </summary>189 [Parameter(Mandatory = true,190 Position = 0,191 ValueFromPipeline = true,192 ParameterSetName = CimBaseCommand.CimInstanceComputerSet)]193 [Parameter(Mandatory = true,194 Position = 0,195 ValueFromPipeline = true,196 ParameterSetName = CimBaseCommand.CimInstanceSessionSet)]197 [Alias(CimBaseCommand.AliasCimInstance)]198 public CimInstance InputObject199 {200 get201 {202 return CimInstance;203 }204 205 set206 {207 CimInstance = value;208 base.SetParameter(value, nameCimInstance);209 }210 }211 212 /// <summary>213 /// Property for internal usage purpose.214 /// </summary>215 internal CimInstance CimInstance { get; private set; }216 217 /// <summary>218 /// <para>The following is the definition of the input parameter "ComputerName".219 /// Provides the name of the computer from which to invoke the method. The220 /// ComputerName is used to create a temporary CimSession with default parameter221 /// values, which is then used to retrieve the instances.222 /// </para>223 /// <para>224 /// If no ComputerName is specified the default value is "localhost"225 /// </para>226 /// </summary>227 [Alias(AliasCN, AliasServerName)]228 [Parameter(229 ValueFromPipelineByPropertyName = true,230 ParameterSetName = CimBaseCommand.ClassNameComputerSet)]231 [Parameter(232 ValueFromPipelineByPropertyName = true,233 ParameterSetName = CimBaseCommand.QueryComputerSet)]234 [Parameter(235 ParameterSetName = CimBaseCommand.CimInstanceComputerSet)]236 [Parameter(237 ValueFromPipelineByPropertyName = true,238 ParameterSetName = CimBaseCommand.CimClassComputerSet)]239 [Parameter(240 ValueFromPipelineByPropertyName = true,241 ParameterSetName = CimBaseCommand.ResourceUriComputerSet)]242 [SuppressMessage("Microsoft.Performance", "CA1819:PropertiesShouldNotReturnArrays")]243 public string[] ComputerName244 {245 get246 {247 return computerName;248 }249 250 set251 {252 DebugHelper.WriteLogEx();253 computerName = value;254 base.SetParameter(value, nameComputerName);255 }256 }257 258 private string[] computerName;259 260 /// <summary>261 /// <para>262 /// The following is the definition of the input parameter "CimSession".263 /// Identifies the CimSession which is to be used to retrieve the instances.264 /// </para>265 /// </summary>266 [Parameter(267 Mandatory = true,268 ValueFromPipeline = true,269 ParameterSetName = CimBaseCommand.CimInstanceSessionSet)]270 [Parameter(271 Mandatory = true,272 ValueFromPipeline = true,273 ParameterSetName = CimBaseCommand.QuerySessionSet)]274 [Parameter(275 Mandatory = true,276 ValueFromPipeline = true,277 ParameterSetName = CimBaseCommand.ClassNameSessionSet)]278 [Parameter(279 Mandatory = true,280 ValueFromPipeline = true,281 ParameterSetName = CimClassSessionSet)]282 [Parameter(Mandatory = true,283 ValueFromPipelineByPropertyName = true,284 ParameterSetName = CimBaseCommand.ResourceUriSessionSet)]285 [SuppressMessage("Microsoft.Performance", "CA1819:PropertiesShouldNotReturnArrays")]286 public CimSession[] CimSession287 {288 get289 {290 return cimSession;291 }292 293 set294 {295 cimSession = value;296 base.SetParameter(value, nameCimSession);297 }298 }299 300 private CimSession[] cimSession;301 302 /// <summary>303 /// The following is the definition of the input parameter "Arguments".304 /// Specifies the parameter arguments for the static method using a name value305 /// pair.306 /// </summary>307 [Parameter(Position = 1, ValueFromPipelineByPropertyName = true)]308 [SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]309 public IDictionary Arguments { get; set; }310 311 /// <summary>312 /// The following is the definition of the input parameter "MethodName".313 /// Name of the Static Method to use.314 /// </summary>315 [Parameter(Mandatory = true,316 Position = 2,317 ValueFromPipelineByPropertyName = true)]318 [Alias("Name")]319 public string MethodName320 {321 get322 {323 return methodName;324 }325 326 set327 {328 methodName = value;329 base.SetParameter(value, nameMethodName);330 }331 }332 333 private string methodName;334 335 /// <summary>336 /// The following is the definition of the input parameter "Namespace".337 /// Specifies the NameSpace in which the class or instance lives under.338 /// </summary>339 [Parameter(ValueFromPipelineByPropertyName = true,340 ParameterSetName = CimBaseCommand.ClassNameComputerSet)]341 [Parameter(ValueFromPipelineByPropertyName = true,342 ParameterSetName = CimBaseCommand.ClassNameSessionSet)]343 [Parameter(ValueFromPipelineByPropertyName = true,344 ParameterSetName = CimBaseCommand.QueryComputerSet)]345 [Parameter(ValueFromPipelineByPropertyName = true,346 ParameterSetName = CimBaseCommand.QuerySessionSet)]347 [Parameter(348 ValueFromPipelineByPropertyName = true,349 ParameterSetName = CimBaseCommand.ResourceUriComputerSet)]350 [Parameter(351 ValueFromPipelineByPropertyName = true,352 ParameterSetName = CimBaseCommand.ResourceUriSessionSet)]353 public string Namespace354 {355 get356 {357 return nameSpace;358 }359 360 set361 {362 nameSpace = value;363 base.SetParameter(value, nameNamespace);364 }365 }366 367 private string nameSpace;368 369 /// <summary>370 /// The following is the definition of the input parameter "OperationTimeoutSec".371 /// Enables the user to specify the operation timeout in Seconds. This value372 /// overwrites the value specified by the CimSession Operation timeout.373 /// </summary>374 [Alias(AliasOT)]375 [Parameter]376 public uint OperationTimeoutSec { get; set; }377 378 #endregion379 380 #region cmdlet methods381 382 /// <summary>383 /// BeginProcessing method.384 /// </summary>385 protected override void BeginProcessing()386 {387 CimInvokeCimMethod cimInvokeMethod = this.GetOperationAgent() ?? CreateOperationAgent();388 389 this.CmdletOperation = new CmdletOperationInvokeCimMethod(this, cimInvokeMethod);390 this.AtBeginProcess = false;391 }392 393 /// <summary>394 /// ProcessRecord method.395 /// </summary>396 protected override void ProcessRecord()397 {398 base.CheckParameterSet();399 this.CheckArgument();400 CimInvokeCimMethod cimInvokeMethod = this.GetOperationAgent();401 cimInvokeMethod.InvokeCimMethod(this);402 cimInvokeMethod.ProcessActions(this.CmdletOperation);403 }404 405 /// <summary>406 /// EndProcessing method.407 /// </summary>408 protected override void EndProcessing()409 {410 CimInvokeCimMethod cimInvokeMethod = this.GetOperationAgent();411 cimInvokeMethod?.ProcessRemainActions(this.CmdletOperation);412 }413 414 #endregion415 416 #region helper methods417 418 /// <summary>419 /// <para>420 /// Get <see cref="CimInvokeCimMethod"/> object, which is421 /// used to delegate all Invoke-CimMethod operations.422 /// </para>423 /// </summary>424 private CimInvokeCimMethod GetOperationAgent()425 {426 return this.AsyncOperation as CimInvokeCimMethod;427 }428 429 /// <summary>430 /// <para>431 /// Create <see cref="CimInvokeCimMethod"/> object, which is432 /// used to delegate all Invoke-CimMethod operations.433 /// </para>434 /// </summary>435 /// <returns></returns>436 private CimInvokeCimMethod CreateOperationAgent()437 {438 CimInvokeCimMethod cimInvokeMethod = new();439 this.AsyncOperation = cimInvokeMethod;440 return cimInvokeMethod;441 }442 443 /// <summary>444 /// Check argument value.445 /// </summary>446 private void CheckArgument()447 {448 switch (this.ParameterSetName)449 {450 case CimBaseCommand.ClassNameComputerSet:451 case CimBaseCommand.ClassNameSessionSet:452 // validate the classname453 this.className = ValidationHelper.ValidateArgumentIsValidName(nameClassName, this.className);454 break;455 default:456 break;457 }458 }459 #endregion460 461 #region private members462 463 #region const string of parameter names464 internal const string nameClassName = "ClassName";465 internal const string nameCimClass = "CimClass";466 internal const string nameQuery = "Query";467 internal const string nameResourceUri = "ResourceUri";468 internal const string nameQueryDialect = "QueryDialect";469 internal const string nameCimInstance = "InputObject";470 internal const string nameComputerName = "ComputerName";471 internal const string nameCimSession = "CimSession";472 internal const string nameArguments = "Arguments";473 internal const string nameMethodName = "MethodName";474 internal const string nameNamespace = "Namespace";475 #endregion476 477 /// <summary>478 /// Static parameter definition entries.479 /// </summary>480 private static readonly Dictionary<string, HashSet<ParameterDefinitionEntry>> parameters = new()481 {482 {483 nameClassName, new HashSet<ParameterDefinitionEntry> {484 new ParameterDefinitionEntry(CimBaseCommand.ClassNameComputerSet, true),485 new ParameterDefinitionEntry(CimBaseCommand.ClassNameSessionSet, true),486 }487 },488 {489 nameCimClass, new HashSet<ParameterDefinitionEntry> {490 new ParameterDefinitionEntry(CimBaseCommand.CimClassComputerSet, true),491 new ParameterDefinitionEntry(CimBaseCommand.CimClassSessionSet, true),492 }493 },494 {495 nameQuery, new HashSet<ParameterDefinitionEntry> {496 new ParameterDefinitionEntry(CimBaseCommand.QueryComputerSet, true),497 new ParameterDefinitionEntry(CimBaseCommand.QuerySessionSet, true),498 }499 },500 {501 nameQueryDialect, new HashSet<ParameterDefinitionEntry> {502 new ParameterDefinitionEntry(CimBaseCommand.QueryComputerSet, false),503 new ParameterDefinitionEntry(CimBaseCommand.QuerySessionSet, false),504 }505 },506 {507 nameCimInstance, new HashSet<ParameterDefinitionEntry> {508 new ParameterDefinitionEntry(CimBaseCommand.CimInstanceComputerSet, true),509 new ParameterDefinitionEntry(CimBaseCommand.CimInstanceSessionSet, true),510 }511 },512 {513 nameComputerName, new HashSet<ParameterDefinitionEntry> {514 new ParameterDefinitionEntry(CimBaseCommand.ClassNameComputerSet, false),515 new ParameterDefinitionEntry(CimBaseCommand.QueryComputerSet, false),516 new ParameterDefinitionEntry(CimBaseCommand.CimInstanceComputerSet, false),517 new ParameterDefinitionEntry(CimBaseCommand.CimClassComputerSet, false),518 new ParameterDefinitionEntry(CimBaseCommand.ResourceUriComputerSet, false),519 }520 },521 {522 nameCimSession, new HashSet<ParameterDefinitionEntry> {523 new ParameterDefinitionEntry(CimBaseCommand.CimInstanceSessionSet, true),524 new ParameterDefinitionEntry(CimBaseCommand.QuerySessionSet, true),525 new ParameterDefinitionEntry(CimBaseCommand.ClassNameSessionSet, true),526 new ParameterDefinitionEntry(CimBaseCommand.CimClassSessionSet, true),527 new ParameterDefinitionEntry(CimBaseCommand.ResourceUriSessionSet, true),528 }529 },530 {531 nameMethodName, new HashSet<ParameterDefinitionEntry> {532 new ParameterDefinitionEntry(CimBaseCommand.ClassNameComputerSet, true),533 new ParameterDefinitionEntry(CimBaseCommand.ClassNameSessionSet, true),534 new ParameterDefinitionEntry(CimBaseCommand.QueryComputerSet, true),535 new ParameterDefinitionEntry(CimBaseCommand.QuerySessionSet, true),536 new ParameterDefinitionEntry(CimBaseCommand.CimInstanceComputerSet, true),537 new ParameterDefinitionEntry(CimBaseCommand.CimInstanceSessionSet, true),538 new ParameterDefinitionEntry(CimBaseCommand.CimClassComputerSet, true),539 new ParameterDefinitionEntry(CimBaseCommand.CimClassSessionSet, true),540 new ParameterDefinitionEntry(CimBaseCommand.ResourceUriSessionSet, true),541 new ParameterDefinitionEntry(CimBaseCommand.ResourceUriComputerSet, true),542 }543 },544 {545 nameNamespace, new HashSet<ParameterDefinitionEntry> {546 new ParameterDefinitionEntry(CimBaseCommand.ClassNameComputerSet, false),547 new ParameterDefinitionEntry(CimBaseCommand.ClassNameSessionSet, false),548 new ParameterDefinitionEntry(CimBaseCommand.QueryComputerSet, false),549 new ParameterDefinitionEntry(CimBaseCommand.QuerySessionSet, false),550 new ParameterDefinitionEntry(CimBaseCommand.ResourceUriSessionSet, false),551 new ParameterDefinitionEntry(CimBaseCommand.ResourceUriComputerSet, false),552 }553 },554 {555 nameResourceUri, new HashSet<ParameterDefinitionEntry> {556 new ParameterDefinitionEntry(CimBaseCommand.CimInstanceComputerSet, false),557 new ParameterDefinitionEntry(CimBaseCommand.CimInstanceSessionSet, false),558 new ParameterDefinitionEntry(CimBaseCommand.ResourceUriSessionSet, true),559 new ParameterDefinitionEntry(CimBaseCommand.ResourceUriComputerSet, true),560 }561 },562 };563 564 /// <summary>565 /// Static parameter set entries.566 /// </summary>567 private static readonly Dictionary<string, ParameterSetEntry> parameterSets = new()568 {569 { CimBaseCommand.ClassNameComputerSet, new ParameterSetEntry(2, true) },570 { CimBaseCommand.ResourceUriSessionSet, new ParameterSetEntry(3) },571 { CimBaseCommand.ResourceUriComputerSet, new ParameterSetEntry(2) },572 { CimBaseCommand.ClassNameSessionSet, new ParameterSetEntry(3) },573 { CimBaseCommand.QueryComputerSet, new ParameterSetEntry(2) },574 { CimBaseCommand.QuerySessionSet, new ParameterSetEntry(3) },575 { CimBaseCommand.CimInstanceComputerSet, new ParameterSetEntry(2) },576 { CimBaseCommand.CimInstanceSessionSet, new ParameterSetEntry(3) },577 { CimBaseCommand.CimClassComputerSet, new ParameterSetEntry(2) },578 { CimBaseCommand.CimClassSessionSet, new ParameterSetEntry(3) },579 };580 #endregion581 }582}583 