diff --git a/mRemoteNG/Config/Serializers/ConnectionSerializers/Csv/CsvConnectionsDeserializerMremotengFormat.cs b/mRemoteNG/Config/Serializers/ConnectionSerializers/Csv/CsvConnectionsDeserializerMremotengFormat.cs index f445fac8..82b6eee7 100644 --- a/mRemoteNG/Config/Serializers/ConnectionSerializers/Csv/CsvConnectionsDeserializerMremotengFormat.cs +++ b/mRemoteNG/Config/Serializers/ConnectionSerializers/Csv/CsvConnectionsDeserializerMremotengFormat.cs @@ -226,6 +226,18 @@ namespace mRemoteNG.Config.Serializers.ConnectionSerializers.Csv connectionRecord.UseCredSsp = value; } + if (headers.Contains("UseRestrictedAdmin")) + { + if (bool.TryParse(connectionCsv[headers.IndexOf("UseRestrictedAdmin")], out bool value)) + connectionRecord.UseRestrictedAdmin = value; + } + if (headers.Contains("UseRCG")) + { + if (bool.TryParse(connectionCsv[headers.IndexOf("UseRCG")], out bool value)) + connectionRecord.UseRCG = value; + } + + if (headers.Contains("UseVmId")) { if (bool.TryParse(connectionCsv[headers.IndexOf("UseVmId")], out bool value)) @@ -636,6 +648,19 @@ namespace mRemoteNG.Config.Serializers.ConnectionSerializers.Csv connectionRecord.Inheritance.UseCredSsp = value; } + if (headers.Contains("InheritUseRestrictedAdmin")) + { + if (bool.TryParse(connectionCsv[headers.IndexOf("InheritUseRestrictedAdmin")], out bool value)) + connectionRecord.Inheritance.UseRestrictedAdmin = value; + } + + if (headers.Contains("InheritUseRCG")) + { + if (bool.TryParse(connectionCsv[headers.IndexOf("InheritUseRCG")], out bool value)) + connectionRecord.Inheritance.UseRCG = value; + } + + if (headers.Contains("InheritUseVmId")) { if (bool.TryParse(connectionCsv[headers.IndexOf("InheritUseVmId")], out bool value)) diff --git a/mRemoteNG/Config/Serializers/ConnectionSerializers/Csv/CsvConnectionsSerializerMremotengFormat.cs b/mRemoteNG/Config/Serializers/ConnectionSerializers/Csv/CsvConnectionsSerializerMremotengFormat.cs index 5952bc3b..9fd37322 100644 --- a/mRemoteNG/Config/Serializers/ConnectionSerializers/Csv/CsvConnectionsSerializerMremotengFormat.cs +++ b/mRemoteNG/Config/Serializers/ConnectionSerializers/Csv/CsvConnectionsSerializerMremotengFormat.cs @@ -56,7 +56,7 @@ namespace mRemoteNG.Config.Serializers.ConnectionSerializers.Csv if (_saveFilter.SaveDomain) sb.Append("Domain;"); - sb.Append("Hostname;Port;VmId;Protocol;SSHTunnelConnectionName;OpeningCommand;SSHOptions;PuttySession;ConnectToConsole;UseCredSsp;UseVmId;UseEnhancedMode;RenderingEngine;RDPAuthenticationLevel;" + + sb.Append("Hostname;Port;VmId;Protocol;SSHTunnelConnectionName;OpeningCommand;SSHOptions;PuttySession;ConnectToConsole;UseCredSsp;UseRestrictedAdmin;UseRCG;UseVmId;UseEnhancedMode;RenderingEngine;RDPAuthenticationLevel;" + "LoadBalanceInfo;Colors;Resolution;AutomaticResize;DisplayWallpaper;DisplayThemes;EnableFontSmoothing;EnableDesktopComposition;DisableFullWindowDrag;DisableMenuAnimations;DisableCursorShadow;DisableCursorBlinking;" + "CacheBitmaps;RedirectDiskDrives;RedirectPorts;RedirectPrinters;RedirectClipboard;RedirectSmartCards;RedirectSound;RedirectKeys;" + "PreExtApp;PostExtApp;MacAddress;UserField;ExtApp;Favorite;VNCCompression;VNCEncoding;VNCAuthMode;VNCProxyType;VNCProxyIP;" + @@ -68,7 +68,7 @@ namespace mRemoteNG.Config.Serializers.ConnectionSerializers.Csv "InheritEnableFontSmoothing;InheritEnableDesktopComposition;InheritDisableFullWindowDrag;InheritDisableMenuAnimations;InheritDisableCursorShadow;InheritDisableCursorBlinking;InheritDomain;InheritIcon;InheritPanel;InheritPassword;InheritPort;" + "InheritProtocol;InheritSSHTunnelConnectionName;InheritOpeningCommand;InheritSSHOptions;InheritPuttySession;InheritRedirectDiskDrives;InheritRedirectKeys;InheritRedirectPorts;InheritRedirectPrinters;" + "InheritRedirectClipboard;InheritRedirectSmartCards;InheritRedirectSound;InheritResolution;InheritAutomaticResize;" + - "InheritUseConsoleSession;InheritUseCredSsp;InheritUseVmId;InheritUseEnhancedMode;InheritVmId;InheritRenderingEngine;InheritUsername;" + + "InheritUseConsoleSession;InheritUseCredSsp;InheritUseRestrictedAdmin;InheritUseRCG;InheritUseVmId;InheritUseEnhancedMode;InheritVmId;InheritRenderingEngine;InheritUsername;" + "InheritRDPAuthenticationLevel;InheritLoadBalanceInfo;InheritPreExtApp;InheritPostExtApp;InheritMacAddress;InheritUserField;" + "InheritFavorite;InheritExtApp;InheritVNCCompression;InheritVNCEncoding;InheritVNCAuthMode;InheritVNCProxyType;InheritVNCProxyIP;" + "InheritVNCProxyPort;InheritVNCProxyUsername;InheritVNCProxyPassword;InheritVNCColors;InheritVNCSmartSizeMode;InheritVNCViewOnly;" + @@ -125,6 +125,8 @@ namespace mRemoteNG.Config.Serializers.ConnectionSerializers.Csv .Append(FormatForCsv(con.PuttySession)) .Append(FormatForCsv(con.UseConsoleSession)) .Append(FormatForCsv(con.UseCredSsp)) + .Append(FormatForCsv(con.UseRestrictedAdmin)) + .Append(FormatForCsv(con.UseRCG)) .Append(FormatForCsv(con.UseVmId)) .Append(FormatForCsv(con.UseEnhancedMode)) .Append(FormatForCsv(con.RenderingEngine)) @@ -216,6 +218,8 @@ namespace mRemoteNG.Config.Serializers.ConnectionSerializers.Csv .Append(FormatForCsv(con.Inheritance.AutomaticResize)) .Append(FormatForCsv(con.Inheritance.UseConsoleSession)) .Append(FormatForCsv(con.Inheritance.UseCredSsp)) + .Append(FormatForCsv(con.Inheritance.UseRestrictedAdmin)) + .Append(FormatForCsv(con.Inheritance.UseRCG)) .Append(FormatForCsv(con.Inheritance.UseVmId)) .Append(FormatForCsv(con.Inheritance.UseEnhancedMode)) .Append(FormatForCsv(con.Inheritance.VmId)) diff --git a/mRemoteNG/Config/Serializers/ConnectionSerializers/MsSql/DataTableDeserializer.cs b/mRemoteNG/Config/Serializers/ConnectionSerializers/MsSql/DataTableDeserializer.cs index faf6fe58..a54e3205 100644 --- a/mRemoteNG/Config/Serializers/ConnectionSerializers/MsSql/DataTableDeserializer.cs +++ b/mRemoteNG/Config/Serializers/ConnectionSerializers/MsSql/DataTableDeserializer.cs @@ -97,6 +97,8 @@ namespace mRemoteNG.Config.Serializers.ConnectionSerializers.MsSql connectionInfo.Port = (int)dataRow["Port"]; connectionInfo.UseConsoleSession = (bool)dataRow["ConnectToConsole"]; connectionInfo.UseCredSsp = (bool)dataRow["UseCredSsp"]; + connectionInfo.UseRestrictedAdmin = (bool)dataRow["UseRestrictedAdmin"]; + connectionInfo.UseRCG = (bool)dataRow["UseRCG"]; connectionInfo.UseVmId = (bool)dataRow["UseVmId"]; connectionInfo.RenderingEngine = (HTTPBase.RenderingEngine)Enum.Parse(typeof(HTTPBase.RenderingEngine), (string)dataRow["RenderingEngine"]); connectionInfo.RDPAuthenticationLevel = (AuthenticationLevel)Enum.Parse(typeof(AuthenticationLevel), (string)dataRow["RDPAuthenticationLevel"]); @@ -188,6 +190,8 @@ namespace mRemoteNG.Config.Serializers.ConnectionSerializers.MsSql connectionInfo.Inheritance.AutomaticResize = (bool)dataRow["InheritAutomaticResize"]; connectionInfo.Inheritance.UseConsoleSession = (bool)dataRow["InheritUseConsoleSession"]; connectionInfo.Inheritance.UseCredSsp = (bool)dataRow["InheritUseCredSsp"]; + connectionInfo.Inheritance.UseRestrictedAdmin = (bool)dataRow["InheritUseRestrictedAdmin"]; + connectionInfo.Inheritance.UseRCG = (bool)dataRow["InheritUseRCG"]; connectionInfo.Inheritance.UseVmId = (bool)dataRow["InheritUseVmId"]; connectionInfo.Inheritance.UseEnhancedMode = (bool)dataRow["InheritUseEnhancedMode"]; connectionInfo.Inheritance.VmId = (bool)dataRow["InheritVmId"]; diff --git a/mRemoteNG/Config/Serializers/ConnectionSerializers/MsSql/DataTableSerializer.cs b/mRemoteNG/Config/Serializers/ConnectionSerializers/MsSql/DataTableSerializer.cs index 9e73857c..f6ea9a8c 100644 --- a/mRemoteNG/Config/Serializers/ConnectionSerializers/MsSql/DataTableSerializer.cs +++ b/mRemoteNG/Config/Serializers/ConnectionSerializers/MsSql/DataTableSerializer.cs @@ -116,6 +116,8 @@ namespace mRemoteNG.Config.Serializers.ConnectionSerializers.MsSql dataTable.Columns.Add("PuttySession", typeof(string)); dataTable.Columns.Add("ConnectToConsole", typeof(bool)); dataTable.Columns.Add("UseCredSsp", typeof(bool)); + dataTable.Columns.Add("UseRestrictedAdmin", typeof(bool)); + dataTable.Columns.Add("UseRCG", typeof(bool)); dataTable.Columns.Add("RenderingEngine", typeof(string)); dataTable.Columns.Add("RDPAuthenticationLevel", typeof(string)); dataTable.Columns.Add("Colors", typeof(string)); @@ -192,6 +194,8 @@ namespace mRemoteNG.Config.Serializers.ConnectionSerializers.MsSql dataTable.Columns.Add("InheritResolution", typeof(bool)); dataTable.Columns.Add("InheritUseConsoleSession", typeof(bool)); dataTable.Columns.Add("InheritUseCredSsp", typeof(bool)); + dataTable.Columns.Add("InheritUseRestrictedAdmin", typeof(bool)); + dataTable.Columns.Add("InheritUseRCG", typeof(bool)); dataTable.Columns.Add("InheritRenderingEngine", typeof(bool)); dataTable.Columns.Add("InheritRDPAuthenticationLevel", typeof(bool)); dataTable.Columns.Add("InheritUsername", typeof(bool)); @@ -285,6 +289,10 @@ namespace mRemoteNG.Config.Serializers.ConnectionSerializers.MsSql isFieldNotChange = isFieldNotChange && dataRow["UseCredSsp"].Equals(connectionInfo.UseCredSsp); isFieldNotChange = isFieldNotChange && + dataRow["UseRestrictedAdmin"].Equals(connectionInfo.UseRestrictedAdmin); + isFieldNotChange = isFieldNotChange && + dataRow["UseRCG"].Equals(connectionInfo.UseRCG); + isFieldNotChange = isFieldNotChange && dataRow["UseVmId"].Equals(connectionInfo.UseVmId); isFieldNotChange = isFieldNotChange && dataRow["UseEnhancedMode"].Equals(connectionInfo.UseEnhancedMode); @@ -385,6 +393,8 @@ namespace mRemoteNG.Config.Serializers.ConnectionSerializers.MsSql dataRow["InheritAutomaticResize"].Equals(connectionInfo.Inheritance.AutomaticResize) && dataRow["InheritUseConsoleSession"].Equals(connectionInfo.Inheritance.UseConsoleSession) && dataRow["InheritUseCredSsp"].Equals(connectionInfo.Inheritance.UseCredSsp) && + dataRow["InheritUseRestrictedAdmin"].Equals(connectionInfo.Inheritance.UseRestrictedAdmin) && + dataRow["InheritUseRCG"].Equals(connectionInfo.Inheritance.UseRCG) && dataRow["InheritRenderingEngine"].Equals(connectionInfo.Inheritance.RenderingEngine) && dataRow["InheritUsername"].Equals(connectionInfo.Inheritance.Username) && dataRow["InheritVmId"].Equals(connectionInfo.Inheritance.VmId) && @@ -452,6 +462,8 @@ namespace mRemoteNG.Config.Serializers.ConnectionSerializers.MsSql dataRow["InheritAutomaticResize"].Equals(false) && dataRow["InheritUseConsoleSession"].Equals(false) && dataRow["InheritUseCredSsp"].Equals(false) && + dataRow["InheritUseRestrictedAdmin"].Equals(false) && + dataRow["InheritUseRCG"].Equals(false) && dataRow["InheritRenderingEngine"].Equals(false) && dataRow["InheritUsername"].Equals(false) && dataRow["InheritRDPAuthenticationLevel"].Equals(false) && @@ -534,6 +546,8 @@ namespace mRemoteNG.Config.Serializers.ConnectionSerializers.MsSql dataRow["Port"] = connectionInfo.Port; dataRow["ConnectToConsole"] = connectionInfo.UseConsoleSession; dataRow["UseCredSsp"] = connectionInfo.UseCredSsp; + dataRow["UseRestrictedAdmin"] = connectionInfo.UseRestrictedAdmin; + dataRow["UseRCG"] = connectionInfo.UseRCG; dataRow["UseVmId"] = connectionInfo.UseVmId; dataRow["UseEnhancedMode"] = connectionInfo.UseEnhancedMode; dataRow["RenderingEngine"] = connectionInfo.RenderingEngine; @@ -629,6 +643,8 @@ namespace mRemoteNG.Config.Serializers.ConnectionSerializers.MsSql dataRow["InheritAutomaticResize"] = connectionInfo.Inheritance.AutomaticResize; dataRow["InheritUseConsoleSession"] = connectionInfo.Inheritance.UseConsoleSession; dataRow["InheritUseCredSsp"] = connectionInfo.Inheritance.UseCredSsp; + dataRow["InheritUseRestrictedAdmin"] = connectionInfo.Inheritance.UseRestrictedAdmin; + dataRow["InheritUseRCG"] = connectionInfo.Inheritance.UseRCG; dataRow["InheritRenderingEngine"] = connectionInfo.Inheritance.RenderingEngine; dataRow["InheritUsername"] = connectionInfo.Inheritance.Username; dataRow["InheritVmId"] = connectionInfo.Inheritance.VmId; @@ -700,6 +716,8 @@ namespace mRemoteNG.Config.Serializers.ConnectionSerializers.MsSql dataRow["InheritAutomaticResize"] = false; dataRow["InheritUseConsoleSession"] = false; dataRow["InheritUseCredSsp"] = false; + dataRow["InheritUseRestrictedAdmin"] = false; + dataRow["InheritUseRCG"] = false; dataRow["InheritRenderingEngine"] = false; dataRow["InheritUsername"] = false; dataRow["InheritRDPAuthenticationLevel"] = false; diff --git a/mRemoteNG/Config/Serializers/ConnectionSerializers/Xml/XmlConnectionsDeserializer.cs b/mRemoteNG/Config/Serializers/ConnectionSerializers/Xml/XmlConnectionsDeserializer.cs index 58760b9b..a82b6c68 100644 --- a/mRemoteNG/Config/Serializers/ConnectionSerializers/Xml/XmlConnectionsDeserializer.cs +++ b/mRemoteNG/Config/Serializers/ConnectionSerializers/Xml/XmlConnectionsDeserializer.cs @@ -569,6 +569,10 @@ namespace mRemoteNG.Config.Serializers.ConnectionSerializers.Xml connectionInfo.Inheritance.UserViaAPI = xmlnode.GetAttributeAsBool("InheritUserViaAPI"); connectionInfo.EC2InstanceId = xmlnode.GetAttributeAsString("EC2InstanceId"); connectionInfo.EC2Region = xmlnode.GetAttributeAsString("EC2Region"); + connectionInfo.UseRestrictedAdmin = xmlnode.GetAttributeAsBool("UseRestrictedAdmin"); + connectionInfo.Inheritance.UseRestrictedAdmin = xmlnode.GetAttributeAsBool("InheritUseRestrictedAdmin"); + connectionInfo.UseRCG = xmlnode.GetAttributeAsBool("UseRCG"); + connectionInfo.Inheritance.UseRCG = xmlnode.GetAttributeAsBool("InheritUseRCG"); } } catch (Exception ex) diff --git a/mRemoteNG/Connection/AbstractConnectionRecord.cs b/mRemoteNG/Connection/AbstractConnectionRecord.cs index 3e16664c..a0cef34e 100644 --- a/mRemoteNG/Connection/AbstractConnectionRecord.cs +++ b/mRemoteNG/Connection/AbstractConnectionRecord.cs @@ -45,6 +45,8 @@ namespace mRemoteNG.Connection private string _loadBalanceInfo; private HTTPBase.RenderingEngine _renderingEngine; private bool _useCredSsp; + private bool _useRestrictedAdmin; + private bool _useRCG; private bool _useVmId; private RDGatewayUsageMethod _rdGatewayUsageMethod; @@ -394,6 +396,28 @@ namespace mRemoteNG.Connection set => SetField(ref _useCredSsp, value, "UseCredSsp"); } + [LocalizedAttributes.LocalizedCategory(nameof(Language.Protocol), 3), + LocalizedAttributes.LocalizedDisplayName(nameof(Language.UseRestrictedAdmin)), + LocalizedAttributes.LocalizedDescription(nameof(Language.PropertyDescriptionUseRestrictedAdmin)), + TypeConverter(typeof(MiscTools.YesNoTypeConverter)), + AttributeUsedInProtocol(ProtocolType.RDP)] + public bool UseRestrictedAdmin + { + get => GetPropertyValue("UseRestrictedAdmin", _useRestrictedAdmin); + set => SetField(ref _useRestrictedAdmin, value, "UseRestrictedAdmin"); + } + + [LocalizedAttributes.LocalizedCategory(nameof(Language.Protocol), 3), + LocalizedAttributes.LocalizedDisplayName(nameof(Language.UseRCG)), + LocalizedAttributes.LocalizedDescription(nameof(Language.PropertyDescriptionUseRCG)), + TypeConverter(typeof(MiscTools.YesNoTypeConverter)), + AttributeUsedInProtocol(ProtocolType.RDP)] + public bool UseRCG + { + get => GetPropertyValue("UseRCG", _useRCG); + set => SetField(ref _useRCG, value, "UseRCG"); + } + [LocalizedAttributes.LocalizedCategory(nameof(Language.Protocol), 3), LocalizedAttributes.LocalizedDisplayName(nameof(Language.UseVmId)), LocalizedAttributes.LocalizedDescription(nameof(Language.PropertyDescriptionUseVmId)), diff --git a/mRemoteNG/Connection/ConnectionInfo.cs b/mRemoteNG/Connection/ConnectionInfo.cs index 0fee759d..c0559587 100644 --- a/mRemoteNG/Connection/ConnectionInfo.cs +++ b/mRemoteNG/Connection/ConnectionInfo.cs @@ -312,6 +312,8 @@ namespace mRemoteNG.Connection LoadBalanceInfo = Settings.Default.ConDefaultLoadBalanceInfo; RenderingEngine = (HTTPBase.RenderingEngine)Enum.Parse(typeof(HTTPBase.RenderingEngine), Settings.Default.ConDefaultRenderingEngine); UseCredSsp = Settings.Default.ConDefaultUseCredSsp; + UseRestrictedAdmin = Settings.Default.ConDefaultUseRestrictedAdmin; + UseRCG = Settings.Default.ConDefaultUseRCG; UseVmId = Settings.Default.ConDefaultUseVmId; UseEnhancedMode = Settings.Default.ConDefaultUseEnhancedMode; } diff --git a/mRemoteNG/Connection/ConnectionInfoInheritance.cs b/mRemoteNG/Connection/ConnectionInfoInheritance.cs index 05ccdd98..5d2ee8b5 100644 --- a/mRemoteNG/Connection/ConnectionInfoInheritance.cs +++ b/mRemoteNG/Connection/ConnectionInfoInheritance.cs @@ -184,6 +184,18 @@ namespace mRemoteNG.Connection TypeConverter(typeof(MiscTools.YesNoTypeConverter))] public bool UseCredSsp { get; set; } + [LocalizedAttributes.LocalizedCategory(nameof(Language.Protocol), 4), + LocalizedAttributes.LocalizedDisplayNameInherit(nameof(Language.UseRestrictedAdmin)), + LocalizedAttributes.LocalizedDescriptionInherit(nameof(Language.PropertyDescriptionUseRestrictedAdmin)), + TypeConverter(typeof(MiscTools.YesNoTypeConverter))] + public bool UseRestrictedAdmin { get; set; } + + [LocalizedAttributes.LocalizedCategory(nameof(Language.Protocol), 4), + LocalizedAttributes.LocalizedDisplayNameInherit(nameof(Language.UseRCG)), + LocalizedAttributes.LocalizedDescriptionInherit(nameof(Language.PropertyDescriptionUseRCG)), + TypeConverter(typeof(MiscTools.YesNoTypeConverter))] + public bool UseRCG { get; set; } + [LocalizedAttributes.LocalizedCategory(nameof(Language.Protocol), 4), LocalizedAttributes.LocalizedDisplayNameInherit(nameof(Language.UseVmId)), LocalizedAttributes.LocalizedDescriptionInherit(nameof(Language.PropertyDescriptionUseVmId)), diff --git a/mRemoteNG/Connection/Protocol/RDP/RdpProtocol6.cs b/mRemoteNG/Connection/Protocol/RDP/RdpProtocol6.cs index 766f0289..f64ef715 100644 --- a/mRemoteNG/Connection/Protocol/RDP/RdpProtocol6.cs +++ b/mRemoteNG/Connection/Protocol/RDP/RdpProtocol6.cs @@ -307,6 +307,16 @@ namespace mRemoteNG.Connection.Protocol.RDP { _rdpClient.AdvancedSettings7.EnableCredSspSupport = connectionInfo.UseCredSsp; } + if(_rdpVersion >= Versions.RDC81) + { + if (connectionInfo.UseRestrictedAdmin) + SetExtendedProperty("RestrictedLogon", true); + else if (connectionInfo.UseRCG) + { + SetExtendedProperty("DisableCredentialsDelegation", true); + SetExtendedProperty("RedirectedAuthentication", true); + } + } SetUseConsoleSession(); SetPort(); diff --git a/mRemoteNG/Connection/Protocol/RDP/RdpProtocol9.cs b/mRemoteNG/Connection/Protocol/RDP/RdpProtocol9.cs index e0527d8b..d521e40d 100644 --- a/mRemoteNG/Connection/Protocol/RDP/RdpProtocol9.cs +++ b/mRemoteNG/Connection/Protocol/RDP/RdpProtocol9.cs @@ -1,4 +1,5 @@ -using System.Windows.Forms; +using System; +using System.Windows.Forms; using AxMSTSCLib; using MSTSCLib; @@ -20,5 +21,6 @@ namespace mRemoteNG.Connection.Protocol.RDP { RdpClient9.UpdateSessionDisplaySettings(width, height, width, height, 0, 1, 1); } + } } \ No newline at end of file diff --git a/mRemoteNG/Language/Language.Designer.cs b/mRemoteNG/Language/Language.Designer.cs index 9fc86917..1f054720 100644 --- a/mRemoteNG/Language/Language.Designer.cs +++ b/mRemoteNG/Language/Language.Designer.cs @@ -4059,7 +4059,29 @@ namespace mRemoteNG.Resources.Language { return ResourceManager.GetString("PropertyDescriptionUseCredSsp", resourceCulture); } } - + + /// + /// Looks up a localized string for UseRestrictedAdmin Description + /// + internal static string PropertyDescriptionUseRestrictedAdmin + { + get + { + return ResourceManager.GetString("PropertyDescriptionUseRestrictedAdmin", resourceCulture); + } + } + + /// + /// Looks up a localized string for UseRCG Description + /// + internal static string PropertyDescriptionUseRCG + { + get + { + return ResourceManager.GetString("PropertyDescriptionUseRCG", resourceCulture); + } + } + /// /// Looks up a localized string similar to Connect to a Hyper-V host with enhanced mode enabled.. /// @@ -6081,7 +6103,29 @@ namespace mRemoteNG.Resources.Language { return ResourceManager.GetString("UseCredSsp", resourceCulture); } } - + + /// + /// Looks up a localized string similar to UseRestrictedAdmin. + /// + internal static string UseRestrictedAdmin + { + get + { + return ResourceManager.GetString("UseRestrictedAdmin", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to UseRestrictedAdmin. + /// + internal static string UseRCG + { + get + { + return ResourceManager.GetString("UseRCG", resourceCulture); + } + } + /// /// Looks up a localized string similar to Use default. /// diff --git a/mRemoteNG/Language/Language.resx b/mRemoteNG/Language/Language.resx index 5c987e0e..bf6d29e0 100644 --- a/mRemoteNG/Language/Language.resx +++ b/mRemoteNG/Language/Language.resx @@ -1086,6 +1086,15 @@ If you run into such an error, please create a new connection file! Use the Credential Security Support Provider (CredSSP) for authentication if it is available. + + + Use restricted admin mode on the target host (local system context). + + + + Use Remote Credential Guard to tunnel authentication on target back to source through the RDP channel. + + Feel free to enter any information you need here. @@ -1239,6 +1248,15 @@ If you run into such an error, please create a new connection file! Use CredSSP + + + Use Restricted Admin + + + Use Remote Credential Guard + + + User Field diff --git a/mRemoteNG/Properties/Settings.Designer.cs b/mRemoteNG/Properties/Settings.Designer.cs index d96fdf40..8b0183a0 100644 --- a/mRemoteNG/Properties/Settings.Designer.cs +++ b/mRemoteNG/Properties/Settings.Designer.cs @@ -1390,6 +1390,70 @@ namespace mRemoteNG.Properties { this["ConDefaultUseCredSsp"] = value; } } + + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("False")] + public bool InhDefaultUseRestrictedAdmin + { + get + { + return ((bool)(this["InhDefaultUseRestrictedAdmin"])); + } + set + { + this["InhDefaultUseRestrictedAdmin"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("True")] + public bool ConDefaultUseRestrictedAdmin + { + get + { + return ((bool)(this["ConDefaultUseRestrictedAdmin"])); + } + set + { + this["ConDefaultUseRestrictedAdmin"] = value; + } + } + + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("False")] + public bool InhDefaultUseRCG + { + get + { + return ((bool)(this["InhDefaultUseRCG"])); + } + set + { + this["InhDefaultUseRCG"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("True")] + public bool ConDefaultUseRCG + { + get + { + return ((bool)(this["ConDefaultUseRCG"])); + } + set + { + this["ConDefaultUseRCG"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] diff --git a/mRemoteNG/Properties/Settings.settings b/mRemoteNG/Properties/Settings.settings index 2a3ad719..1855d9da 100644 --- a/mRemoteNG/Properties/Settings.settings +++ b/mRemoteNG/Properties/Settings.settings @@ -338,12 +338,27 @@ 4 + False True + + + False + + + True + + + False + + + True + + False diff --git a/mRemoteNGTests/Config/Serializers/ConnectionSerializers/Csv/CsvConnectionsDeserializerMremotengFormatTests.cs b/mRemoteNGTests/Config/Serializers/ConnectionSerializers/Csv/CsvConnectionsDeserializerMremotengFormatTests.cs index e3f9aeda..0de1e5d5 100644 --- a/mRemoteNGTests/Config/Serializers/ConnectionSerializers/Csv/CsvConnectionsDeserializerMremotengFormatTests.cs +++ b/mRemoteNGTests/Config/Serializers/ConnectionSerializers/Csv/CsvConnectionsDeserializerMremotengFormatTests.cs @@ -97,6 +97,8 @@ namespace mRemoteNGTests.Config.Serializers.ConnectionSerializers.Csv Favorite = true, UseConsoleSession = true, UseCredSsp = true, + UseRestrictedAdmin = true, + UseRCG = true, UseVmId = false, UseEnhancedMode = false, RenderingEngine = HTTPBase.RenderingEngine.EdgeChromium, diff --git a/mRemoteNGTests/Connection/AbstractConnectionInfoDataTests.cs b/mRemoteNGTests/Connection/AbstractConnectionInfoDataTests.cs index 577d4d1a..7c816cce 100644 --- a/mRemoteNGTests/Connection/AbstractConnectionInfoDataTests.cs +++ b/mRemoteNGTests/Connection/AbstractConnectionInfoDataTests.cs @@ -186,6 +186,24 @@ namespace mRemoteNGTests.Connection Assert.That(wasCalled, Is.True); } + [Test] + public void UseRestrictedAdminNotifiesOnValueChange() + { + var wasCalled = false; + _testAbstractConnectionInfoData.PropertyChanged += (sender, args) => wasCalled = true; + _testAbstractConnectionInfoData.UseRestrictedAdmin = true; + Assert.That(wasCalled, Is.True); + } + + [Test] + public void UseRCGNotifiesOnValueChange() + { + var wasCalled = false; + _testAbstractConnectionInfoData.PropertyChanged += (sender, args) => wasCalled = true; + _testAbstractConnectionInfoData.UseRCG = true; + Assert.That(wasCalled, Is.True); + } + [Test] public void RdGatewayUsageMethodNotifiesOnValueChange() { diff --git a/mRemoteNGTests/TestHelpers/SerializableConnectionInfoAllPropertiesOfType.cs b/mRemoteNGTests/TestHelpers/SerializableConnectionInfoAllPropertiesOfType.cs index afcf04fe..7500c4e7 100644 --- a/mRemoteNGTests/TestHelpers/SerializableConnectionInfoAllPropertiesOfType.cs +++ b/mRemoteNGTests/TestHelpers/SerializableConnectionInfoAllPropertiesOfType.cs @@ -23,6 +23,8 @@ public TType LoadBalanceInfo { get; set; } public TType RenderingEngine { get; set; } public TType UseCredSsp { get; set; } + public TType UseRestrictedAdmin { get; set; } + public TType UseRCG { get; set; } public TType RDGatewayUsageMethod { get; set; } public TType RDGatewayHostname { get; set; } public TType RDGatewayUseConnectionCredentials { get; set; } diff --git a/mRemoteNGTests/UI/Window/ConfigWindowTests/ConfigWindowGeneralTests.cs b/mRemoteNGTests/UI/Window/ConfigWindowTests/ConfigWindowGeneralTests.cs index 80fde5ff..864649c5 100644 --- a/mRemoteNGTests/UI/Window/ConfigWindowTests/ConfigWindowGeneralTests.cs +++ b/mRemoteNGTests/UI/Window/ConfigWindowTests/ConfigWindowGeneralTests.cs @@ -238,6 +238,8 @@ namespace mRemoteNGTests.UI.Window.ConfigWindowTests nameof(ConnectionInfo.RDPMinutesToIdleTimeout), nameof(ConnectionInfo.LoadBalanceInfo), nameof(ConnectionInfo.UseCredSsp), + nameof(ConnectionInfo.UseRestrictedAdmin), + nameof(ConnectionInfo.UseRCG), nameof(ConnectionInfo.RDGatewayUsageMethod), nameof(ConnectionInfo.Resolution), nameof(ConnectionInfo.Colors),