Team Ai
Datasetpublic

MegaBites-AI/Windows-powershell

sourceHugging Facemitupdated 6mo agoView on Hugging Face
0likes372downloads
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