RDP, Windows 8 und VPN

Angenommen wir haben zwei Windows 8 Rechner (oder 2012, es geht um RDP 8). Der Client ist via VPN in das Servernetzwerk verbunden. Der Client will ein RDP Verbindung zum Server (Win 8 oder 2012, egal) machen. Der Client verbindet sich zwar friert aber instant ein, kommt vielleicht kurzfristig wieder, reconnected irgendwann, vielleicht auch mehrfach, und irgendwann fliegt man raus.

Nach langem Suchen (und auch im Rahmen eine Supportcalls bei MS dazu) wurde vermutet dass es um die verwendete Verschlüsselungsmethode bei der VPN-Verbindung geht – AES (VPN) auf AES (RDP) erzeugt hier scheinbar bei manchen Leuten seltsame Effekt, eine Umstellung auf z.B. 3DES hilft hier scheinbar manchmal. Aber natürlich nicht bei mir – erst als ich diesen Blog gelesen habe ist mir eingefallen dass sich VPN wenn im TCP/UDP Mode ähnlich verhält (einfrierende, stockende Verbindung). Und in der Connectionbar oben ist beim Verbindungsqualitätssymbol die Info dass UDP aktiv ist angezeigt worden. Also kurzerhand HKLM/SOFTWARE/Microsoft/Terminal Server Client/DisableUDPTransport=1 (REG_DWORD) gesetzt und voila: Es pfeift und hört gar nicht mehr zu pfeifen auf 😀

RDSH Seltsamkeiten

Scheinbar beginnt ein RDSH (ab 2008) ab einer gewissen Last damit die Environmentvariable CLIENTNAME von Logonscripts aus nicht oder erst zu spät korrekt aufzulösen (obwohls schon längst in der Registry steht) – erst wenn man die asynchrone Ausführung der Logonscripts (Computer oder User Configuration / Adm. Templates / System / Scripts – Computer gewinnt wie üblich wenns auf beiden gesetzt ist) ausschaltet. Damit verliert man zwar je nach Loginscript einige Sekunden beim Logon aber dafür ist CLIENTNAME zuverlässig gesetzt. Von dem Problem sind übrigens auch via GPO gestartete Programme/Scripts – die sehen ebenfalls u.U. keine Environmentvariable CLIENTNAME…

Auch sehr seltsam: Programme die über User Configuration / Windows Settings / Scripts / Logon ausgeführt werden müssen a) sich selbst beenden (oder z.B. über ein CMD mit START losgelöst gestartet werden) sonst hängt das Logon ewig und zwei Tage (wenn die asynchrone Geschichte disabled ist) und b) werden die erzeugten Prozesse wieder gekillt (vermutlich von GPSCRIPT.EXE) – d.h. man kann dort also nicht die Nicht-Ausführung der diversen Run/Startup-Möglichkeiten die einer RemoteApp mangels Explorer verweigert werden nachbauen…hab daher einen Wrapper für RemoteApps geschrieben welchen man in die RemoteApp Config als zu startendes Programm einträgt und als Parameter das eigentliche Programm und dessen Parameter verwendet. Im .config File dazu kann man dann in PostStart_1 bis _9 hinterlegen welche Programme man nach dem Start den noch gerne hätte (value ist jeweils Programm|Argumente).

Als Draufgabe wartet RemoteAppStarter noch bis sich das gestartete (Haupt)program beendet und macht anschließend Logoff damit das leidige RemoteApp-Session-bleibt-trotz-geschlossenem-Programm-übrig Problem auch gleich gelöst ist.

VMWare Workstation 9 und Windows 8 Hyper-V

Ich musste schmerzvoll feststellen dass Audials 10 auf einem Windows 8 Rechner mit aktiviertem Hyper-V das System unbootbar macht (bleibt ewig hängen) – andererseits ist die USB-Weiterleitung eines Windows Phone 8 in eine VMWare Workstation VM (für Windows Phone 8 SDK bzw. Visual Studio 2012 als Deploymentziel) um es höflich auszudrücken “holprig”.

