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.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