/// <summary>
        /// Report the failure of connecting to the target computer
        /// </summary>
        /// <param name="Type">What connection type failed?</param>
        public void ReportFailure(ManagementConnectionType Type)
        {
            switch (Type)
            {
            case ManagementConnectionType.CimRM:
                CimRM     = ManagementConnectionProtocolState.Error;
                LastCimRM = DateTime.Now;
                break;

            case ManagementConnectionType.CimDCOM:
                CimDCOM     = ManagementConnectionProtocolState.Error;
                LastCimDCOM = DateTime.Now;
                break;

            case ManagementConnectionType.Wmi:
                Wmi     = ManagementConnectionProtocolState.Error;
                LastWmi = DateTime.Now;
                break;

            case ManagementConnectionType.PowerShellRemoting:
                PowerShellRemoting     = ManagementConnectionProtocolState.Error;
                LastPowerShellRemoting = DateTime.Now;
                break;
            }
        }
        /// <summary>
        /// Returns the next connection type to try.
        /// </summary>
        /// <param name="ExcludedTypes">Exclude any type already tried and failed</param>
        /// <param name="Force">Overrides the timeout on bad connections</param>
        /// <returns>The next type to try.</returns>
        public ManagementConnectionType GetConnectionType(ManagementConnectionType ExcludedTypes, bool Force)
        {
            ManagementConnectionType temp = ExcludedTypes | DisabledConnectionTypes;

            #region Use working connections first

            if (((ManagementConnectionType.CimRM & temp) == 0) &&
                ((CimRM & ManagementConnectionProtocolState.Success) != 0))
            {
                return(ManagementConnectionType.CimRM);
            }

            if (((ManagementConnectionType.CimDCOM & temp) == 0) &&
                ((CimDCOM & ManagementConnectionProtocolState.Success) != 0))
            {
                return(ManagementConnectionType.CimDCOM);
            }

            if (((ManagementConnectionType.Wmi & temp) == 0) && ((Wmi & ManagementConnectionProtocolState.Success) != 0))
            {
                return(ManagementConnectionType.Wmi);
            }

            if (((ManagementConnectionType.PowerShellRemoting & temp) == 0) &&
                ((PowerShellRemoting & ManagementConnectionProtocolState.Success) != 0))
            {
                return(ManagementConnectionType.PowerShellRemoting);
            }

            #endregion Use working connections first

            #region Then prefer unknown connections

            if (((ManagementConnectionType.CimRM & temp) == 0) &&
                ((CimRM & ManagementConnectionProtocolState.Unknown) != 0))
            {
                return(ManagementConnectionType.CimRM);
            }

            if (((ManagementConnectionType.CimDCOM & temp) == 0) &&
                ((CimDCOM & ManagementConnectionProtocolState.Unknown) != 0))
            {
                return(ManagementConnectionType.CimDCOM);
            }

            if (((ManagementConnectionType.Wmi & temp) == 0) && ((Wmi & ManagementConnectionProtocolState.Unknown) != 0))
            {
                return(ManagementConnectionType.Wmi);
            }

            if (((ManagementConnectionType.PowerShellRemoting & temp) == 0) &&
                ((PowerShellRemoting & ManagementConnectionProtocolState.Unknown) != 0))
            {
                return(ManagementConnectionType.PowerShellRemoting);
            }

            #endregion Then prefer unknown connections

            #region Finally try what would not work previously

            if (((ManagementConnectionType.CimRM & temp) == 0) &&
                ((CimRM & ManagementConnectionProtocolState.Error) != 0) &&
                ((LastCimRM + ConnectionHost.BadConnectionTimeout < DateTime.Now) | Force))
            {
                return(ManagementConnectionType.CimRM);
            }

            if (((ManagementConnectionType.CimDCOM & temp) == 0) &&
                ((CimDCOM & ManagementConnectionProtocolState.Error) != 0) &&
                ((LastCimDCOM + ConnectionHost.BadConnectionTimeout < DateTime.Now) | Force))
            {
                return(ManagementConnectionType.CimDCOM);
            }

            if (((ManagementConnectionType.Wmi & temp) == 0) && ((Wmi & ManagementConnectionProtocolState.Error) != 0) &&
                ((LastWmi + ConnectionHost.BadConnectionTimeout < DateTime.Now) | Force))
            {
                return(ManagementConnectionType.Wmi);
            }

            if (((ManagementConnectionType.PowerShellRemoting & temp) == 0) &&
                ((PowerShellRemoting & ManagementConnectionProtocolState.Error) != 0) &&
                ((LastPowerShellRemoting + ConnectionHost.BadConnectionTimeout < DateTime.Now) | Force))
            {
                return(ManagementConnectionType.PowerShellRemoting);
            }

            #endregion Finally try what would not work previously

            // Do not try to use disabled protocols

            throw new PSInvalidOperationException("No connectiontypes left to try.");
        }