diff --git a/mRemoteV1/Connection/Protocol/RDP/Enums/RdpVersion.cs b/mRemoteV1/Connection/Protocol/RDP/Enums/RdpVersion.cs index ee667343..12c7dc50 100644 --- a/mRemoteV1/Connection/Protocol/RDP/Enums/RdpVersion.cs +++ b/mRemoteV1/Connection/Protocol/RDP/Enums/RdpVersion.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; namespace mRemoteNG.Connection.Protocol.RDP { @@ -22,4 +23,19 @@ namespace mRemoteNG.Connection.Protocol.RDP Rdc9, Rdc10 } + + public static class RdpVersionEnumExtensions + { + public static IEnumerable GetAll(this RdpVersionEnum versionEnum) + { + return new[] + { + RdpVersionEnum.Rdc6, + RdpVersionEnum.Rdc7, + RdpVersionEnum.Rdc8, + RdpVersionEnum.Rdc9, + RdpVersionEnum.Rdc10 + }; + } + } } diff --git a/mRemoteV1/Connection/Protocol/RDP/RdpProtocol10.cs b/mRemoteV1/Connection/Protocol/RDP/RdpProtocol10.cs index e273cd11..9e8f78d9 100644 --- a/mRemoteV1/Connection/Protocol/RDP/RdpProtocol10.cs +++ b/mRemoteV1/Connection/Protocol/RDP/RdpProtocol10.cs @@ -8,6 +8,7 @@ namespace mRemoteNG.Connection.Protocol.RDP public RdpProtocol10() { Control = new AxMsRdpClient10NotSafeForScripting(); + RdpVersionEnum = RdpVersionEnum.Rdc10; } protected override MsRdpClient6NotSafeForScripting CreateRdpClientControl() diff --git a/mRemoteV1/Connection/Protocol/RDP/RdpProtocol6.cs b/mRemoteV1/Connection/Protocol/RDP/RdpProtocol6.cs index b239110a..b6a86bb4 100644 --- a/mRemoteV1/Connection/Protocol/RDP/RdpProtocol6.cs +++ b/mRemoteV1/Connection/Protocol/RDP/RdpProtocol6.cs @@ -77,15 +77,18 @@ namespace mRemoteNG.Connection.Protocol.RDP } public bool LoadBalanceInfoUseUtf8 { get; set; } - #endregion + + public RdpVersionEnum RdpVersionEnum { get; protected set; } + + #endregion public RdpProtocol6() { Control = new AxMsRdpClient6NotSafeForScripting(); Connecting += OnConnectingDebugMessage; + RdpVersionEnum = RdpVersionEnum.Rdc6; } - #region Public Methods public override bool Initialize() @@ -554,7 +557,8 @@ namespace mRemoteNG.Connection.Protocol.RDP private void OnConnectingDebugMessage(object sender, EventArgs args) { - Runtime.MessageCollector.AddMessage(MessageClass.InformationMsg, $"Using RDP version: {ConnectionInfo.RdpProtocolVersion}"); + Runtime.MessageCollector.AddMessage(MessageClass.DebugMsg, + $"Connection requested RDP version: '{ConnectionInfo.RdpProtocolVersion}'. Using RDP provider: '{sender.GetType().Name}'"); } #endregion diff --git a/mRemoteV1/Connection/Protocol/RDP/RdpProtocol7.cs b/mRemoteV1/Connection/Protocol/RDP/RdpProtocol7.cs index 2522d027..05d3c8e8 100644 --- a/mRemoteV1/Connection/Protocol/RDP/RdpProtocol7.cs +++ b/mRemoteV1/Connection/Protocol/RDP/RdpProtocol7.cs @@ -8,6 +8,7 @@ namespace mRemoteNG.Connection.Protocol.RDP public RdpProtocol7() { Control = new AxMsRdpClient7NotSafeForScripting(); + RdpVersionEnum = RdpVersionEnum.Rdc7; } protected override MsRdpClient6NotSafeForScripting CreateRdpClientControl() diff --git a/mRemoteV1/Connection/Protocol/RDP/RdpProtocol8.cs b/mRemoteV1/Connection/Protocol/RDP/RdpProtocol8.cs index b4c15437..8d75ca59 100644 --- a/mRemoteV1/Connection/Protocol/RDP/RdpProtocol8.cs +++ b/mRemoteV1/Connection/Protocol/RDP/RdpProtocol8.cs @@ -42,7 +42,8 @@ namespace mRemoteNG.Connection.Protocol.RDP public RdpProtocol8() { Control = new AxMsRdpClient8NotSafeForScripting(); - } + RdpVersionEnum = RdpVersionEnum.Rdc8; + } public override bool Initialize() { diff --git a/mRemoteV1/Connection/Protocol/RDP/RdpProtocol9.cs b/mRemoteV1/Connection/Protocol/RDP/RdpProtocol9.cs index 65f1c7a6..a41b3812 100644 --- a/mRemoteV1/Connection/Protocol/RDP/RdpProtocol9.cs +++ b/mRemoteV1/Connection/Protocol/RDP/RdpProtocol9.cs @@ -8,6 +8,7 @@ namespace mRemoteNG.Connection.Protocol.RDP public RdpProtocol9() { Control = new AxMsRdpClient9NotSafeForScripting(); + RdpVersionEnum = RdpVersionEnum.Rdc9; } protected override MsRdpClient6NotSafeForScripting CreateRdpClientControl() diff --git a/mRemoteV1/Connection/Protocol/RDP/RdpProtocolFactory.cs b/mRemoteV1/Connection/Protocol/RDP/RdpProtocolFactory.cs index eb8ce69e..7bdb77e1 100644 --- a/mRemoteV1/Connection/Protocol/RDP/RdpProtocolFactory.cs +++ b/mRemoteV1/Connection/Protocol/RDP/RdpProtocolFactory.cs @@ -2,12 +2,17 @@ { public class RdpProtocolFactory { - public ProtocolBase CreateProtocol(ConnectionInfo connectionInfo) + public ProtocolBase CreateProtocol(ConnectionInfo connectionInfo) + { + return CreateProtocol(connectionInfo.RdpProtocolVersion); + } + + public ProtocolBase CreateProtocol(RdpVersionEnum version) { RdpProtocol6 newProtocol = null; // ReSharper disable once SwitchStatementMissingSomeCases - switch (connectionInfo.RdpProtocolVersion) + switch (version) { case RdpVersionEnum.Rdc6: newProtocol = new RdpProtocol6(); diff --git a/mRemoteV1/Connection/Protocol/RDP/RdpSupportTester.cs b/mRemoteV1/Connection/Protocol/RDP/RdpSupportTester.cs new file mode 100644 index 00000000..5fc633ad --- /dev/null +++ b/mRemoteV1/Connection/Protocol/RDP/RdpSupportTester.cs @@ -0,0 +1,46 @@ +using System; +using System.Collections.Generic; + +namespace mRemoteNG.Connection.Protocol.RDP +{ + public class RdpSupportTester + { + /// + /// Returns a list of the RDP versions that can be used on the current + /// host. + /// + /// + public List GetSupportedRdpVersions() + { + var supportedVersions = new List(); + var rdpFactory = new RdpProtocolFactory(); + + foreach (var version in RdpVersionEnum.Rdc6.GetAll()) + { + var protocol = rdpFactory.CreateProtocol(version); + if (RdpClientIsSupported(protocol)) + supportedVersions.Add(version); + } + + return supportedVersions; + } + + private bool RdpClientIsSupported(ProtocolBase rdpProtocol) + { + try + { + rdpProtocol.Initialize(); + } + catch (Exception) + { + return false; + } + finally + { + rdpProtocol.Close(); + } + + return true; + } + } +} diff --git a/mRemoteV1/mRemoteV1.csproj b/mRemoteV1/mRemoteV1.csproj index 8be1a59b..2bbaf14c 100644 --- a/mRemoteV1/mRemoteV1.csproj +++ b/mRemoteV1/mRemoteV1.csproj @@ -252,6 +252,7 @@ +