MegaBites-AI/Windows-powershell
0372
1// Copyright (c) Microsoft Corporation.2// Licensed under the MIT License.3 4#region Using directives5 6using System;7using System.Collections;8using System.Collections.Generic;9using System.Linq;10using System.Management.Automation;11 12#endregion13 14namespace Microsoft.Management.Infrastructure.CimCmdlets15{16 /// <summary>17 /// Containing all information originated from18 /// the parameters of <see cref="NewCimInstanceCommand"/>19 /// </summary>20 internal class CimNewCimInstanceContext : XOperationContextBase21 {22 /// <summary>23 /// Initializes a new instance of the <see cref="CimNewCimInstanceContext"/> class.24 /// </summary>25 /// <param name="methodName"></param>26 /// <param name="propertyName"></param>27 /// <param name="qualifierName"></param>28 internal CimNewCimInstanceContext(29 CimSessionProxy theProxy,30 string theNamespace)31 {32 this.proxy = theProxy;33 this.nameSpace = theNamespace;34 }35 }36 37 /// <summary>38 /// <para>39 /// Implements operations of new-ciminstance cmdlet.40 /// </para>41 /// </summary>42 internal sealed class CimNewCimInstance : CimAsyncOperation43 {44 /// <summary>45 /// Initializes a new instance of the <see cref="CimNewCimInstance"/> class.46 /// <para>47 /// Constructor48 /// </para>49 /// </summary>50 public CimNewCimInstance()51 : base()52 {53 }54 55 /// <summary>56 /// <para>57 /// Base on parametersetName to create ciminstances,58 /// either remotely or locally59 /// </para>60 /// </summary>61 /// <param name="cmdlet"><see cref="GetCimInstanceCommand"/> object.</param>62 public void NewCimInstance(NewCimInstanceCommand cmdlet)63 {64 DebugHelper.WriteLogEx();65 66 string nameSpace;67 CimInstance cimInstance = null;68 try69 {70 switch (cmdlet.ParameterSetName)71 {72 case CimBaseCommand.ClassNameComputerSet:73 case CimBaseCommand.ClassNameSessionSet:74 {75 nameSpace = ConstValue.GetNamespace(cmdlet.Namespace);76 cimInstance = CreateCimInstance(cmdlet.ClassName,77 nameSpace,78 cmdlet.Key,79 cmdlet.Property,80 cmdlet);81 }82 83 break;84 case CimBaseCommand.ResourceUriSessionSet:85 case CimBaseCommand.ResourceUriComputerSet:86 {87 nameSpace = cmdlet.Namespace; // passing null is ok for resourceUri set88 cimInstance = CreateCimInstance("DummyClass",89 nameSpace,90 cmdlet.Key,91 cmdlet.Property,92 cmdlet);93 }94 95 break;96 case CimBaseCommand.CimClassComputerSet:97 case CimBaseCommand.CimClassSessionSet:98 {99 nameSpace = ConstValue.GetNamespace(cmdlet.CimClass.CimSystemProperties.Namespace);100 cimInstance = CreateCimInstance(cmdlet.CimClass,101 cmdlet.Property,102 cmdlet);103 }104 105 break;106 default:107 return;108 }109 }110 catch (ArgumentNullException e)111 {112 cmdlet.ThrowTerminatingError(e, action);113 return;114 }115 catch (ArgumentException e)116 {117 cmdlet.ThrowTerminatingError(e, action);118 return;119 }120 121 // return if create client only ciminstance122 if (cmdlet.ClientOnly)123 {124 cmdlet.CmdletOperation.WriteObject(cimInstance, null);125 return;126 }127 128 string target = cimInstance.ToString();129 if (!cmdlet.ShouldProcess(target, action))130 {131 return;132 }133 134 // create ciminstance on server135 List<CimSessionProxy> proxys = new();136 137 switch (cmdlet.ParameterSetName)138 {139 case CimBaseCommand.ClassNameComputerSet:140 case CimBaseCommand.CimClassComputerSet:141 case CimBaseCommand.ResourceUriComputerSet:142 {143 IEnumerable<string> computerNames = ConstValue.GetComputerNames(144 cmdlet.ComputerName);145 foreach (string computerName in computerNames)146 {147 proxys.Add(CreateSessionProxy(computerName, cmdlet));148 }149 }150 151 break;152 case CimBaseCommand.CimClassSessionSet:153 case CimBaseCommand.ClassNameSessionSet:154 case CimBaseCommand.ResourceUriSessionSet:155 foreach (CimSession session in cmdlet.CimSession)156 {157 proxys.Add(CreateSessionProxy(session, cmdlet));158 }159 160 break;161 }162 163 foreach (CimSessionProxy proxy in proxys)164 {165 proxy.ContextObject = new CimNewCimInstanceContext(proxy, nameSpace);166 proxy.CreateInstanceAsync(nameSpace, cimInstance);167 }168 }169 170 #region Get CimInstance after creation (on server)171 172 /// <summary>173 /// <para>174 /// Get full <see cref="CimInstance"/> from server based on the key175 /// </para>176 /// </summary>177 /// <param name="cimInstance"></param>178 internal void GetCimInstance(CimInstance cimInstance, XOperationContextBase context)179 {180 DebugHelper.WriteLogEx();181 182 if (context is not CimNewCimInstanceContext newCimInstanceContext)183 {184 DebugHelper.WriteLog("Invalid (null) CimNewCimInstanceContext", 1);185 return;186 }187 188 CimSessionProxy proxy = CreateCimSessionProxy(newCimInstanceContext.Proxy);189 string nameSpace = cimInstance.CimSystemProperties.Namespace ?? newCimInstanceContext.Namespace;190 proxy.GetInstanceAsync(nameSpace, cimInstance);191 }192 193 #endregion194 195 #region private methods196 197 /// <summary>198 /// <para>199 /// Set <see cref="CimSessionProxy"/> properties200 /// </para>201 /// </summary>202 /// <param name="proxy"></param>203 /// <param name="cmdlet"></param>204 private static void SetSessionProxyProperties(205 ref CimSessionProxy proxy,206 NewCimInstanceCommand cmdlet)207 {208 proxy.OperationTimeout = cmdlet.OperationTimeoutSec;209 if (cmdlet.ResourceUri != null)210 {211 proxy.ResourceUri = cmdlet.ResourceUri;212 }213 }214 215 /// <summary>216 /// <para>217 /// Create <see cref="CimSessionProxy"/> and set properties218 /// </para>219 /// </summary>220 /// <param name="computerName"></param>221 /// <param name="cmdlet"></param>222 /// <returns></returns>223 private CimSessionProxy CreateSessionProxy(224 string computerName,225 NewCimInstanceCommand cmdlet)226 {227 CimSessionProxy proxy = new CimSessionProxyNewCimInstance(computerName, this);228 this.SubscribeEventAndAddProxytoCache(proxy);229 SetSessionProxyProperties(ref proxy, cmdlet);230 return proxy;231 }232 233 /// <summary>234 /// Create <see cref="CimSessionProxy"/> and set properties.235 /// </summary>236 /// <param name="session"></param>237 /// <param name="cmdlet"></param>238 /// <returns></returns>239 private CimSessionProxy CreateSessionProxy(240 CimSession session,241 NewCimInstanceCommand cmdlet)242 {243 CimSessionProxy proxy = new CimSessionProxyNewCimInstance(session, this);244 this.SubscribeEventAndAddProxytoCache(proxy);245 SetSessionProxyProperties(ref proxy, cmdlet);246 return proxy;247 }248 249 /// <summary>250 /// <para>251 /// Create <see cref="CimInstance"/> with given properties.252 /// </para>253 /// </summary>254 /// <param name="className"></param>255 /// <param name="key"></param>256 /// <param name="properties"></param>257 /// <param name="cmdlet"></param>258 /// <returns></returns>259 /// <exception cref="ArgumentNullException">See CimProperty.Create.</exception>260 /// <exception cref="ArgumentException">CimProperty.Create.</exception>261 private CimInstance CreateCimInstance(262 string className,263 string cimNamespace,264 IEnumerable<string> key,265 IDictionary properties,266 NewCimInstanceCommand cmdlet)267 {268 CimInstance cimInstance = new(className, cimNamespace);269 if (properties == null)270 {271 return cimInstance;272 }273 274 List<string> keys = new();275 if (key != null)276 {277 foreach (string keyName in key)278 {279 keys.Add(keyName);280 }281 }282 283 IDictionaryEnumerator enumerator = properties.GetEnumerator();284 while (enumerator.MoveNext())285 {286 CimFlags flag = CimFlags.None;287 string propertyName = enumerator.Key.ToString().Trim();288 if (keys.Contains(propertyName, StringComparer.OrdinalIgnoreCase))289 {290 flag = CimFlags.Key;291 }292 293 object propertyValue = GetBaseObject(enumerator.Value);294 295 DebugHelper.WriteLog("Create and add new property to ciminstance: name = {0}; value = {1}; flags = {2}", 5, propertyName, propertyValue, flag);296 297 if (propertyValue is PSReference cimReference)298 {299 CimProperty newProperty = CimProperty.Create(propertyName, GetBaseObject(cimReference.Value), CimType.Reference, flag);300 cimInstance.CimInstanceProperties.Add(newProperty);301 }302 else303 {304 CimProperty newProperty = CimProperty.Create(305 propertyName,306 propertyValue,307 flag);308 cimInstance.CimInstanceProperties.Add(newProperty);309 }310 }311 312 return cimInstance;313 }314 315 /// <summary>316 /// <para>317 /// Create <see cref="CimInstance"/> with given properties.318 /// </para>319 /// </summary>320 /// <param name="cimClass"></param>321 /// <param name="properties"></param>322 /// <param name="cmdlet"></param>323 /// <returns></returns>324 /// <exception cref="ArgumentNullException">See CimProperty.Create.</exception>325 /// <exception cref="ArgumentException">CimProperty.Create.</exception>326 private CimInstance CreateCimInstance(327 CimClass cimClass,328 IDictionary properties,329 NewCimInstanceCommand cmdlet)330 {331 CimInstance cimInstance = new(cimClass);332 if (properties == null)333 {334 return cimInstance;335 }336 337 List<string> notfoundProperties = new();338 foreach (string property in properties.Keys)339 {340 if (cimInstance.CimInstanceProperties[property] == null)341 {342 notfoundProperties.Add(property);343 cmdlet.ThrowInvalidProperty(notfoundProperties, cmdlet.CimClass.CimSystemProperties.ClassName, @"Property", action, properties);344 return null;345 }346 347 object propertyValue = GetBaseObject(properties[property]);348 cimInstance.CimInstanceProperties[property].Value = propertyValue;349 }350 351 return cimInstance;352 }353 354 #endregion355 356 #region const strings357 /// <summary>358 /// Action.359 /// </summary>360 private const string action = @"New-CimInstance";361 #endregion362 }363}364 