Skip to content

Commit 796f886

Browse files
committed
RemoteDesktop - Disconnect reason added
1 parent db5bc53 commit 796f886

4 files changed

Lines changed: 293 additions & 8 deletions

File tree

Source/NETworkManager/Controls/RemoteDesktopControl.xaml

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,23 @@
44
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
55
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
66
xmlns:mstsc ="clr-namespace:AxMSTSCLib;assembly=AxMSTSCLib"
7+
xmlns:Converter="clr-namespace:NETworkManager.Converters"
78
mc:Ignorable="d">
89
<UserControl.Resources>
9-
10+
<Converter:BooleanReverseToVisibilityConverter x:Key="BooleanReverseToVisibilityConverter" />
11+
<Converter:BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter" />
1012
</UserControl.Resources>
1113
<Grid>
12-
<WindowsFormsHost MaxWidth="{Binding ElementName=rdpClient, Path=DesktopWidth}" MaxHeight="{Binding ElementName=rdpClient, Path=DesktopHeight}" Visibility="{Binding HideRdpClient}">
14+
<WindowsFormsHost MaxWidth="{Binding ElementName=rdpClient, Path=DesktopWidth}" MaxHeight="{Binding ElementName=rdpClient, Path=DesktopHeight}" Visibility="{Binding HideRdpClient, Converter={StaticResource BooleanReverseToVisibilityConverter}}">
1315
<mstsc:AxMsRdpClient9NotSafeForScripting x:Name="rdpClient" />
1416
</WindowsFormsHost>
17+
<Grid VerticalAlignment="Center" HorizontalAlignment="Center" TextBlock.TextAlignment="Center" Visibility="{Binding Disconnected, Converter={StaticResource BooleanToVisibilityConverter}}">
18+
<Grid.RowDefinitions>
19+
<RowDefinition Height="Auto" />
20+
<RowDefinition Height="Auto" />
21+
</Grid.RowDefinitions>
22+
<TextBlock Grid.Row="0" Text="{DynamicResource String_Header_Disconnected}" Style="{StaticResource HeaderTextBlock}" FontSize="18" />
23+
<TextBlock Grid.Row="1" Foreground="{DynamicResource AccentColorBrush}" Text="{Binding DisconnectReason}" Style="{DynamicResource DefaultTextBlock}" />
24+
</Grid>
1525
</Grid>
1626
</UserControl>

Source/NETworkManager/Controls/RemoteDesktopControl.xaml.cs

Lines changed: 181 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,77 @@
11
using NETworkManager.Models.RemoteDesktop;
2+
using NETworkManager.ViewModels;
3+
using System.ComponentModel;
4+
using System.Runtime.CompilerServices;
5+
using System.Windows;
26
using System.Windows.Controls;
37

