/// <summary>
        /// Establish a RDP connection to detect RDP feature
        /// </summary>
        /// <returns>Return true if detection succeeded.</returns>
        public bool DetectRDPFeature(Configs config)
        {
            try
            {
                DetectorUtil.WriteLog("Establish RDP connection with SUT...");

                Initialize(config);
                ConnectRDPServer();

                try
                {
                    bool status = EstablishRDPConnection(
                        config, requestedProtocol, SVCNames,
                        CompressionType.PACKET_COMPR_TYPE_NONE,
                        false,
                        true,
                        false,
                        false,
                        false,
                        false,
                        false);
                    if (!status)
                    {
                        DetectorUtil.WriteLog("Failed", false, LogStyle.StepFailed);
                        return(false);
                    }
                }
                catch (Exception e)
                {
                    DetectorUtil.WriteLog("" + e.StackTrace);
                }

                DetectorUtil.WriteLog("Passed", false, LogStyle.StepPassed);

                CheckSupportedFeatures();

                CheckSupportedProtocols();

                config.RDPEDYCSupported = detectInfo.IsSupportRDPEDYC.ToString();

                config.RDPELESupported = detectInfo.IsSupportRDPELE.ToString();

                SetRdpVersion(config);
            }
            catch (Exception e)
            {
                DetectorUtil.WriteLog("Exception occured when establishing RDP connection: " + e.Message);
                DetectorUtil.WriteLog("" + e.StackTrace);
                if (e.InnerException != null)
                {
                    DetectorUtil.WriteLog("**" + e.InnerException.Message);
                    DetectorUtil.WriteLog("**" + e.InnerException.StackTrace);
                }
                DetectorUtil.WriteLog("Failed", false, LogStyle.StepFailed);
                return(false);
            }


            // Disconnect
            ClientInitiatedDisconnect();
            Disconnect();

            DetectorUtil.WriteLog("Passed", false, LogStyle.StepPassed);
            return(true);
        }
        private bool EstablishRDPConnection(
            Configs config,
            requestedProtocols_Values requestedProtocols,
            string[] SVCNames,
            CompressionType highestCompressionTypeSupported,
            bool isReconnect                   = false,
            bool autoLogon                     = false,
            bool supportEGFX                   = false,
            bool supportAutoDetect             = false,
            bool supportHeartbeatPDU           = false,
            bool supportMultitransportReliable = false,
            bool supportMultitransportLossy    = false,
            bool supportAutoReconnect          = false,
            bool supportFastPathInput          = false,
            bool supportFastPathOutput         = false,
            bool supportSurfaceCommands        = false,
            bool supportSVCCompression         = false,
            bool supportRemoteFXCodec          = false)
        {
            // Connection Initiation
            SendClientX224ConnectionRequest(requestedProtocols);
            Server_X_224_Connection_Confirm_Pdu connectionConfirmPdu = ExpectPacket <Server_X_224_Connection_Confirm_Pdu>(new TimeSpan(0, 0, 60));

            if (connectionConfirmPdu == null)
            {
                TimeSpan waitTime = new TimeSpan(0, 0, 1);
                Server_X_224_Negotiate_Failure_Pdu failurePdu = ExpectPacket <Server_X_224_Negotiate_Failure_Pdu>(waitTime);
                if (failurePdu != null)
                {
                    DetectorUtil.WriteLog("Received a Server X224 Connection confirm with RDP_NEG_FAILURE structure.");
                }
                DetectorUtil.WriteLog("Expecting a Server X224 Connection Confirm PDU.");
                return(false);
            }

            // Basic Settings Exchange
            SendClientMCSConnectInitialPDU(
                SVCNames,
                supportEGFX,
                supportAutoDetect,
                supportHeartbeatPDU,
                supportMultitransportReliable,
                supportMultitransportLossy,
                false);
            connectResponsePdu = ExpectPacket <Server_MCS_Connect_Response_Pdu_with_GCC_Conference_Create_Response>(timeout);
            if (connectResponsePdu == null)
            {
                return(false);
            }

            bool serverSupportUDPFECR = false;
            bool serverSupportUDPFECL = false;

            if (connectResponsePdu.mcsCrsp.gccPdu.serverMultitransportChannelData != null)
            {
                if (connectResponsePdu.mcsCrsp.gccPdu.serverMultitransportChannelData.flags.HasFlag(MULTITRANSPORT_TYPE_FLAGS.TRANSPORTTYPE_UDPFECR))
                {
                    serverSupportUDPFECR = true;
                }
                if (connectResponsePdu.mcsCrsp.gccPdu.serverMultitransportChannelData.flags.HasFlag(MULTITRANSPORT_TYPE_FLAGS.TRANSPORTTYPE_UDPFECL))
                {
                    serverSupportUDPFECL = true;
                }
            }
            detectInfo.IsSupportRDPEMT = serverSupportUDPFECR || serverSupportUDPFECL;

            // Channel Connection
            SendClientMCSErectDomainRequest();
            SendClientMCSAttachUserRequest();
            Server_MCS_Attach_User_Confirm_Pdu userConfirmPdu = ExpectPacket <Server_MCS_Attach_User_Confirm_Pdu>(timeout);

            if (userConfirmPdu == null)
            {
                return(false);
            }
            ChannelJoinRequestAndConfirm();

            // RDP Security Commencement
            if (rdpbcgrClient.Context.ServerSelectedProtocol == (uint)selectedProtocols_Values.PROTOCOL_RDP_FLAG)
            {
                SendClientSecurityExchangePDU();
            }

            // Secure Settings Exchange
            SendClientInfoPDU(config, highestCompressionTypeSupported, isReconnect, autoLogon);
            rdpeleClient = new RdpeleClient(rdpbcgrClient);

            try
            {
                detectInfo.IsSupportRDPELE = ProcessLicenseSequence(config, timeout);
            }
            catch
            {
                detectInfo.IsSupportRDPELE = false;
            }
            rdpeleClient.Dispose();

            // Capabilities Exchange
            Server_Demand_Active_Pdu demandActivePdu = ExpectPacket <Server_Demand_Active_Pdu>(timeout);

            if (demandActivePdu == null)
            {
                return(false);
            }
            SendClientConfirmActivePDU(
                supportAutoReconnect,
                supportFastPathInput,
                supportFastPathOutput,
                supportSVCCompression);

            // Connection Finalization
            SendClientSynchronizePDU();
            Server_Synchronize_Pdu syncPdu = ExpectPacket <Server_Synchronize_Pdu>(timeout);

            if (syncPdu == null)
            {
                return(false);
            }
            Server_Control_Pdu_Cooperate CoopControlPdu = ExpectPacket <Server_Control_Pdu_Cooperate>(timeout);

            if (CoopControlPdu == null)
            {
                return(false);
            }
            SendClientControlCooperatePDU();
            SendClientControlRequestPDU();
            Server_Control_Pdu_Granted_Control grantedControlPdu = ExpectPacket <Server_Control_Pdu_Granted_Control>(timeout);

            if (grantedControlPdu == null)
            {
                return(false);
            }
            SendClientFontListPDU();
            Server_Font_Map_Pdu fontMapPdu = ExpectPacket <Server_Font_Map_Pdu>(timeout);

            if (fontMapPdu == null)
            {
                return(false);
            }
            return(true);
        }
        private void SetRdpVersion(Configs config)
        {
            DetectorUtil.WriteLog("Detect RDP version...");

            config.Version = DetectorUtil.GetPropertyValue("RDP.Version");

            if (connectResponsePdu.mcsCrsp.gccPdu.serverCoreData == null)
            {
                DetectorUtil.WriteLog("Failed", false, LogStyle.StepFailed);
                DetectorUtil.WriteLog("Detect RDP version failed, serverCoreData in Server_MCS_Connect_Response_Pdu_with_GCC_Conference_Create_Response does not exist!");
            }

            TS_UD_SC_CORE_version_Values rdpVersion = connectResponsePdu.mcsCrsp.gccPdu.serverCoreData.version;

            if (rdpVersion == TS_UD_SC_CORE_version_Values.V1)
            {
                config.Version = "4.0";
            }
            else if (rdpVersion == TS_UD_SC_CORE_version_Values.V2)
            {
                config.Version = "8.1"; // RDP 5.0, 5.1, 5.2, 6.0, 6.1, 7.0, 7.1, 8.0, and 8.1 servers
            }
            else if (rdpVersion == TS_UD_SC_CORE_version_Values.V3)
            {
                config.Version = "10.0";
            }
            else if (rdpVersion == TS_UD_SC_CORE_version_Values.V4)
            {
                config.Version = "10.1";
            }
            else if (rdpVersion == TS_UD_SC_CORE_version_Values.V5)
            {
                config.Version = "10.2";
            }
            else if (rdpVersion == TS_UD_SC_CORE_version_Values.V6)
            {
                config.Version = "10.3";
            }
            else if (rdpVersion == TS_UD_SC_CORE_version_Values.V7)
            {
                config.Version = "10.4";
            }
            else if (rdpVersion == TS_UD_SC_CORE_version_Values.V8)
            {
                config.Version = "10.5";
            }
            else if (rdpVersion == TS_UD_SC_CORE_version_Values.V9)
            {
                config.Version = "10.6";
            }
            else if (rdpVersion == TS_UD_SC_CORE_version_Values.V10)
            {
                config.Version = "10.7";
            }
            else
            {
                DetectorUtil.WriteLog("Failed", false, LogStyle.StepFailed);
                DetectorUtil.WriteLog("Detect RDP version failed, unknown version detected!");
            }

            detectInfo.Version = connectResponsePdu.mcsCrsp.gccPdu.serverCoreData.version;

            DetectorUtil.WriteLog("Passed", false, LogStyle.StepPassed);
            DetectorUtil.WriteLog("Detect RDP version finished.");
        }