Damit die Sache nicht zu einfach wird bringts auch nix eine Hyper-V VM mit Audials machen zu wollen – weil MS ja klugerweise das Audiomapping für Hyper-V erst gar nicht eingebaut hat, wozu auch – braucht doch eh keiner.

Also was tun wenn man für WP8 entwickeln (und damit den auf Hyper-V basierenden Emulator braucht) aber auch gleichzeitig auf der gleichen Hardware mit Audials 10 immer wieder mal was konvertieren will?

Der Versuch VMWare Workstation 9 auf einem Hyper-V Windows 8 Rechner zu installieren scheitert am Installer der da verweigert – und laufend Hyper-V über Add/Remove Windows Features aus- bzw. ein zu schalten ist vermutlich langfristig auch keine soooo gute Idee. Man kann scheinbar auch VMWare VMs betreiben wenn Hyper-V aktiv ist aber dann nur 32 Bit VMs und mit einem massiven Performanceproblem – ich hab das gar nicht probiert, einen Typ-2 Hypervisor auf einen Typ-1 Hypervisor zu setzen erschien mir etwas krank.

27 Google-Suchen weiter bin ich auf diesen Artikel gestoßen – der kopiert den Default Booteintrag vom Windows 8 und setzt bei der Kopie hypervisorlaunchtype auf off:

  • bcdedit /copy {default} /d "Windows 8 without Hyper-V"
  • bcdedit /set {guid die beim ersten Befehl rauskommt} hypervisorlaunchtype off
Wenn man nur alle (halb-)heiligen Zeiten die VM braucht eine gangbare Lösung.

Lync 2013 CU1 Update Warning

Ein weiteres “you can safely ignore this warning”: Wer bei der Installation vom Lync 2013 CU1 folgendes Warning bekommt

....
Dropping error message table.
Creating database objects.
Executing RtcAbTypes.sql...
Warning: Failed to execute batch --
-- Copyright (c) Microsoft Corporation. All rights reserved.
--
exec sp_addrole N'ServerRole'.
Executing RtcAbDb.sql...
Updating database roles.
Setting owner for database rtcab to sa.
.....

sollte sich nicht wirklich grämen, das kann man offensichtlich ignorieren, zur Sicherheit in DB RtcAb (Instanz RTC wenn mans lokal hat) in den Permissions schauen ob dort die Rolle “ServerRole” existiert und das Recht “View database state” hat dann ist alles gut.

Die anderen zwei Warnings die einem normalerweise entgegen geschleudert werden kann man auch ignorieren, die sind in Wahrheit nur Info:

Setting SQL Server Show Advanced Options to 1
Setting SQL Server Recover Interval to 5 mins.

Windows 8 und das F8 Menü

Microsoft hat in Windows 8 das “Starterlebnis” ja vollkommen umgebaut – dazu gehört auch ein teilweise weit über 10 Minuten langer Versuch sich selbst zu heilen wenn man mit F8 bootet (Win-I führt zum gleichen Ergebnis), was – wenn man weiß man tun will – schon recht nervig sein kann weil es üblicherweise ja nicht bei einem Durchlauf bleibt 😀

Um so richtig schnell ins gewohnte F8-Menü zu kommen einfach das “alte” Bootmenü von Vista/7 enablen:

bcdedit /set {bootmgr} displaybootmenu true
bcdedit /set {bootmgr} timeout 5

Kostet zwar 5 Sekunden bei jedem Boot, schont aber die Nerven im Problemfall enorm 😀

.NET 4.0 Bug: RegDeleteKeyEx remote auf XP