48
namespace NETworkManager.Controls
59
{
6-
public partial class RemoteDesktopControl : UserControl
10+
public partial class RemoteDesktopControl : UserControl, INotifyPropertyChanged
711
{
12+
#region PropertyChangedEventHandler
13+
public event PropertyChangedEventHandler PropertyChanged;
14+
15+
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
16+
{
17+
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
18+
}
19+
#endregion
20+
21+
#region Variables
22+
private const string RemoteDesktopDisconnectReasonIdentifier = "String_RemoteDesktopDisconnectReason_";
23+
24+
private bool _hideRdpClient;
25+
public bool HideRdpClient
26+
{
27+
get { return _hideRdpClient; }
28+
set
29+
{
30+
if (value == _hideRdpClient)
31+
return;
32+
33+
_hideRdpClient = value;
34+
OnPropertyChanged();
35+
}
36+
}
37+
38+
private bool _disconnected;
39+
public bool Disconnected
40+
{
41+
get { return _disconnected; }
42+
set
43+
{
44+
if (value == _disconnected)
45+
return;
46+
47+
_disconnected = value;
48+
OnPropertyChanged();
49+
}
50+
}
51+
52+
private string _disconnectReason;
53+
public string DisconnectReason
54+
{
55+
get { return _disconnectReason; }
56+
set
57+
{
58+
if (value == _disconnectReason)
59+
return;
60+
61+
_disconnectReason = value;
62+
OnPropertyChanged();
63+
}
64+
}
65+
#endregion
66+
867
public RemoteDesktopControl(RemoteDesktopSessionInfo info)
968
{
1069
InitializeComponent();
70+
DataContext = this;
71+
72+
Disconnected = false;
73+
74+
HideRdpClient = false;
1175

1276
rdpClient.Server = info.Hostname;
1377

@@ -27,15 +91,126 @@ public RemoteDesktopControl(RemoteDesktopSessionInfo info)
2791
rdpClient.DesktopWidth = 1280;
2892

2993
// Events
30-
rdpClient.OnDisconnected += Mstsc_OnDisconnected;
94+
rdpClient.OnDisconnected += RdpClient_OnDisconnected; ;
3195

3296
rdpClient.Connect();
3397
}
3498

35-
private void Mstsc_OnDisconnected(object sender, AxMSTSCLib.IMsTscAxEvents_OnDisconnectedEvent e)
99+
private void RdpClient_OnDisconnected(object sender, AxMSTSCLib.IMsTscAxEvents_OnDisconnectedEvent e)
100+
{
101+
HideRdpClient = true;
102+
103+
DisconnectReason = GetDisconnectReason(e.discReason);
104+
Disconnected = true;
105+
}
106+
107+
// Source: https://msdn.microsoft.com/en-us/library/aa382170(v=vs.85).aspx
108+
private string GetDisconnectReasonFromResource(string reason)
109+
{
110+
return Application.Current.Resources[RemoteDesktopDisconnectReasonIdentifier + reason] as string;
111+
}
112+
113+
private string GetDisconnectReason(int reason)
36114
{
37-
38-
// Add DC reason
115+
switch (reason)
116+
{
117+
case 0:
118+
return GetDisconnectReasonFromResource("NoInfo");
119+
case 1:
120+
return GetDisconnectReasonFromResource("LocalNotError");
121+
case 2:
122+
return GetDisconnectReasonFromResource("RemoteByUser");
123+
case 3:
124+
return GetDisconnectReasonFromResource("ByServer");
125+
case 260:
126+
return GetDisconnectReasonFromResource("DNSLookupFailed");
127+
case 262:
128+
return GetDisconnectReasonFromResource("OutOfMemory");
129+
case 264:
130+
return GetDisconnectReasonFromResource("ConnectionTimedOut");
131+
case 516:
132+
return GetDisconnectReasonFromResource("SocketConnectFailed");
133+
case 518:
134+
return GetDisconnectReasonFromResource("OutOfMemory2");
135+
case 520:
136+
return GetDisconnectReasonFromResource("HostNotFound");
137+
case 772:
138+
return GetDisconnectReasonFromResource("WinsockSendFailed");
139+
case 774:
140+
return GetDisconnectReasonFromResource("OutOfMemory3");
141+
case 776:
142+
return GetDisconnectReasonFromResource("InvalidIPAddr");
143+
case 1028:
144+
return GetDisconnectReasonFromResource("SocketRecvFailed");
145+
case 1030:
146+
return GetDisconnectReasonFromResource("InvalidSecurityData");
147+
case 1032:
148+
return GetDisconnectReasonFromResource("InternalError");
149+
case 1286:
150+
return GetDisconnectReasonFromResource("InvalidEncryption");
151+
case 1288:
152+
return GetDisconnectReasonFromResource("DNSLookupFailed2");
153+
case 1540:
154+
return GetDisconnectReasonFromResource("GetHostByNameFailed");
155+
case 1542:
156+
return GetDisconnectReasonFromResource("InvalidServerSecurityInfo");
157+
case 1544:
158+
return GetDisconnectReasonFromResource("TimerError");
159+
case 1796:
160+
return GetDisconnectReasonFromResource("TimeoutOccurred");
161+
case 1798:
162+
return GetDisconnectReasonFromResource("ServerCertificateUnpackErr");
163+
case 2052:
164+
return GetDisconnectReasonFromResource("InvalidIP");
165+
case 2055:
166+
return GetDisconnectReasonFromResource("SslErrLogonFailure");
167+
case 2056:
168+
return GetDisconnectReasonFromResource("LicensingFailed");
169+
case 2308:
170+
return GetDisconnectReasonFromResource("AtClientWinsockFDCLOSE");
171+
case 2310:
172+
return GetDisconnectReasonFromResource("InternalSecurityError");
173+
case 2312:
174+
return GetDisconnectReasonFromResource("LicensingTimeout");
175+
case 2566:
176+
return GetDisconnectReasonFromResource("InternalSecurityError2");
177+
case 2567:
178+
return GetDisconnectReasonFromResource("SslErrNoSuchUser");
179+
case 2822:
180+
return GetDisconnectReasonFromResource("EncryptionError");
181+
case 2823:
182+
return GetDisconnectReasonFromResource("SslErrAccountDisabled");
183+
case 3078:
184+
return GetDisconnectReasonFromResource("DecryptionError");
185+
case 3079:
186+
return GetDisconnectReasonFromResource("SslErrAccountRestriction");
187+
case 3080:
188+
return GetDisconnectReasonFromResource("ClientDecompressionError");
189+
case 3335:
190+
return GetDisconnectReasonFromResource("SslErrAccountLockedOut");
191+
case 3591:
192+
return GetDisconnectReasonFromResource("SslErrAccountExpired");
193+
case 3847:
194+
return GetDisconnectReasonFromResource("SslErrPasswordExpired");
195+
case 4615:
196+
return GetDisconnectReasonFromResource("SslErrPasswordMustChange");
197+
case 5639:
198+
return GetDisconnectReasonFromResource("SslErrDelegationPolicy");
199+
case 5895:
200+
return GetDisconnectReasonFromResource("SslErrPolicyNTLMOnly");
201+
case 6151:
202+
return GetDisconnectReasonFromResource("SslErrNoAuthenticatingAuthority");
203+
case 6919:
204+
return GetDisconnectReasonFromResource("SslErrCertExpired");
205+
case 7175:
206+
return GetDisconnectReasonFromResource("SslErrSmartcardWrongPIN");
207+
case 8455:
208+
return GetDisconnectReasonFromResource("SslErrFreshCredRequiredByServer");
209+
case 8711:
210+
return GetDisconnectReasonFromResource("SslErrSmartcardCardBlocked");
211+
default:
212+
return "reason not found!";
213+
}
39214
}
40215
}
41-
}
216+
}

