diff --git a/CHANGELOG b/CHANGELOG index d652b86..9007f0f 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,4 +1,8 @@ -2020-01-25 Version 2.8.0 (stable) +2020-01-26 Version 2.8.0 (stable) + pre-requisites change; myrtille now requires Windows 8.1 or Windows Server 2012 R2 or greater + the installer is now shipped without bootstraper (Setup.exe); open the myrtille msi file directly instead + the installer now installs the myrtille pre-requisites automatically (roles and features); the related powershell scripts can also be run manually from outside the installer, if needed + the installer now supports upgrading (thanks to Orca, which allows finer control over msi files), removing the need to uninstall a previous version first myrtille is now available as a docker image (see DOCUMENTATION.MD) resynced FreeRDP (among many things, fixes some issues related to the clipboard and audio) fixed session disconnect occuring under some circumstances on clipboard paste @@ -6,9 +10,6 @@ simplified hosts management (no domain or enterprise mode required); default login: admin/admin (changed upon first login) updated the enterprise mode so that a member of "EnterpriseAdminGroup" can connect an host whatever the allowed groups or users defined on it (thanks dgcom) fixed an issue with the enterprise mode, which prompted to change the password due to expiration whereas the expiration date was just not set (thanks dgcom) - the installer is now shipped without bootstraper (Setup.exe); open Myrtille.msi directly instead - the installer now installs the myrtille pre-requisites automatically (roles and features); the related script (Myrtille.Web\Install.ps1) can also be run manually from outside the installer, if needed - the installer now supports upgrading (thanks to Orca, which allows finer control over msi files), removing the need to uninstall a previous version first security protocol is now configurable for RDP over VM bus user domain is now configurable whatever the protocol and displayed into the toolbar, if defined updated comments to drain disconnected sessions when using a connection broker in HA mode (myrtille services config) diff --git a/DOCUMENTATION.md b/DOCUMENTATION.md index ed2c874..43cd936 100644 --- a/DOCUMENTATION.md +++ b/DOCUMENTATION.md @@ -41,19 +41,17 @@ I hope you will enjoy Myrtille! :) Special thanks to Catalin Trifanescu for its support. ## Installation -You need at least IIS 7 before installing myrtille (the HTTP(S) to RDP/SSH gateway). It installs as a role on Windows Servers and as a feature on others Windows versions. +Starting from version 2.8.0, the Myrtille requirements change: Windows 8.1 or Windows Server 2012 R2 or greater. This is partly because of the automated installation of the roles and features required by myrtille (which requires a modern powershell) and partly to deliver the best user experience possible (fast display and audio support), as HTML5 websockets (supported by all browsers nowadays) are only available in IIS 8.0+ (Windows 8.1 or Windows Server 2012 R2 or greater). -**CAUTION! If you want to use websockets**, you need IIS 8 or greater with the websocket protocol enabled (disabled by default; see https://www.iis.net/configreference/system.webserver/websocket). +That said, Myrtille will continue to fallback to HTML4 (xhr and long-polling) if websockets are not enabled into IIS (it's optional) or if the websocket traffic is blocked by any network equipment. -The .NET 4.5+ framework can be installed automatically by the myrtille installer (Setup.exe), enabled as a feature of IIS (Web Server role > Applications Development > ASP.NET 4.5 on Windows Server 2012) or installed separately (https://www.microsoft.com/en-us/download/details.aspx?id=30653). +The .NET 4.5+ framework can be installed automatically by the myrtille installer, enabled as a feature of IIS (Web Server role > Applications Development > ASP.NET 4.5 on Windows Server 2012) or installed separately (https://www.microsoft.com/en-us/download/details.aspx?id=30653). Into the roles and features management, ensure you have enabled **HTTP Activation** under ".NET Framework 4.5+ Features" > "WCF Services" (required by the Myrtille services and REST API). The installer does install myrtille under the IIS default website and creates a custom application pool ("MyrtilleAppPool"). If you want to use another website or application pool, you can change it manually afterward (with the IIS manager). All releases here: https://github.com/cedrozor/myrtille/releases -- Setup.exe (preferred installation method): setup bootstrapper -- Myrtille.msi: MSI package (x86) ## Docker From version 2.8.0, Myrtille is available as a docker image. @@ -163,7 +161,7 @@ If your browser machine is on the same network as the gateway or the remote serv If your remote server have internet access, you can also use a cloud printer (such a Google Print). ## Security -The installer can create a self-signed certificate for myrtille (so you can use it at https://myserver/myrtille), but you can set your own certificate (if you wish). +The installer can create a self-signed certificate for myrtille (so you can use it at https://myserver/myrtille), but you can set your own certificate (if you wish) to prevent the users from having to add a security exception into their browser. ## Configuration / Performance tweaks / Debug Both the gateway and services have their own .NET config files; the gateway also uses XDT transform files to adapt the settings depending on the current solution configuration. @@ -369,7 +367,7 @@ See the Myrtille.Admin.Web **mockup** to see how to implement Myrtille into your - the clipboard synchronization requires Chrome (or async clipboard API support) and HTTPS connection and is limited to text only and 1MB max ## Troubleshoot -First at all, ensure the Myrtille prerequisites are met (IIS 7 or greater (preferably IIS 8+ with websocket protocol enabled) and .NET 4.5+). Note that IIS must be installed separately, before running the installer (see "Installation"). +First at all, ensure the Myrtille prerequisites are met (see "Installation"). Also please read notes and limitations above. diff --git a/Myrtille.Admin.Services/Myrtille.Admin.Services.Install.ps1 b/Myrtille.Admin.Services/Myrtille.Admin.Services.Install.ps1 index c16e1d5..6f053f8 100644 Binary files a/Myrtille.Admin.Services/Myrtille.Admin.Services.Install.ps1 and b/Myrtille.Admin.Services/Myrtille.Admin.Services.Install.ps1 differ diff --git a/Myrtille.Admin.Services/Myrtille.Admin.Services.Uninstall.ps1 b/Myrtille.Admin.Services/Myrtille.Admin.Services.Uninstall.ps1 index 680ea14..ef5b94a 100644 Binary files a/Myrtille.Admin.Services/Myrtille.Admin.Services.Uninstall.ps1 and b/Myrtille.Admin.Services/Myrtille.Admin.Services.Uninstall.ps1 differ diff --git a/Myrtille.Admin.Services/ServicesInstaller.cs b/Myrtille.Admin.Services/ServicesInstaller.cs index 4ffe211..9695025 100644 --- a/Myrtille.Admin.Services/ServicesInstaller.cs +++ b/Myrtille.Admin.Services/ServicesInstaller.cs @@ -72,7 +72,7 @@ public override void Install( " -Command \"& '" + Path.Combine(Path.GetFullPath(Context.Parameters["targetdir"]), "bin", "Myrtille.Admin.Services.Install.ps1") + "'" + " -BinaryPath '" + Path.Combine(Path.GetFullPath(Context.Parameters["targetdir"]), "bin", "Myrtille.Admin.Services.exe") + "'" + " -DebugMode " + (debug ? "1" : "0") + - " 3>&1 2>&1 | Tee-Object -FilePath '" + Path.Combine(Path.GetFullPath(Context.Parameters["targetdir"]), "log", "Myrtille.Admin.Services.Install.log") + "'" + "\""; + " | Tee-Object -FilePath '" + Path.Combine(Path.GetFullPath(Context.Parameters["targetdir"]), "log", "Myrtille.Admin.Services.Install.log") + "'" + "\""; process.Start(); process.WaitForExit(); @@ -162,7 +162,7 @@ private void DoUninstall() process.StartInfo.Arguments = "-ExecutionPolicy Bypass" + " -Command \"& '" + Path.Combine(Path.GetFullPath(Context.Parameters["targetdir"]), "bin", "Myrtille.Admin.Services.Uninstall.ps1") + "'" + " -DebugMode " + (debug ? "1" : "0") + - " 3>&1 2>&1 | Tee-Object -FilePath '" + Path.Combine(Path.GetFullPath(Context.Parameters["targetdir"]), "log", "Myrtille.Admin.Services.Uninstall.log") + "'" + "\""; + " | Tee-Object -FilePath '" + Path.Combine(Path.GetFullPath(Context.Parameters["targetdir"]), "log", "Myrtille.Admin.Services.Uninstall.log") + "'" + "\""; process.Start(); process.WaitForExit(); @@ -177,8 +177,9 @@ private void DoUninstall() } catch (Exception exc) { + // in case of any error, don't rethrow the exception or myrtille won't be uninstalled otherwise (rollback action) + // if myrtille can't be uninstalled, it can't be re-installed either! (at least, with an installer of the same product code) Context.LogMessage(string.Format("Failed to uninstall Myrtille.Admin.Services ({0})", exc)); - throw; } } } diff --git a/Myrtille.Services/Myrtille.Services.Install.ps1 b/Myrtille.Services/Myrtille.Services.Install.ps1 index 71c8015..dbe1342 100644 Binary files a/Myrtille.Services/Myrtille.Services.Install.ps1 and b/Myrtille.Services/Myrtille.Services.Install.ps1 differ diff --git a/Myrtille.Services/Myrtille.Services.Uninstall.ps1 b/Myrtille.Services/Myrtille.Services.Uninstall.ps1 index a87f469..657bd7c 100644 Binary files a/Myrtille.Services/Myrtille.Services.Uninstall.ps1 and b/Myrtille.Services/Myrtille.Services.Uninstall.ps1 differ diff --git a/Myrtille.Services/ServicesInstaller.cs b/Myrtille.Services/ServicesInstaller.cs index 60adc2b..2e100a9 100644 --- a/Myrtille.Services/ServicesInstaller.cs +++ b/Myrtille.Services/ServicesInstaller.cs @@ -73,7 +73,7 @@ public override void Install( " -Command \"& '" + Path.Combine(Path.GetFullPath(Context.Parameters["targetdir"]), "bin", "Myrtille.Services.Install.ps1") + "'" + " -BinaryPath '" + Path.Combine(Path.GetFullPath(Context.Parameters["targetdir"]), "bin", "Myrtille.Services.exe") + "'" + " -DebugMode " + (debug ? "1" : "0") + - " 3>&1 2>&1 | Tee-Object -FilePath '" + Path.Combine(Path.GetFullPath(Context.Parameters["targetdir"]), "log", "Myrtille.Services.Install.log") + "'" + "\""; + " | Tee-Object -FilePath '" + Path.Combine(Path.GetFullPath(Context.Parameters["targetdir"]), "log", "Myrtille.Services.Install.log") + "'" + "\""; process.Start(); process.WaitForExit(); @@ -242,7 +242,7 @@ private void DoUninstall() process.StartInfo.Arguments = "-ExecutionPolicy Bypass" + " -Command \"& '" + Path.Combine(Path.GetFullPath(Context.Parameters["targetdir"]), "bin", "Myrtille.Services.Uninstall.ps1") + "'" + " -DebugMode " + (debug ? "1" : "0") + - " 3>&1 2>&1 | Tee-Object -FilePath '" + Path.Combine(Path.GetFullPath(Context.Parameters["targetdir"]), "log", "Myrtille.Services.Uninstall.log") + "'" + "\""; + " | Tee-Object -FilePath '" + Path.Combine(Path.GetFullPath(Context.Parameters["targetdir"]), "log", "Myrtille.Services.Uninstall.log") + "'" + "\""; process.Start(); process.WaitForExit(); @@ -261,8 +261,9 @@ private void DoUninstall() } catch (Exception exc) { + // in case of any error, don't rethrow the exception or myrtille won't be uninstalled otherwise (rollback action) + // if myrtille can't be uninstalled, it can't be re-installed either! (at least, with an installer of the same product code) Context.LogMessage(string.Format("Failed to uninstall Myrtille.Services ({0})", exc)); - throw; } } } diff --git a/Myrtille.Web/Myrtille.Web.Install.ps1 b/Myrtille.Web/Myrtille.Web.Install.ps1 index 4c85dd5..ceed795 100644 Binary files a/Myrtille.Web/Myrtille.Web.Install.ps1 and b/Myrtille.Web/Myrtille.Web.Install.ps1 differ diff --git a/Myrtille.Web/Myrtille.Web.Uninstall.ps1 b/Myrtille.Web/Myrtille.Web.Uninstall.ps1 index 4204f22..45c9ab6 100644 Binary files a/Myrtille.Web/Myrtille.Web.Uninstall.ps1 and b/Myrtille.Web/Myrtille.Web.Uninstall.ps1 differ diff --git a/Myrtille.Web/src/WebInstaller.cs b/Myrtille.Web/src/WebInstaller.cs index 42594b4..4326c90 100644 --- a/Myrtille.Web/src/WebInstaller.cs +++ b/Myrtille.Web/src/WebInstaller.cs @@ -78,7 +78,7 @@ public override void Install( " -InstallPath '" + Path.GetFullPath(Context.Parameters["targetdir"]) + "'" + " -SslCert " + (!string.IsNullOrEmpty(Context.Parameters["SSLCERT"]) ? "1" : "0") + " -DebugMode " + (debug ? "1" : "0") + - " 3>&1 2>&1 | Tee-Object -FilePath '" + Path.Combine(Path.GetFullPath(Context.Parameters["targetdir"]), "log", "Myrtille.Web.Install.log") + "'" + "\""; + " | Tee-Object -FilePath '" + Path.Combine(Path.GetFullPath(Context.Parameters["targetdir"]), "log", "Myrtille.Web.Install.log") + "'" + "\""; process.Start(); process.WaitForExit(); @@ -243,7 +243,7 @@ private void DoUninstall() process.StartInfo.Arguments = "-ExecutionPolicy Bypass" + " -Command \"& '" + Path.Combine(Path.GetFullPath(Context.Parameters["targetdir"]), "Myrtille.Web.Uninstall.ps1") + "'" + " -DebugMode " + (debug ? "1" : "0") + - " 3>&1 2>&1 | Tee-Object -FilePath '" + Path.Combine(Path.GetFullPath(Context.Parameters["targetdir"]), "log", "Myrtille.Web.Uninstall.log") + "'" + "\""; + " | Tee-Object -FilePath '" + Path.Combine(Path.GetFullPath(Context.Parameters["targetdir"]), "log", "Myrtille.Web.Uninstall.log") + "'" + "\""; process.Start(); process.WaitForExit(); @@ -258,8 +258,9 @@ private void DoUninstall() } catch (Exception exc) { + // in case of any error, don't rethrow the exception or myrtille won't be uninstalled otherwise (rollback action) + // if myrtille can't be uninstalled, it can't be re-installed either! (at least, with an installer of the same product code) Context.LogMessage(string.Format("Failed to uninstall Myrtille.Web ({0})", exc)); - throw; } } } diff --git a/README.md b/README.md index efacb2f..a610bbb 100644 --- a/README.md +++ b/README.md @@ -33,7 +33,7 @@ More information in the DOCUMENTATION.md file. ## Requirements - Browser: any HTML4 or HTML5 browser (starting from IE6!). No extension or administrative rights required. The clipboard synchronization requires Chrome (or async clipboard API support) and HTTPS connection -- Gateway (myrtille): IIS 7 or greater (preferably IIS 8+ with websocket protocol enabled) and .NET 4.5+ (with WCF Services > HTTP Activation enabled) +- Gateway (myrtille): Windows 8.1 or Windows Server 2012 R2 or greater (IIS 8.0+, .NET 4.5+ and WCF/HTTP activation enabled) - RDP server: any RDP enabled machine (preferably Windows Server but can also be Windows XP, 7, 8, 10 or Linux xRDP server) - SSH server: any SSH server (tests were made using the built-in Windows 10 OpenSSH server)