MegaBites-AI/Windows-powershell
0372
1// Copyright (c) Microsoft Corporation.2// Licensed under the MIT License.3 4#region Using directives5 6using System.Collections.Generic;7using System.Globalization;8using System.Management.Automation;9using System.Text;10 11#endregion12 13namespace Microsoft.Management.Infrastructure.CimCmdlets14{15 /// <summary>16 /// A class used to add pstypename to partial ciminstance17 /// for <see cref="GetCimInstanceCommand"/>, if -KeyOnly18 /// or -SelectProperties is been specified, then add a pstypename:19 /// "Microsoft.Management.Infrastructure.CimInstance#__PartialCIMInstance"20 /// </summary>21 internal class FormatPartialCimInstance : IObjectPreProcess22 {23 /// <summary>24 /// Partial ciminstance pstypename.25 /// </summary>26 internal const string PartialPSTypeName = @"Microsoft.Management.Infrastructure.CimInstance#__PartialCIMInstance";27 28 /// <summary>29 /// Add pstypename to the resultobject if necessary.30 /// </summary>31 /// <param name="resultObject"></param>32 /// <returns></returns>33 public object Process(object resultObject)34 {35 if (resultObject is CimInstance)36 {37 PSObject obj = PSObject.AsPSObject(resultObject);38 obj.TypeNames.Insert(0, PartialPSTypeName);39 return obj;40 }41 42 return resultObject;43 }44 }45 46 /// <summary>47 /// <para>48 /// Implements operations of get-ciminstance cmdlet.49 /// </para>50 /// </summary>51 internal class CimGetInstance : CimAsyncOperation52 {53 /// <summary>54 /// Initializes a new instance of the <see cref="CimGetInstance"/> class.55 /// <para>56 /// Constructor57 /// </para>58 /// </summary>59 public CimGetInstance() : base()60 {61 }62 63 /// <summary>64 /// <para>65 /// Base on parametersetName to retrieve ciminstances66 /// </para>67 /// </summary>68 /// <param name="cmdlet"><see cref="GetCimInstanceCommand"/> object.</param>69 public void GetCimInstance(GetCimInstanceCommand cmdlet)70 {71 GetCimInstanceInternal(cmdlet);72 }73 74 /// <summary>75 /// <para>76 /// Refactor to be reused by Get-CimInstance;Remove-CimInstance;Set-CimInstance77 /// </para>78 /// </summary>79 /// <param name="cmdlet"></param>80 protected void GetCimInstanceInternal(CimBaseCommand cmdlet)81 {82 IEnumerable<string> computerNames = ConstValue.GetComputerNames(83 GetComputerName(cmdlet));84 string nameSpace;85 List<CimSessionProxy> proxys = new();86 bool isGetCimInstanceCommand = cmdlet is GetCimInstanceCommand;87 CimInstance targetCimInstance = null;88 switch (cmdlet.ParameterSetName)89 {90 case CimBaseCommand.CimInstanceComputerSet:91 foreach (string computerName in computerNames)92 {93 targetCimInstance = GetCimInstanceParameter(cmdlet);94 CimSessionProxy proxy = CreateSessionProxy(computerName, targetCimInstance, cmdlet);95 if (isGetCimInstanceCommand)96 {97 SetPreProcess(proxy, cmdlet as GetCimInstanceCommand);98 }99 100 proxys.Add(proxy);101 }102 103 break;104 case CimBaseCommand.ClassNameComputerSet:105 case CimBaseCommand.QueryComputerSet:106 case CimBaseCommand.ResourceUriComputerSet:107 foreach (string computerName in computerNames)108 {109 CimSessionProxy proxy = CreateSessionProxy(computerName, cmdlet);110 if (isGetCimInstanceCommand)111 {112 SetPreProcess(proxy, cmdlet as GetCimInstanceCommand);113 }114 115 proxys.Add(proxy);116 }117 118 break;119 case CimBaseCommand.ClassNameSessionSet:120 case CimBaseCommand.CimInstanceSessionSet:121 case CimBaseCommand.QuerySessionSet:122 case CimBaseCommand.ResourceUriSessionSet:123 foreach (CimSession session in GetCimSession(cmdlet))124 {125 CimSessionProxy proxy = CreateSessionProxy(session, cmdlet);126 if (isGetCimInstanceCommand)127 {128 SetPreProcess(proxy, cmdlet as GetCimInstanceCommand);129 }130 131 proxys.Add(proxy);132 }133 134 break;135 default:136 break;137 }138 139 switch (cmdlet.ParameterSetName)140 {141 case CimBaseCommand.ClassNameComputerSet:142 case CimBaseCommand.ClassNameSessionSet:143 nameSpace = ConstValue.GetNamespace(GetNamespace(cmdlet));144 if (IsClassNameQuerySet(cmdlet))145 {146 string query = CreateQuery(cmdlet);147 DebugHelper.WriteLogEx(@"Query = {0}", 1, query);148 foreach (CimSessionProxy proxy in proxys)149 {150 proxy.QueryInstancesAsync(nameSpace,151 ConstValue.GetQueryDialectWithDefault(GetQueryDialect(cmdlet)),152 query);153 }154 }155 else156 {157 foreach (CimSessionProxy proxy in proxys)158 {159 proxy.EnumerateInstancesAsync(nameSpace, GetClassName(cmdlet));160 }161 }162 163 break;164 case CimBaseCommand.CimInstanceComputerSet:165 case CimBaseCommand.CimInstanceSessionSet:166 {167 CimInstance instance = GetCimInstanceParameter(cmdlet);168 nameSpace = ConstValue.GetNamespace(instance.CimSystemProperties.Namespace);169 foreach (CimSessionProxy proxy in proxys)170 {171 proxy.GetInstanceAsync(nameSpace, instance);172 }173 }174 175 break;176 case CimBaseCommand.QueryComputerSet:177 case CimBaseCommand.QuerySessionSet:178 nameSpace = ConstValue.GetNamespace(GetNamespace(cmdlet));179 foreach (CimSessionProxy proxy in proxys)180 {181 proxy.QueryInstancesAsync(nameSpace,182 ConstValue.GetQueryDialectWithDefault(GetQueryDialect(cmdlet)),183 GetQuery(cmdlet));184 }185 186 break;187 case CimBaseCommand.ResourceUriSessionSet:188 case CimBaseCommand.ResourceUriComputerSet:189 foreach (CimSessionProxy proxy in proxys)190 {191 proxy.EnumerateInstancesAsync(GetNamespace(cmdlet), GetClassName(cmdlet));192 }193 194 break;195 default:196 break;197 }198 }199 200 #region bridge methods to read properties from cmdlet201 202 protected static string[] GetComputerName(CimBaseCommand cmdlet)203 {204 if (cmdlet is GetCimInstanceCommand)205 {206 return (cmdlet as GetCimInstanceCommand).ComputerName;207 }208 else if (cmdlet is RemoveCimInstanceCommand)209 {210 return (cmdlet as RemoveCimInstanceCommand).ComputerName;211 }212 else if (cmdlet is SetCimInstanceCommand)213 {214 return (cmdlet as SetCimInstanceCommand).ComputerName;215 }216 217 return null;218 }219 220 protected static string GetNamespace(CimBaseCommand cmdlet)221 {222 if (cmdlet is GetCimInstanceCommand)223 {224 return (cmdlet as GetCimInstanceCommand).Namespace;225 }226 else if (cmdlet is RemoveCimInstanceCommand)227 {228 return (cmdlet as RemoveCimInstanceCommand).Namespace;229 }230 else if (cmdlet is SetCimInstanceCommand)231 {232 return (cmdlet as SetCimInstanceCommand).Namespace;233 }234 235 return null;236 }237 238 protected static CimSession[] GetCimSession(CimBaseCommand cmdlet)239 {240 if (cmdlet is GetCimInstanceCommand)241 {242 return (cmdlet as GetCimInstanceCommand).CimSession;243 }244 else if (cmdlet is RemoveCimInstanceCommand)245 {246 return (cmdlet as RemoveCimInstanceCommand).CimSession;247 }248 else if (cmdlet is SetCimInstanceCommand)249 {250 return (cmdlet as SetCimInstanceCommand).CimSession;251 }252 253 return null;254 }255 256 protected static string GetClassName(CimBaseCommand cmdlet)257 {258 if (cmdlet is GetCimInstanceCommand)259 {260 return (cmdlet as GetCimInstanceCommand).ClassName;261 }262 263 return null;264 }265 266 protected static string GetQuery(CimBaseCommand cmdlet)267 {268 if (cmdlet is GetCimInstanceCommand)269 {270 return (cmdlet as GetCimInstanceCommand).Query;271 }272 else if (cmdlet is RemoveCimInstanceCommand)273 {274 return (cmdlet as RemoveCimInstanceCommand).Query;275 }276 else if (cmdlet is SetCimInstanceCommand)277 {278 return (cmdlet as SetCimInstanceCommand).Query;279 }280 281 return null;282 }283 284 internal static bool IsClassNameQuerySet(CimBaseCommand cmdlet)285 {286 DebugHelper.WriteLogEx();287 if (cmdlet is GetCimInstanceCommand cmd)288 {289 if (cmd.QueryDialect != null || cmd.SelectProperties != null || cmd.Filter != null)290 {291 return true;292 }293 }294 295 return false;296 }297 298 protected static string CreateQuery(CimBaseCommand cmdlet)299 {300 DebugHelper.WriteLogEx();301 if (cmdlet is GetCimInstanceCommand cmd)302 {303 StringBuilder propertyList = new();304 if (cmd.SelectProperties == null)305 {306 propertyList.Append('*');307 }308 else309 {310 foreach (string property in cmd.SelectProperties)311 {312 if (propertyList.Length > 0)313 {314 propertyList.Append(',');315 }316 317 propertyList.Append(property);318 }319 }320 321 return (cmd.Filter == null) ?322 string.Format(CultureInfo.CurrentUICulture, queryWithoutWhere, propertyList, cmd.ClassName) :323 string.Format(CultureInfo.CurrentUICulture, queryWithWhere, propertyList, cmd.ClassName, cmd.Filter);324 }325 326 return null;327 }328 329 protected static string GetQueryDialect(CimBaseCommand cmdlet)330 {331 if (cmdlet is GetCimInstanceCommand)332 {333 return (cmdlet as GetCimInstanceCommand).QueryDialect;334 }335 else if (cmdlet is RemoveCimInstanceCommand)336 {337 return (cmdlet as RemoveCimInstanceCommand).QueryDialect;338 }339 else if (cmdlet is SetCimInstanceCommand)340 {341 return (cmdlet as SetCimInstanceCommand).QueryDialect;342 }343 344 return null;345 }346 347 protected static CimInstance GetCimInstanceParameter(CimBaseCommand cmdlet)348 {349 if (cmdlet is GetCimInstanceCommand)350 {351 return (cmdlet as GetCimInstanceCommand).CimInstance;352 }353 else if (cmdlet is RemoveCimInstanceCommand)354 {355 return (cmdlet as RemoveCimInstanceCommand).CimInstance;356 }357 else if (cmdlet is SetCimInstanceCommand)358 {359 return (cmdlet as SetCimInstanceCommand).CimInstance;360 }361 362 return null;363 }364 #endregion365 366 #region help methods367 368 /// <summary>369 /// <para>370 /// Set <see cref="CimSessionProxy"/> properties371 /// </para>372 /// </summary>373 /// <param name="proxy"></param>374 /// <param name="cmdlet"></param>375 private static void SetSessionProxyProperties(376 ref CimSessionProxy proxy,377 CimBaseCommand cmdlet)378 {379 if (cmdlet is GetCimInstanceCommand)380 {381 GetCimInstanceCommand getCimInstance = cmdlet as GetCimInstanceCommand;382 proxy.KeyOnly = getCimInstance.KeyOnly;383 proxy.Shallow = getCimInstance.Shallow;384 proxy.OperationTimeout = getCimInstance.OperationTimeoutSec;385 if (getCimInstance.ResourceUri != null)386 {387 proxy.ResourceUri = getCimInstance.ResourceUri;388 }389 }390 else if (cmdlet is RemoveCimInstanceCommand)391 {392 RemoveCimInstanceCommand removeCimInstance = cmdlet as RemoveCimInstanceCommand;393 proxy.OperationTimeout = removeCimInstance.OperationTimeoutSec;394 if (removeCimInstance.ResourceUri != null)395 {396 proxy.ResourceUri = removeCimInstance.ResourceUri;397 }398 399 CimRemoveCimInstanceContext context = new(400 ConstValue.GetNamespace(removeCimInstance.Namespace),401 proxy);402 proxy.ContextObject = context;403 }404 else if (cmdlet is SetCimInstanceCommand)405 {406 SetCimInstanceCommand setCimInstance = cmdlet as SetCimInstanceCommand;407 proxy.OperationTimeout = setCimInstance.OperationTimeoutSec;408 if (setCimInstance.ResourceUri != null)409 {410 proxy.ResourceUri = setCimInstance.ResourceUri;411 }412 413 CimSetCimInstanceContext context = new(414 ConstValue.GetNamespace(setCimInstance.Namespace),415 setCimInstance.Property,416 proxy,417 cmdlet.ParameterSetName,418 setCimInstance.PassThru);419 proxy.ContextObject = context;420 }421 }422 423 /// <summary>424 /// <para>425 /// Create <see cref="CimSessionProxy"/> and set properties.426 /// </para>427 /// </summary>428 /// <param name="computerName"></param>429 /// <param name="cmdlet"></param>430 /// <returns></returns>431 protected CimSessionProxy CreateSessionProxy(432 string computerName,433 CimBaseCommand cmdlet)434 {435 CimSessionProxy proxy = CreateCimSessionProxy(computerName);436 SetSessionProxyProperties(ref proxy, cmdlet);437 return proxy;438 }439 440 /// <summary>441 /// <para>442 /// Create <see cref="CimSessionProxy"/> and set properties.443 /// </para>444 /// </summary>445 /// <param name="computerName"></param>446 /// <param name="cimInstance"></param>447 /// <param name="cmdlet"></param>448 /// <returns></returns>449 protected CimSessionProxy CreateSessionProxy(450 string computerName,451 CimInstance cimInstance,452 CimBaseCommand cmdlet,453 bool passThru)454 {455 CimSessionProxy proxy = CreateCimSessionProxy(computerName, cimInstance, passThru);456 SetSessionProxyProperties(ref proxy, cmdlet);457 return proxy;458 }459 460 /// <summary>461 /// Create <see cref="CimSessionProxy"/> and set properties.462 /// </summary>463 /// <param name="session"></param>464 /// <param name="cmdlet"></param>465 /// <returns></returns>466 protected CimSessionProxy CreateSessionProxy(467 CimSession session,468 CimBaseCommand cmdlet)469 {470 CimSessionProxy proxy = CreateCimSessionProxy(session);471 SetSessionProxyProperties(ref proxy, cmdlet);472 return proxy;473 }474 475 /// <summary>476 /// <para>477 /// Create <see cref="CimSessionProxy"/> and set properties478 /// </para>479 /// </summary>480 /// <param name="computerName"></param>481 /// <param name="cimInstance"></param>482 /// <param name="cmdlet"></param>483 /// <returns></returns>484 protected CimSessionProxy CreateSessionProxy(485 string computerName,486 CimInstance cimInstance,487 CimBaseCommand cmdlet)488 {489 CimSessionProxy proxy = CreateCimSessionProxy(computerName, cimInstance);490 SetSessionProxyProperties(ref proxy, cmdlet);491 return proxy;492 }493 494 /// <summary>495 /// Create <see cref="CimSessionProxy"/> and set properties.496 /// </summary>497 /// <param name="session"></param>498 /// <param name="cmdlet"></param>499 /// <returns></returns>500 protected CimSessionProxy CreateSessionProxy(501 CimSession session,502 CimBaseCommand cmdlet,503 bool passThru)504 {505 CimSessionProxy proxy = CreateCimSessionProxy(session, passThru);506 SetSessionProxyProperties(ref proxy, cmdlet);507 return proxy;508 }509 510 /// <summary>511 /// Set <see cref="IObjectPreProcess"/> object to proxy to pre-process512 /// the result object if necessary.513 /// </summary>514 /// <param name="proxy"></param>515 /// <param name="cmdlet"></param>516 private static void SetPreProcess(CimSessionProxy proxy, GetCimInstanceCommand cmdlet)517 {518 if (cmdlet.KeyOnly || (cmdlet.SelectProperties != null))519 {520 proxy.ObjectPreProcess = new FormatPartialCimInstance();521 }522 }523 #endregion524 525 #region const strings526 /// <summary>527 /// Wql query format with where clause.528 /// </summary>529 private const string queryWithWhere = @"SELECT {0} FROM {1} WHERE {2}";530 531 /// <summary>532 /// Wql query format without where clause.533 /// </summary>534 private const string queryWithoutWhere = @"SELECT {0} FROM {1}";535 #endregion536 }537}538 