Im .NET Framework 4.0 führt Microsoft.Win32.RegistryKey.DeleteSubKeyTree() remote gegen einen XP Rechner geschossen zu einer netten Exception “The procedure number is out of range.”.
Grund: Die Win32 Funktion RegDeleteKeyEx() wird erst ab Vista in advapi32.dll unterstützt (MSDN-Thread).
Workaround: Selber rekursiv löschen, Beispiel:
      [DllImport("advapi32.dll", EntryPoint = "RegDeleteKey", SetLastError = true)]
      public static extern int RegDeleteKey(IntPtr hKey, string sSubKey);

      public static int RecurseDeleteKey(RegistryKey oKey, string sKey)
      {
         int nStatus;
         RegistryKey oSubKey;

         oSubKey = oKey.OpenSubKey(sKey);
         foreach (string sSubKey in oSubKey.GetSubKeyNames())
         {
            if ((nStatus = RecurseDeleteKey(oSubKey, sSubKey)) != 0)
            {
               try { oSubKey.Close(); } catch (Exception) { }
               return nStatus;
            }
         }
         nStatus = RegDeleteKey(oKey.Handle.DangerousGetHandle(), sKey);
         try { oSubKey.Close(); } catch (Exception) { }
         return nStatus;
      }


WDS Discover Image ohne DHCP

Das Problem: Rechner ohne DHCP soll mit WDS beatmet werden. Das Discover-Image besteht aber auf DHCP, findet der Rechner keine Adresse kommt Fehler – macht man in der Zwischenzeit SHIFT+F10 und netsh Interface ip set address "<Verbindungsname, z.B. LAN-Verbindung>" static <Adresse> <Subnet> <Gateway> hat man zwar eine superdolle statische Adresse aber sobald man den Fehler vom Setup wegklickt fährt die Gurke runter, ein Parallelstart von Setup.exe funktioniert auch nicht da das Zeug offensichtlich prüft ob es schon läuft 🙁

Im TechNet ist recht gut beschrieben wie man ein Custom Image macht:

  • Discover-WIM mounten
  • WindowsSystem32Winpeshl.ini editieren, z.B. das Setup rausnehmen und %systemroot%Windowssystem32cmd.exe oder irgendeine Custom-GUI, Script, whatever reingeben
  • WIM committen und in ISO, auf Stick, wherever geben
  • Damit booten, mit WPEUTIL InitializeNetwork Netzwerk starten
  • mit dem o.a. NETSH Kommando statische Adresse vergeben
  • mit %systemroot%SourcesSetup.exe /wds /wdsdiscover /wdsserver:whatever das discovery starten (/wdsserver ist optional)

PortUsers

Wer schon immer (filterbar) wissen wollte welches Programm in welcher Sitzung (Terminalserver) von welchem Rechner (Terminalserver) mit welchem User auf welche Ports auf welchen Zielen zugreift: PortUsers kann das 😀

RemoteApps und das Logoff-Problem

Selbst wenn man alle Möglichkeiten wie

  • tsconfig.msc/RDP-Tcp/Sitzungen/Wenn das Sitzungslimit erreicht oder die Verbindung getrennt wurde: Sitzung beenden
  • lokale Policy: Computereinstellungen/Adm.Vorlagen/Remotedesktopdienste/Remotedesktopsitzungs-Host/Sitzungslimits/Zeitlimit für die Abmeldung bei RemoteApp-Sitzungen festlegen (aktiviert/sofort)

ausnutzt passiert es immer wieder dass Sessions im disconnected Status (wenn auch nur für kurze Zeit) herum lungern. Wenn man nun viele Sessions mit einem Benutzer betreibt und ein Reconnect verhindern will ist man an dieser Stelle ziemlich *zensur*.

Zum Glück gibt es WTSRegisterSessionNotification, damit kann man sein Interesse an Änderungen des Sessionstatus bekannt geben – und wenn die Session disconnected wird kann man dann einfach ein Logoff anwerfen. Das Tool dazu: WTSLogoffOnDisconnect. Einmal in die Session gestartet (z.B. über lokale Police/Benutzereinstellungen/Windows-Einstellungen/Scripts/Anmelden, Run-Key wird ja für RemoteApp mangels Explorer nicht ausgewertet) führt es ein Logoff durch sobald die Sitzung getrennt wird. %ProgramData%ROMGAL muss dafür existieren und für alle in Frage kommenden Benutzer beschreibbar sein – da kommt das Logfile rein.