Example #4
0
        /// <summary>
        /// Establish a RDP connection to detect RDP feature
        /// </summary>
        /// <returns>Return true if detection succeeded.</returns>
        public bool DetectRDPFeature(Configs config)
        {
            try
            {
                logWriter.AddLog(DetectLogLevel.Information, "Establish RDP connection with SUT...");

                Initialize(config);
                ConnectRDPServer();

                try
                {
                    bool status = EstablishRDPConnection(
                        config, requestedProtocol, SVCNames,
                        CompressionType.PACKET_COMPR_TYPE_NONE,
                        false,
                        true,
                        false,
                        false,
                        true,
                        true,
                        false);
                    if (!status)
                    {
                        logWriter.AddLog(DetectLogLevel.Warning, "Failed", false, LogStyle.StepFailed);
                        return(false);
                    }
                }
                catch (Exception e)
                {
                    logWriter.AddLog(DetectLogLevel.Information, string.Format("ErrorMessage:{0}{1}StackTrace:{2}", e.Message, Environment.NewLine, e.StackTrace));
                    logWriter.AddLog(DetectLogLevel.Warning, "Failed", false, LogStyle.StepFailed);
                    return(false);
                }

                logWriter.AddLog(DetectLogLevel.Warning, "Finished", false, LogStyle.StepPassed);

                CheckSupportedFeatures();

                CheckSupportedProtocols();

                config.RDPEDYCSupported = detectInfo.IsSupportRDPEDYC.ToString();

                config.RDPELESupported = detectInfo.IsSupportRDPELE.ToString();

                SetRdpVersion(config);
            }
            catch (Exception e)
            {
                logWriter.AddLog(DetectLogLevel.Information, string.Format("Exception occured when establishing RDP connection.{1} ErrorMessage:{0}{1}StackTrace:{2}", e.Message, Environment.NewLine, e.StackTrace));

                if (e.InnerException != null)
                {
                    logWriter.AddLog(DetectLogLevel.Information, string.Format("ErrorMessage:{0}{1}StackTrace:{2}", e.InnerException.Message, Environment.NewLine, e.InnerException.StackTrace));
                }
                logWriter.AddLog(DetectLogLevel.Warning, "Failed", false, LogStyle.StepFailed);
                return(false);
            }


            // Disconnect
            ClientInitiatedDisconnect();
            Disconnect();

            logWriter.AddLog(DetectLogLevel.Warning, "Finished", true, LogStyle.StepPassed);
            return(true);
        }