Source/NETworkManager/Resources/Localization/Resources.de-DE.xaml

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@
7474
<system:String x:Key="String_Header_CopySession">Sitzung kopieren</system:String>
7575
<system:String x:Key="String_Header_Sessions">Sitzungen</system:String>
7676
<system:String x:Key="String_Header_RemoteDesktop">Remote Desktop</system:String>
77+
<system:String x:Key="String_Header_Disconnected">Getrennt</system:String>
7778

7879
<!-- Normal strings -->
7980
<system:String x:Key="String_ProductName">NETworkManager</system:String>
@@ -428,4 +429,53 @@
428429
<!-- PortStatus -->
429430
<system:String x:Key="String_PortStatus_Closed">Geschlossen</system:String>
430431
<system:String x:Key="String_PortStatus_Open">Offen</system:String>
432+
433+
<!-- Remote desktop disconnect reason -->
434+
<system:String x:Key="String_RemoteDesktopDisconnectReason_AtClientWinsockFDCLOSE">Socket geschlossen.</system:String>
435+
<system:String x:Key="String_RemoteDesktopDisconnectReason_ByServer">Remote-Trennung durch Server.</system:String>
436+
<system:String x:Key="String_RemoteDesktopDisconnectReason_ClientDecompressionError">Dekompressionsfehler.</system:String>
437+
<system:String x:Key="String_RemoteDesktopDisconnectReason_ConnectionTimedOut">Zeitüberschreitung der Verbindung.</system:String>
438+
<system:String x:Key="String_RemoteDesktopDisconnectReason_DecryptionError">Dekodierungsfehler.</system:String>
439+
<system:String x:Key="String_RemoteDesktopDisconnectReason_DNSLookupFailed">DNS-Namensauflösung fehlgeschlagen.</system:String>
440+
<system:String x:Key="String_RemoteDesktopDisconnectReason_DNSLookupFailed2">DNS-Lookup-Fehler.</system:String>
441+
<system:String x:Key="String_RemoteDesktopDisconnectReason_EncryptionError">Verschlüsselungsfehler.</system:String>
442+
<system:String x:Key="String_RemoteDesktopDisconnectReason_GetHostByNameFailed">Gethostbyname-Aufruf von Windows Sockets fehlgeschlagen.</system:String>
443+
<system:String x:Key="String_RemoteDesktopDisconnectReason_HostNotFound">Host nicht gefunden.</system:String>
444+
<system:String x:Key="String_RemoteDesktopDisconnectReason_InternalError">Interner Fehler.</system:String>
445+
<system:String x:Key="String_RemoteDesktopDisconnectReason_InternalSecurityError">Interner Sicherheitsfehler.</system:String>
446+
<system:String x:Key="String_RemoteDesktopDisconnectReason_InternalSecurityError2">Interner Sicherheitsfehler.</system:String>
447+
<system:String x:Key="String_RemoteDesktopDisconnectReason_InvalidEncryption">Die angegebene Verschlüsselungsmethode ist ungültig.</system:String>
448+
<system:String x:Key="String_RemoteDesktopDisconnectReason_InvalidIP">Ungültige IP-Adresse angegeben.</system:String>
449+
<system:String x:Key="String_RemoteDesktopDisconnectReason_InvalidServerSecurityInfo">Server-Sicherheitsdaten sind ungültig.</system:String>
450+
<system:String x:Key="String_RemoteDesktopDisconnectReason_InvalidSecurityData">Sicherheitsdaten sind ungültig.</system:String>
451+
<system:String x:Key="String_RemoteDesktopDisconnectReason_InvalidIPAddr">Die angegebene IP-Adresse ist ungültig.</system:String>
452+
<system:String x:Key="String_RemoteDesktopDisconnectReason_LicensingFailed">Lizenzaushandlung fehlgeschlagen.</system:String>
453+
<system:String x:Key="String_RemoteDesktopDisconnectReason_LicensingTimeout">Lizenz-Timeout.</system:String>
454+
<system:String x:Key="String_RemoteDesktopDisconnectReason_LocalNotError">Lokale Trennung.</system:String>
455+
<system:String x:Key="String_RemoteDesktopDisconnectReason_NoInfo">Es sind keine Informationen verfügbar.</system:String>
456+
<system:String x:Key="String_RemoteDesktopDisconnectReason_OutOfMemory">Nicht genügend Arbeitsspeicher.</system:String>
457+
<system:String x:Key="String_RemoteDesktopDisconnectReason_OutOfMemory2">Nicht genügend Arbeitsspeicher.</system:String>
458+
<system:String x:Key="String_RemoteDesktopDisconnectReason_OutOfMemory3">Nicht genügend Arbeitsspeicher.</system:String>
459+
<system:String x:Key="String_RemoteDesktopDisconnectReason_RemoteByUser">Remote-Trennung durch den Benutzer.</system:String>
460+
<system:String x:Key="String_RemoteDesktopDisconnectReason_ServerCertificateUnpackErr">Das Serverzertifikat konnte nicht entpackt werden.</system:String>
461+
<system:String x:Key="String_RemoteDesktopDisconnectReason_SocketConnectFailed">Windows Sockets-Verbindung ist fehlgeschlagen.</system:String>
462+
<system:String x:Key="String_RemoteDesktopDisconnectReason_SocketRecvFailed">Der Windows Sockets-Aufruf recv ist fehlgeschlagen.</system:String>
463+
<system:String x:Key="String_RemoteDesktopDisconnectReason_TimeoutOccurred">Zeitüberschreitung ist aufgetreten.</system:String>
464+
<system:String x:Key="String_RemoteDesktopDisconnectReason_TimerError">Interner Timerfehler.</system:String>
465+
<system:String x:Key="String_RemoteDesktopDisconnectReason_WinsockSendFailed">Der Windows Sockets-Aufruf send ist fehlgeschlagen.</system:String>
466+
<system:String x:Key="String_RemoteDesktopDisconnectReason_SslErrAccountDisabled">Das Konto ist deaktiviert.</system:String>
467+
<system:String x:Key="String_RemoteDesktopDisconnectReason_SslErrAccountExpired">Das Konto ist abgelaufen.</system:String>
468+
<system:String x:Key="String_RemoteDesktopDisconnectReason_SslErrAccountLockedOut">Das Konto ist gesperrt.</system:String>
469+
<system:String x:Key="String_RemoteDesktopDisconnectReason_SslErrAccountRestriction">Das Konto ist eingeschränkt.</system:String>
470+
<system:String x:Key="String_RemoteDesktopDisconnectReason_SslErrCertExpired">Das empfangene Zertifikat ist abgelaufen.</system:String>
471+
<system:String x:Key="String_RemoteDesktopDisconnectReason_SslErrDelegationPolicy">Die Richtlinie unterstützt keine Delegierung von Anmeldeinformationen an den Zielserver.</system:String>
472+
<system:String x:Key="String_RemoteDesktopDisconnectReason_SslErrFreshCredRequiredByServer">Die Serverauthentifizierungsrichtlinie lässt keine Verbindungsanforderungen mit gespeicherten Anmeldeinformationen zu. Der Benutzer muss neue Anmeldeinformationen eingeben.</system:String>
473+
<system:String x:Key="String_RemoteDesktopDisconnectReason_SslErrLogonFailure">Anmeldung fehlgeschlagen.</system:String>
474+
<system:String x:Key="String_RemoteDesktopDisconnectReason_SslErrNoAuthenticatingAuthority">Es konnte keine Autorität für die Authentifizierung kontaktiert werden. Der Domänenname des authentifizierenden Teilnehmers könnte falsch sein, die Domäne könnte nicht erreichbar sein, oder ein Vertrauensstellungsfehler ist aufgetreten.</system:String>
475+
<system:String x:Key="String_RemoteDesktopDisconnectReason_SslErrNoSuchUser">Der angegebene Benutzer hat kein Konto.</system:String>
476+
<system:String x:Key="String_RemoteDesktopDisconnectReason_SslErrPasswordExpired">Das Passwort ist abgelaufen.</system:String>
477+
<system:String x:Key="String_RemoteDesktopDisconnectReason_SslErrPasswordMustChange">Das Benutzerpasswort muss geändert werden, bevor Sie sich zum ersten Mal anmelden.</system:String>
478+
<system:String x:Key="String_RemoteDesktopDisconnectReason_SslErrPolicyNTLMOnly">Die Delegierung von Anmeldeinformationen an den Zielserver ist nur zulässig, wenn eine gegenseitige Authentifizierung erreicht wurde.</system:String>
479+
<system:String x:Key="String_RemoteDesktopDisconnectReason_SslErrSmartcardCardBlocked">Die Smartcard ist blockiert.</system:String>
480+
<system:String x:Key="String_RemoteDesktopDisconnectReason_SslErrSmartcardWrongPIN">Eine falsche PIN wurde der Smartcard übergeben.</system:String>
431481
</ResourceDictionary>

0 commit comments

Comments
 (0)