From d85c46930f503d82121fe6b3bd8461f3175d4781 Mon Sep 17 00:00:00 2001 From: David Sparer Date: Sat, 10 Feb 2018 21:13:20 -0600 Subject: [PATCH] added class for testing rdp version suppport --- .../Protocol/RDP/Enums/RdpVersion.cs | 16 +++++++ .../Connection/Protocol/RDP/RdpProtocol10.cs | 1 + .../Connection/Protocol/RDP/RdpProtocol6.cs | 10 ++-- .../Connection/Protocol/RDP/RdpProtocol7.cs | 1 + .../Connection/Protocol/RDP/RdpProtocol8.cs | 3 +- .../Connection/Protocol/RDP/RdpProtocol9.cs | 1 + .../Protocol/RDP/RdpProtocolFactory.cs | 9 +++- .../Protocol/RDP/RdpSupportTester.cs | 46 +++++++++++++++++++ mRemoteV1/mRemoteV1.csproj | 1 + 9 files changed, 82 insertions(+), 6 deletions(-) create mode 100644 mRemoteV1/Connection/Protocol/RDP/RdpSupportTester.cs diff --git a/mRemoteV1/Connection/Protocol/RDP/Enums/RdpVersion.cs b/mRemoteV1/Connection/Protocol/RDP/Enums/RdpVersion.cs index ee667343e..12c7dc502 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 e273cd11d..9e8f78d98 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 b239110ad..b6a86bb46 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 2522d0279..05d3c8e80 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 b4c15437e..8d75ca598 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 65f1c7a61..a41b38128 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 eb8ce69ef..7bdb77e1c 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 000000000..5fc633adf --- /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 8be1a59b3..2bbaf14c3 100644 --- a/mRemoteV1/mRemoteV1.csproj +++ b/mRemoteV1/mRemoteV1.csproj @@ -252,6 +252,7 @@ +