merge from develop

This commit is contained in:
Faryan Rezagholi
2021-12-14 19:48:10 +01:00
222 changed files with 144307 additions and 13186 deletions

View File

@@ -5,6 +5,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
## [Unreleased]
### Added
- #327: Added Alternative Shell for RDP settings
- #1476: Configurable backups. Can now edit/set backup frequency, backup path, and max number of backup files.
- #1427: Fix RDP local desktop scale not taking effect on remote
- #1770: Added missing RDP performance settings
- #1332: Added option to hide menu strip container
@@ -14,6 +16,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
- #319: Override quick connect username when using user@domain
- #283: Support for native PowerShell remoting as new protocol
- #1850: Minify config xml
- #1516: added API to access credential vault (Thycotic Secret Server) by specifying SSAPI:ID as username
- #503: SSH Execute a single command after login
### Changed
- #2022: Replaced CefSharp with WebView2
- #2014: Revised icons
@@ -26,6 +30,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
- #1690: Replaced GeckoFX (Firefox) with CefSharp (Chromium)
- #1325: Language resource files cleanup
### Fixed
- #2079: Fixed theme files not being copied to output directory
- #1884: Allow setting Port when using MSSQL
- #1783: Added missing inheritance properties to SQL scripts
- #1773: Connection issue with mysql - Missing fields in
@@ -37,8 +42,10 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
- #1595: Unhandled exception when trying to browse through non existent multi ssh history with keyboard key strokes
- #1589: Update SQL tables instead of rewriting them
- #1465: REGRESSION: Smart Cards redirection to Remote Desktop not working
- #1363: Don't show "Disk Usage" button in installer
- #1337: Unhandled exception after closing mRemoteNG
- #359: Making a VNC connection to an unreachable host causes the application to not respond for 20-30 seconds
- #618: Do not break the Windows Clipboard Chain when exiting.
## [1.77.1] - 2019-09-02
### Added

View File

@@ -278,62 +278,3 @@ PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGES.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
convey the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License along
with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
Also add information on how to contact you by electronic and paper mail.
If the program is interactive, make it output a short notice like this
when it starts in an interactive mode:
Gnomovision version 69, Copyright (C) year name of author
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, the commands you use may
be called something other than `show w' and `show c'; they could even be
mouse-clicks or menu items--whatever suits your program.
You should also get your employer (if you work as a programmer) or your
school, if any, to sign a "copyright disclaimer" for the program, if
necessary. Here is a sample; alter the names:
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
`Gnomovision' (which makes passes at compilers) written by James Hacker.
<signature of Ty Coon>, 1 April 1989
Ty Coon, President of Vice
This General Public License does not permit incorporating your program into
proprietary programs. If your program is a subroutine library, you may
consider it more useful to permit linking proprietary applications with the
library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License.

View File

@@ -1,123 +0,0 @@
# Contributors
## Current mRemoteNG dev team
[David Sparer](http://github.com/sparerd)
[Sean Kaim](http://github.com/kmscode)
[Faryan Rezagholi](http://github.com/farosch)
[Bennett Blodinger](http://github.com/benwa)
[Joe Cefoli](http://github.com/jcefoli)
[countchappy](http://github.com/countchappy)
Tony Lambert
[Julien Roncaglia](http://github.com/vbfox)
[peterchenadded](http://github.com/peterchenadded)
[Brandon Wulf](http://github.com/mrwulf)
[Pedro Rodrigues](http://github.com/pedro2555)
[dekelMP](http://github.com/dekelMP)
[Bruce](http://github.com/brucetp)
[Camilo Alvarez](http://github.com/jotatsu)
[DamianBis](http://github.com/DamianBis)
[pfjason](http://github.com/pfjason)
[sirLoaf](http://github.com/sirLoaf)
[Fyers](http://github.com/Fyers)
[Vladimir Semenov](http://github.com/sli-pro)
[Stephan](http://github.com/st-schuler)
[Aleksey Reytsman](http://github.com/areytsman)
[Cristian Abelleira](http://github.com/CrAbelleira)
[MitchellBot](http://github.com/MitchellBot)
[Filippo Ferrazini](http://github.com/Filippo125)
## Past Contributors
Felix Deimel - mRemote original developer
Riley McArdle - mRemoteNG original developer
[Hayato Iriumi](http://github.com/hiriumi)
Jason Barbier
Wiktor Beryt
Lionel Caignec
Ruben d'Arco
Holger Henke
Tom Hiller
Apisitt Rattana
Andreas Rehm
David Vidmar
[Brandhor](http://github.com/Brandhor)
[Dimitrij](http://github.com/Kvarkas)
## Translators
Eugenio "Ryo567" Martínez
Mathieu Pape
Emanuel Silva
Robert Siwiec
Hayato Iriumi
[Sebastien Thieury](http://github.com/SebThieu)
Riza Emet
[Lukas Plachy](http://github.com/rheingold)
Gyuha Shin
[Stefan](http://github.com/polluks)
[emazv72](http://github.com/emazv72)
[Vladimir Semenov](http://github.com/sli-pro)
[Marco Sousa](http://github.com/marcomsousa)
[wwj402](http://github.com/wwj402)
[Fyers](http://github.com/Fyers)
[pablomh](http://github.com/pablomh)
[Damian Szczepanik](http://github.com/damianszczepanik)
[Mant1kor](http://github.com/Mant1kor)
# Included Source Code
**[Command Line Arguments Parser](http://www.codeproject.com/KB/recipes/command_line.aspx)**
Copyright © 2002 Richard Lopes
MIT License
**[FilteredPropertyGrid](http://www.codeproject.com/KB/cs/FilteredPropertyGrid.aspx)**
Copyright © 2006 Azuria
**[InputBox](http://www.csharp-examples.net/inputbox/)**
Copyright © 2016 Jan Slama
**[IP TextBox](http://www.codeproject.com/Articles/11576/IP-TextBox)**
Copyright © 2005 mawnkay
**[PortableSettingsProvider](https://github.com/crdx/PortableSettingsProvider)**
Copyright © 2014 crdx
**[ADTree](http://www.codeproject.com/KB/selection/ADPickerCtrl.aspx)**
Copyright © 2004 Marc Merritt © 2008 Felix Deimel
# Included Components
**[DockPanel Suite](https://github.com/dockpanelsuite/dockpanelsuite)**
Copyright © 2018 @roken and @lextm (formerly Weifen Luo)
MIT License
**[log4net](http://logging.apache.org/log4net/)**
Copyright © 2001-2015 The Apache Software Foundation
Apache License Version 2.0
**[PuTTY](http://www.chiark.greenend.org.uk/~sgtatham/putty/)**
Copyright © 1997-2017 Simon Tatham
MIT License
**[Silk Icon Set](http://www.famfamfam.com/)**
Copyright © 2005-2008 FAMFAMFAM
Creative Commons Attribution 2.5 License
**[SSH.NET](https://github.com/sshnet/SSH.NET)**
Copyright © 2016
MIT License
**[VncSharp](https://github.com/humphd/VncSharp) (Archived)**
Copyright © 2004-2009 David Humphrey
GNU General Public License (GPL) Version 2
**[ObjectListView](https://sourceforge.net/projects/objectlistview/)**
Copyright © 2006-2016 Phillip Piper
GNU General Public License (GPL) Version 3
**[ConsoleControl](https://github.com/dwmkerr/consolecontrol)**
Copyright © 2015 Dave Kerr
MIT License

View File

@@ -0,0 +1,207 @@
namespace ExternalConnectors.AWS
{
partial class AWSConnectionForm
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.tbAccesKeyID = new System.Windows.Forms.TextBox();
this.tbAccesKey = new System.Windows.Forms.TextBox();
this.btnOK = new System.Windows.Forms.Button();
this.btnCancel = new System.Windows.Forms.Button();
this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel();
this.tbRegion = new System.Windows.Forms.TextBox();
this.label3 = new System.Windows.Forms.Label();
this.label1 = new System.Windows.Forms.Label();
this.label2 = new System.Windows.Forms.Label();
this.tableLayoutPanel2 = new System.Windows.Forms.TableLayoutPanel();
this.tableLayoutPanel1.SuspendLayout();
this.tableLayoutPanel2.SuspendLayout();
this.SuspendLayout();
//
// tbAccesKeyID
//
this.tbAccesKeyID.Dock = System.Windows.Forms.DockStyle.Fill;
this.tbAccesKeyID.Location = new System.Drawing.Point(260, 7);
this.tbAccesKeyID.Margin = new System.Windows.Forms.Padding(6, 7, 6, 7);
this.tbAccesKeyID.Name = "tbAccesKeyID";
this.tbAccesKeyID.Size = new System.Drawing.Size(842, 35);
this.tbAccesKeyID.TabIndex = 0;
//
// tbAccesKey
//
this.tbAccesKey.Dock = System.Windows.Forms.DockStyle.Fill;
this.tbAccesKey.Location = new System.Drawing.Point(260, 86);
this.tbAccesKey.Margin = new System.Windows.Forms.Padding(6, 7, 6, 7);
this.tbAccesKey.Name = "tbAccesKey";
this.tbAccesKey.Size = new System.Drawing.Size(842, 35);
this.tbAccesKey.TabIndex = 2;
//
// btnOK
//
this.btnOK.Anchor = System.Windows.Forms.AnchorStyles.Right;
this.btnOK.DialogResult = System.Windows.Forms.DialogResult.OK;
this.btnOK.Location = new System.Drawing.Point(378, 23);
this.btnOK.Margin = new System.Windows.Forms.Padding(6, 7, 6, 7);
this.btnOK.Name = "btnOK";
this.btnOK.Size = new System.Drawing.Size(150, 53);
this.btnOK.TabIndex = 10;
this.btnOK.Text = "OK";
this.btnOK.UseVisualStyleBackColor = true;
//
// btnCancel
//
this.btnCancel.Anchor = System.Windows.Forms.AnchorStyles.Left;
this.btnCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;
this.btnCancel.Location = new System.Drawing.Point(580, 23);
this.btnCancel.Margin = new System.Windows.Forms.Padding(6, 7, 6, 7);
this.btnCancel.Name = "btnCancel";
this.btnCancel.Size = new System.Drawing.Size(150, 53);
this.btnCancel.TabIndex = 11;
this.btnCancel.Text = "Cancel";
this.btnCancel.UseVisualStyleBackColor = true;
//
// tableLayoutPanel1
//
this.tableLayoutPanel1.ColumnCount = 2;
this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 22.92994F));
this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 77.07006F));
this.tableLayoutPanel1.Controls.Add(this.tbRegion, 1, 2);
this.tableLayoutPanel1.Controls.Add(this.label3, 0, 2);
this.tableLayoutPanel1.Controls.Add(this.label1, 0, 0);
this.tableLayoutPanel1.Controls.Add(this.label2, 0, 1);
this.tableLayoutPanel1.Controls.Add(this.tbAccesKeyID, 1, 0);
this.tableLayoutPanel1.Controls.Add(this.tbAccesKey, 1, 1);
this.tableLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Top;
this.tableLayoutPanel1.Location = new System.Drawing.Point(0, 0);
this.tableLayoutPanel1.Margin = new System.Windows.Forms.Padding(6, 7, 6, 7);
this.tableLayoutPanel1.Name = "tableLayoutPanel1";
this.tableLayoutPanel1.RowCount = 3;
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F));
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F));
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 46F));
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 46F));
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 46F));
this.tableLayoutPanel1.Size = new System.Drawing.Size(1108, 205);
this.tableLayoutPanel1.TabIndex = 12;
//
// tbRegion
//
this.tbRegion.Dock = System.Windows.Forms.DockStyle.Fill;
this.tbRegion.Location = new System.Drawing.Point(260, 165);
this.tbRegion.Margin = new System.Windows.Forms.Padding(6, 7, 6, 7);
this.tbRegion.Name = "tbRegion";
this.tbRegion.Size = new System.Drawing.Size(842, 35);
this.tbRegion.TabIndex = 6;
//
// label3
//
this.label3.AutoSize = true;
this.label3.Dock = System.Windows.Forms.DockStyle.Fill;
this.label3.Location = new System.Drawing.Point(6, 158);
this.label3.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0);
this.label3.Name = "label3";
this.label3.Size = new System.Drawing.Size(242, 47);
this.label3.TabIndex = 5;
this.label3.Text = "Region";
this.label3.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
//
// label1
//
this.label1.AutoSize = true;
this.label1.Dock = System.Windows.Forms.DockStyle.Fill;
this.label1.Location = new System.Drawing.Point(6, 0);
this.label1.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(242, 79);
this.label1.TabIndex = 2;
this.label1.Text = "Access Key ID";
this.label1.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
//
// label2
//
this.label2.AutoSize = true;
this.label2.Dock = System.Windows.Forms.DockStyle.Fill;
this.label2.Location = new System.Drawing.Point(6, 79);
this.label2.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0);
this.label2.Name = "label2";
this.label2.Size = new System.Drawing.Size(242, 79);
this.label2.TabIndex = 4;
this.label2.Text = "Access Key";
this.label2.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
//
// tableLayoutPanel2
//
this.tableLayoutPanel2.ColumnCount = 5;
this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 160F));
this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F));
this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 40F));
this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F));
this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 160F));
this.tableLayoutPanel2.Controls.Add(this.btnOK, 1, 0);
this.tableLayoutPanel2.Controls.Add(this.btnCancel, 3, 0);
this.tableLayoutPanel2.Dock = System.Windows.Forms.DockStyle.Bottom;
this.tableLayoutPanel2.Location = new System.Drawing.Point(0, 344);
this.tableLayoutPanel2.Margin = new System.Windows.Forms.Padding(6, 7, 6, 7);
this.tableLayoutPanel2.Name = "tableLayoutPanel2";
this.tableLayoutPanel2.RowCount = 1;
this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));
this.tableLayoutPanel2.Size = new System.Drawing.Size(1108, 99);
this.tableLayoutPanel2.TabIndex = 13;
//
// AWSConnectionForm
//
this.AcceptButton = this.btnOK;
this.AutoScaleDimensions = new System.Drawing.SizeF(12F, 30F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(1108, 443);
this.Controls.Add(this.tableLayoutPanel2);
this.Controls.Add(this.tableLayoutPanel1);
this.Margin = new System.Windows.Forms.Padding(6, 7, 6, 7);
this.Name = "AWSConnectionForm";
this.Text = "AWS EC2 API Login Data";
this.Activated += new System.EventHandler(this.AWSConnectionForm_Activated);
this.tableLayoutPanel1.ResumeLayout(false);
this.tableLayoutPanel1.PerformLayout();
this.tableLayoutPanel2.ResumeLayout(false);
this.ResumeLayout(false);
}
#endregion
public System.Windows.Forms.TextBox tbAccesKeyID;
public System.Windows.Forms.TextBox tbAccesKey;
private System.Windows.Forms.Button btnOK;
private System.Windows.Forms.Button btnCancel;
private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1;
private System.Windows.Forms.Label label2;
private System.Windows.Forms.Label label1;
private System.Windows.Forms.TableLayoutPanel tableLayoutPanel2;
public System.Windows.Forms.TextBox tbRegion;
private System.Windows.Forms.Label label3;
}
}

View File

@@ -0,0 +1,16 @@
namespace ExternalConnectors.AWS
{
public partial class AWSConnectionForm : Form
{
public AWSConnectionForm()
{
InitializeComponent();
}
private void AWSConnectionForm_Activated(object sender, EventArgs e)
{
tbAccesKeyID.Focus();
}
}
}

View File

@@ -0,0 +1,60 @@
<root>
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

View File

@@ -0,0 +1,119 @@
using Amazon;
using Amazon.EC2;
using Amazon.EC2.Model;
using Microsoft.Win32;
namespace ExternalConnectors.AWS
{
public class EC2FetchDataService
{
private static DateTime lastFetch;
private static List<InstanceInfo>? lastData;
// input must be in format "AWSAPI:instanceid" where instanceid is the ec2 instance id, e.g. i-066f750a76c97583d
public static async Task<string> GetEC2InstanceDataAsync(string input)
{
// get secret id
if (!input.StartsWith("AWSAPI:"))
throw new Exception("calling this function requires AWSAPI: input");
string InstanceID = input[7..];
// init connection credentials, display popup if necessary
AWSConnectionData.Init();
var alldata = await GetEC2IPDataAsync();
var found = alldata.Where(x => x.InstanceId == InstanceID).SingleOrDefault();
return (found == null) ? "" : found.PublicIP;
}
private static async Task<List<InstanceInfo>> GetEC2IPDataAsync()
{
// caching
TimeSpan timeSpan = DateTime.Now - lastFetch;
if (timeSpan.TotalMinutes < 1 && lastData != null)
return lastData;
AWSConfigs.AWSRegion = AWSConnectionData.region;
string awsAccessKeyId = AWSConnectionData.awsKeyID;
string awsSecretAccessKey = AWSConnectionData.awsKey;
var _client = new AmazonEC2Client(awsAccessKeyId, awsSecretAccessKey, RegionEndpoint.EUCentral1);
bool done = false;
List<InstanceInfo> instanceList = new();
var request = new DescribeInstancesRequest();
while (!done)
{
DescribeInstancesResponse response = await _client.DescribeInstancesAsync(request);
foreach (var reservation in response.Reservations)
{
foreach (var instance in reservation.Instances)
{
string vmname = "";
foreach (var tag in instance.Tags)
{
if (tag.Key == "Name")
{
vmname = tag.Value;
}
}
InstanceInfo inf = new(instance, vmname);
instanceList.Add(inf);
}
}
request.NextToken = response.NextToken;
if (response.NextToken == null)
{
done = true;
}
}
lastData = instanceList.OrderBy(x => x.Name).ToList();
lastFetch = DateTime.Now;
return lastData;
}
public static class AWSConnectionData
{
private static readonly RegistryKey key = Registry.CurrentUser.CreateSubKey(@"SOFTWARE\mRemoteAWSInterface");
public static string awsKeyID = "";
public static string awsKey = "";
public static string region = "eu-central-1";
public static void Init()
{
if (awsKey != "")
return;
// display gui and ask for data
AWSConnectionForm f = new();
f.tbAccesKeyID.Text = "" + key.GetValue("KeyID");
f.tbAccesKey.Text = "" + key.GetValue("Key");
f.tbRegion.Text = "" + key.GetValue("Region");
if (f.tbRegion.Text == null || f.tbRegion.Text.Length < 2)
f.tbRegion.Text = region;
_ = f.ShowDialog();
if (f.DialogResult != DialogResult.OK)
return;
// store values to memory
awsKeyID = f.tbAccesKeyID.Text;
awsKey = f.tbAccesKey.Text;
region = f.tbRegion.Text;
// write values to registry
key.SetValue("KeyID", awsKeyID);
key.SetValue("Key", awsKey);
key.SetValue("Region", region);
key.Close();
}
}
}
}

View File

@@ -0,0 +1,33 @@
using Amazon.EC2.Model;
using System;
namespace ExternalConnectors.AWS
{
public class InstanceInfo
{
public string InstanceId { get; }
public string Name { get; }
public string Status { get; }
public string PublicIP { get; }
public string PrivateIP { get; }
public InstanceInfo(Instance instance, string name)
{
InstanceId = instance.InstanceId;
Name = name;
switch(instance.State.Code)
{
case 0: Status = "Pending"; break;
case 16: Status = "Running"; break;
case 32: Status = "Shutdown"; break;
case 48: Status = "Terminated"; break;
case 64: Status = "Stopping"; break;
case 80: Status = "Stopped"; break;
default: Status = "Unknown"; break;
};
PublicIP = instance.PublicIpAddress;
PrivateIP = instance.PrivateIpAddress;
}
}
}

View File

@@ -0,0 +1,28 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net6.0-windows</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<OutputType>Library</OutputType>
<UseWindowsForms>True</UseWindowsForms>
<Platforms>x64</Platforms>
<Configurations>Debug;Release;Debug Portable;Release Portable</Configurations>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="AWSSDK.Core" Version="3.7.5.6" />
<PackageReference Include="AWSSDK.EC2" Version="3.7.50.1" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.1" />
</ItemGroup>
<ItemGroup>
<Compile Update="AWS\AWSConnectionForm.cs">
<SubType>Form</SubType>
</Compile>
<Compile Update="TSS\SSConnectionForm.cs">
<SubType>Form</SubType>
</Compile>
</ItemGroup>
</Project>

View File

@@ -0,0 +1,256 @@
namespace ExternalConnectors.TSS
{
partial class SSConnectionForm
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.tbSSURL = new System.Windows.Forms.TextBox();
this.tbUsername = new System.Windows.Forms.TextBox();
this.label3 = new System.Windows.Forms.Label();
this.tbPassword = new System.Windows.Forms.TextBox();
this.btnOK = new System.Windows.Forms.Button();
this.btnCancel = new System.Windows.Forms.Button();
this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel();
this.label5 = new System.Windows.Forms.Label();
this.label1 = new System.Windows.Forms.Label();
this.label2 = new System.Windows.Forms.Label();
this.cbUseSSO = new System.Windows.Forms.CheckBox();
this.tableLayoutPanel2 = new System.Windows.Forms.TableLayoutPanel();
this.label4 = new System.Windows.Forms.Label();
this.tableLayoutPanel1.SuspendLayout();
this.tableLayoutPanel2.SuspendLayout();
this.SuspendLayout();
//
// tbSSURL
//
this.tbSSURL.Dock = System.Windows.Forms.DockStyle.Fill;
this.tbSSURL.Location = new System.Drawing.Point(445, 7);
this.tbSSURL.Margin = new System.Windows.Forms.Padding(6, 7, 6, 7);
this.tbSSURL.Name = "tbSSURL";
this.tbSSURL.Size = new System.Drawing.Size(921, 35);
this.tbSSURL.TabIndex = 0;
//
// tbUsername
//
this.tbUsername.Dock = System.Windows.Forms.DockStyle.Fill;
this.tbUsername.Location = new System.Drawing.Point(445, 69);
this.tbUsername.Margin = new System.Windows.Forms.Padding(6, 7, 6, 7);
this.tbUsername.Name = "tbUsername";
this.tbUsername.Size = new System.Drawing.Size(921, 35);
this.tbUsername.TabIndex = 2;
//
// label3
//
this.label3.AutoSize = true;
this.label3.Dock = System.Windows.Forms.DockStyle.Fill;
this.label3.Location = new System.Drawing.Point(6, 124);
this.label3.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0);
this.label3.Name = "label3";
this.label3.Size = new System.Drawing.Size(427, 46);
this.label3.TabIndex = 5;
this.label3.Text = "Password";
this.label3.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
//
// tbPassword
//
this.tbPassword.Dock = System.Windows.Forms.DockStyle.Fill;
this.tbPassword.Location = new System.Drawing.Point(445, 131);
this.tbPassword.Margin = new System.Windows.Forms.Padding(6, 7, 6, 7);
this.tbPassword.Name = "tbPassword";
this.tbPassword.Size = new System.Drawing.Size(921, 35);
this.tbPassword.TabIndex = 4;
this.tbPassword.UseSystemPasswordChar = true;
//
// btnOK
//
this.btnOK.Anchor = System.Windows.Forms.AnchorStyles.Right;
this.btnOK.DialogResult = System.Windows.Forms.DialogResult.OK;
this.btnOK.Location = new System.Drawing.Point(510, 23);
this.btnOK.Margin = new System.Windows.Forms.Padding(6, 7, 6, 7);
this.btnOK.Name = "btnOK";
this.btnOK.Size = new System.Drawing.Size(150, 53);
this.btnOK.TabIndex = 10;
this.btnOK.Text = "OK";
this.btnOK.UseVisualStyleBackColor = true;
//
// btnCancel
//
this.btnCancel.Anchor = System.Windows.Forms.AnchorStyles.Left;
this.btnCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;
this.btnCancel.Location = new System.Drawing.Point(712, 23);
this.btnCancel.Margin = new System.Windows.Forms.Padding(6, 7, 6, 7);
this.btnCancel.Name = "btnCancel";
this.btnCancel.Size = new System.Drawing.Size(150, 53);
this.btnCancel.TabIndex = 11;
this.btnCancel.Text = "Cancel";
this.btnCancel.UseVisualStyleBackColor = true;
//
// tableLayoutPanel1
//
this.tableLayoutPanel1.ColumnCount = 2;
this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 32.06997F));
this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 67.93003F));
this.tableLayoutPanel1.Controls.Add(this.label5, 0, 3);
this.tableLayoutPanel1.Controls.Add(this.label1, 0, 0);
this.tableLayoutPanel1.Controls.Add(this.label2, 0, 1);
this.tableLayoutPanel1.Controls.Add(this.label3, 0, 2);
this.tableLayoutPanel1.Controls.Add(this.tbSSURL, 1, 0);
this.tableLayoutPanel1.Controls.Add(this.tbUsername, 1, 1);
this.tableLayoutPanel1.Controls.Add(this.tbPassword, 1, 2);
this.tableLayoutPanel1.Controls.Add(this.cbUseSSO, 0, 3);
this.tableLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Top;
this.tableLayoutPanel1.Location = new System.Drawing.Point(0, 0);
this.tableLayoutPanel1.Margin = new System.Windows.Forms.Padding(6, 7, 6, 7);
this.tableLayoutPanel1.Name = "tableLayoutPanel1";
this.tableLayoutPanel1.RowCount = 4;
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F));
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F));
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 46F));
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 46F));
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 46F));
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 46F));
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 46F));
this.tableLayoutPanel1.Size = new System.Drawing.Size(1372, 217);
this.tableLayoutPanel1.TabIndex = 12;
//
// label5
//
this.label5.AutoSize = true;
this.label5.Dock = System.Windows.Forms.DockStyle.Fill;
this.label5.Location = new System.Drawing.Point(445, 170);
this.label5.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0);
this.label5.Name = "label5";
this.label5.Size = new System.Drawing.Size(921, 47);
this.label5.TabIndex = 15;
this.label5.Text = "For SSO to work, additional IIS configuration is required!";
this.label5.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
//
// label1
//
this.label1.AutoSize = true;
this.label1.Dock = System.Windows.Forms.DockStyle.Fill;
this.label1.Location = new System.Drawing.Point(6, 0);
this.label1.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(427, 62);
this.label1.TabIndex = 2;
this.label1.Text = "Secret Server URL";
this.label1.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
//
// label2
//
this.label2.AutoSize = true;
this.label2.Dock = System.Windows.Forms.DockStyle.Fill;
this.label2.Location = new System.Drawing.Point(6, 62);
this.label2.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0);
this.label2.Name = "label2";
this.label2.Size = new System.Drawing.Size(427, 62);
this.label2.TabIndex = 4;
this.label2.Text = "DOMAIN\\Username";
this.label2.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
//
// cbUseSSO
//
this.cbUseSSO.AutoSize = true;
this.cbUseSSO.Location = new System.Drawing.Point(6, 177);
this.cbUseSSO.Margin = new System.Windows.Forms.Padding(6, 7, 6, 0);
this.cbUseSSO.Name = "cbUseSSO";
this.cbUseSSO.Size = new System.Drawing.Size(117, 34);
this.cbUseSSO.TabIndex = 14;
this.cbUseSSO.Text = "Use SSO";
this.cbUseSSO.UseVisualStyleBackColor = true;
this.cbUseSSO.CheckedChanged += new System.EventHandler(this.cbUseSSO_CheckedChanged);
//
// tableLayoutPanel2
//
this.tableLayoutPanel2.ColumnCount = 5;
this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 160F));
this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F));
this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 40F));
this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F));
this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 160F));
this.tableLayoutPanel2.Controls.Add(this.btnOK, 1, 0);
this.tableLayoutPanel2.Controls.Add(this.btnCancel, 3, 0);
this.tableLayoutPanel2.Dock = System.Windows.Forms.DockStyle.Bottom;
this.tableLayoutPanel2.Location = new System.Drawing.Point(0, 298);
this.tableLayoutPanel2.Margin = new System.Windows.Forms.Padding(6, 7, 6, 7);
this.tableLayoutPanel2.Name = "tableLayoutPanel2";
this.tableLayoutPanel2.RowCount = 1;
this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));
this.tableLayoutPanel2.Size = new System.Drawing.Size(1372, 99);
this.tableLayoutPanel2.TabIndex = 13;
//
// label4
//
this.label4.AutoSize = true;
this.label4.Dock = System.Windows.Forms.DockStyle.Fill;
this.label4.Location = new System.Drawing.Point(0, 217);
this.label4.Margin = new System.Windows.Forms.Padding(6, 0, 6, 0);
this.label4.Name = "label4";
this.label4.Size = new System.Drawing.Size(599, 30);
this.label4.TabIndex = 14;
this.label4.Text = "URL is the base URL, like https://cred.domain.local/SecretServer";
this.label4.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
//
// SSConnectionForm
//
this.AcceptButton = this.btnOK;
this.AutoScaleDimensions = new System.Drawing.SizeF(12F, 30F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(1372, 397);
this.Controls.Add(this.label4);
this.Controls.Add(this.tableLayoutPanel2);
this.Controls.Add(this.tableLayoutPanel1);
this.Margin = new System.Windows.Forms.Padding(6, 7, 6, 7);
this.Name = "SSConnectionForm";
this.Text = "Secret Server API Login Data";
this.Activated += new System.EventHandler(this.SSConnectionForm_Activated);
this.tableLayoutPanel1.ResumeLayout(false);
this.tableLayoutPanel1.PerformLayout();
this.tableLayoutPanel2.ResumeLayout(false);
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.Label label3;
public System.Windows.Forms.TextBox tbSSURL;
public System.Windows.Forms.TextBox tbUsername;
public System.Windows.Forms.TextBox tbPassword;
private System.Windows.Forms.Button btnOK;
private System.Windows.Forms.Button btnCancel;
private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1;
private System.Windows.Forms.Label label2;
private System.Windows.Forms.Label label1;
private System.Windows.Forms.TableLayoutPanel tableLayoutPanel2;
public System.Windows.Forms.CheckBox cbUseSSO;
private System.Windows.Forms.Label label4;
private Label label5;
}
}

View File

@@ -0,0 +1,30 @@
namespace ExternalConnectors.TSS
{
public partial class SSConnectionForm : Form
{
public SSConnectionForm()
{
InitializeComponent();
}
private void SSConnectionForm_Activated(object sender, EventArgs e)
{
SetVisibility();
if (cbUseSSO.Checked)
btnOK.Focus();
else
tbPassword.Focus();
}
private void cbUseSSO_CheckedChanged(object sender, EventArgs e)
{
SetVisibility();
}
private void SetVisibility()
{
bool ch = cbUseSSO.Checked;
tbPassword.Enabled = !ch;
tbUsername.Enabled = !ch;
}
}
}

View File

@@ -0,0 +1,60 @@
<root>
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

View File

@@ -0,0 +1,364 @@
//----------------------
// <auto-generated>
// Generated using the NSwag toolchain v13.14.8.0 (NJsonSchema v10.5.2.0 (Newtonsoft.Json v11.0.0.0)) (http://NSwag.org)
// </auto-generated>
//----------------------
#pragma warning disable 108 // Disable "CS0108 '{derivedDto}.ToJson()' hides inherited member '{dtoBase}.ToJson()'. Use the new keyword if hiding was intended."
#pragma warning disable 114 // Disable "CS0114 '{derivedDto}.RaisePropertyChanged(String)' hides inherited member 'dtoBase.RaisePropertyChanged(String)'. To make the current member override that implementation, add the override keyword. Otherwise add the new keyword."
#pragma warning disable 472 // Disable "CS0472 The result of the expression is always 'false' since a value of type 'Int32' is never equal to 'null' of type 'Int32?'
#pragma warning disable 1573 // Disable "CS1573 Parameter '...' has no matching param tag in the XML comment for ...
#pragma warning disable 1591 // Disable "CS1591 Missing XML comment for publicly visible type or member ..."
#pragma warning disable 8073 // Disable "CS8073 The result of the expression is always 'false' since a value of type 'T' is never equal to 'null' of type 'T?'"
#pragma warning disable 3016 // Disable "CS3016 Arrays as attribute arguments is not CLS-compliant"
namespace SecretServerAuthentication.TSS
{
using System = global::System;
[System.CodeDom.Compiler.GeneratedCode("NSwag", "13.14.8.0 (NJsonSchema v10.5.2.0 (Newtonsoft.Json v11.0.0.0))")]
public partial class OAuth2ServiceClient
{
private string _baseUrl = "";
private System.Net.Http.HttpClient _httpClient;
private System.Lazy<Newtonsoft.Json.JsonSerializerSettings> _settings;
public OAuth2ServiceClient(string baseUrl, System.Net.Http.HttpClient httpClient)
{
BaseUrl = baseUrl;
_httpClient = httpClient;
_settings = new System.Lazy<Newtonsoft.Json.JsonSerializerSettings>(CreateSerializerSettings);
}
private Newtonsoft.Json.JsonSerializerSettings CreateSerializerSettings()
{
var settings = new Newtonsoft.Json.JsonSerializerSettings();
UpdateJsonSerializerSettings(settings);
return settings;
}
public string BaseUrl
{
get { return _baseUrl; }
set { _baseUrl = value; }
}
protected Newtonsoft.Json.JsonSerializerSettings JsonSerializerSettings { get { return _settings.Value; } }
partial void UpdateJsonSerializerSettings(Newtonsoft.Json.JsonSerializerSettings settings);
partial void PrepareRequest(System.Net.Http.HttpClient client, System.Net.Http.HttpRequestMessage request, string url);
partial void PrepareRequest(System.Net.Http.HttpClient client, System.Net.Http.HttpRequestMessage request, System.Text.StringBuilder urlBuilder);
partial void ProcessResponse(System.Net.Http.HttpClient client, System.Net.Http.HttpResponseMessage response);
/// <summary>Retrieve or Refresh Access Token</summary>
/// <param name="grant_type">Authentication grant type. Use 'password' when authenticating, and 'refresh_token' when refreshing a token.</param>
/// <param name="username">Secret Server authentication username. Required when authenticating.</param>
/// <param name="password">Secret Server authentication password. Required when authenticating.</param>
/// <param name="refresh_token">The refresh token. Required when refreshing a token.</param>
/// <returns>Successful retrieval of an access token</returns>
/// <exception cref="ApiException">A server side error occurred.</exception>
public System.Threading.Tasks.Task<TokenResponse> AuthorizeAsync(Grant_type grant_type, string username, string password, string refresh_token)
{
return AuthorizeAsync(grant_type, username, password, refresh_token, System.Threading.CancellationToken.None);
}
/// <param name="cancellationToken">A cancellation token that can be used by other objects or threads to receive notice of cancellation.</param>
/// <summary>Retrieve or Refresh Access Token</summary>
/// <param name="grant_type">Authentication grant type. Use 'password' when authenticating, and 'refresh_token' when refreshing a token.</param>
/// <param name="username">Secret Server authentication username. Required when authenticating.</param>
/// <param name="password">Secret Server authentication password. Required when authenticating.</param>
/// <param name="refresh_token">The refresh token. Required when refreshing a token.</param>
/// <returns>Successful retrieval of an access token</returns>
/// <exception cref="ApiException">A server side error occurred.</exception>
public async System.Threading.Tasks.Task<TokenResponse> AuthorizeAsync(Grant_type grant_type, string username, string password, string refresh_token, System.Threading.CancellationToken cancellationToken)
{
var urlBuilder_ = new System.Text.StringBuilder();
urlBuilder_.Append(BaseUrl != null ? BaseUrl.TrimEnd('/') : "").Append("/oauth2/token");
var client_ = _httpClient;
var disposeClient_ = false;
try
{
using (var request_ = new System.Net.Http.HttpRequestMessage())
{
var keyValues_ = new System.Collections.Generic.List<System.Collections.Generic.KeyValuePair<string, string>>();
if (grant_type == null)
throw new System.ArgumentNullException("grant_type");
else
keyValues_.Add(new System.Collections.Generic.KeyValuePair<string, string>("grant_type", ConvertToString(grant_type, System.Globalization.CultureInfo.InvariantCulture)));
if (username != null)
keyValues_.Add(new System.Collections.Generic.KeyValuePair<string, string>("username", ConvertToString(username, System.Globalization.CultureInfo.InvariantCulture)));
if (password != null)
keyValues_.Add(new System.Collections.Generic.KeyValuePair<string, string>("password", ConvertToString(password, System.Globalization.CultureInfo.InvariantCulture)));
if (refresh_token != null)
keyValues_.Add(new System.Collections.Generic.KeyValuePair<string, string>("refresh_token", ConvertToString(refresh_token, System.Globalization.CultureInfo.InvariantCulture)));
request_.Content = new System.Net.Http.FormUrlEncodedContent(keyValues_);
request_.Method = new System.Net.Http.HttpMethod("POST");
request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json"));
PrepareRequest(client_, request_, urlBuilder_);
var url_ = urlBuilder_.ToString();
request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute);
PrepareRequest(client_, request_, url_);
var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false);
var disposeResponse_ = true;
try
{
var headers_ = System.Linq.Enumerable.ToDictionary(response_.Headers, h_ => h_.Key, h_ => h_.Value);
if (response_.Content != null && response_.Content.Headers != null)
{
foreach (var item_ in response_.Content.Headers)
headers_[item_.Key] = item_.Value;
}
ProcessResponse(client_, response_);
var status_ = (int)response_.StatusCode;
if (status_ == 200)
{
var objectResponse_ = await ReadObjectResponseAsync<TokenResponse>(response_, headers_, cancellationToken).ConfigureAwait(false);
if (objectResponse_.Object == null)
{
throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null);
}
return objectResponse_.Object;
}
else
if (status_ == 400)
{
var objectResponse_ = await ReadObjectResponseAsync<TokenErrorResponse>(response_, headers_, cancellationToken).ConfigureAwait(false);
if (objectResponse_.Object == null)
{
throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null);
}
throw new ApiException<TokenErrorResponse>("An error occurred", status_, objectResponse_.Text, headers_, objectResponse_.Object, null);
}
else
{
var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false);
throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null);
}
}
finally
{
if (disposeResponse_)
response_.Dispose();
}
}
}
finally
{
if (disposeClient_)
client_.Dispose();
}
}
protected struct ObjectResponseResult<T>
{
public ObjectResponseResult(T responseObject, string responseText)
{
this.Object = responseObject;
this.Text = responseText;
}
public T Object { get; }
public string Text { get; }
}
public bool ReadResponseAsString { get; set; }
protected virtual async System.Threading.Tasks.Task<ObjectResponseResult<T>> ReadObjectResponseAsync<T>(System.Net.Http.HttpResponseMessage response, System.Collections.Generic.IReadOnlyDictionary<string, System.Collections.Generic.IEnumerable<string>> headers, System.Threading.CancellationToken cancellationToken)
{
if (response == null || response.Content == null)
{
return new ObjectResponseResult<T>(default(T), string.Empty);
}
if (ReadResponseAsString)
{
var responseText = await response.Content.ReadAsStringAsync().ConfigureAwait(false);
try
{
var typedBody = Newtonsoft.Json.JsonConvert.DeserializeObject<T>(responseText, JsonSerializerSettings);
return new ObjectResponseResult<T>(typedBody, responseText);
}
catch (Newtonsoft.Json.JsonException exception)
{
var message = "Could not deserialize the response body string as " + typeof(T).FullName + ".";
throw new ApiException(message, (int)response.StatusCode, responseText, headers, exception);
}
}
else
{
try
{
using (var responseStream = await response.Content.ReadAsStreamAsync().ConfigureAwait(false))
using (var streamReader = new System.IO.StreamReader(responseStream))
using (var jsonTextReader = new Newtonsoft.Json.JsonTextReader(streamReader))
{
var serializer = Newtonsoft.Json.JsonSerializer.Create(JsonSerializerSettings);
var typedBody = serializer.Deserialize<T>(jsonTextReader);
return new ObjectResponseResult<T>(typedBody, string.Empty);
}
}
catch (Newtonsoft.Json.JsonException exception)
{
var message = "Could not deserialize the response body stream as " + typeof(T).FullName + ".";
throw new ApiException(message, (int)response.StatusCode, string.Empty, headers, exception);
}
}
}
private string ConvertToString(object value, System.Globalization.CultureInfo cultureInfo)
{
if (value == null)
{
return "";
}
if (value is System.Enum)
{
var name = System.Enum.GetName(value.GetType(), value);
if (name != null)
{
var field = System.Reflection.IntrospectionExtensions.GetTypeInfo(value.GetType()).GetDeclaredField(name);
if (field != null)
{
var attribute = System.Reflection.CustomAttributeExtensions.GetCustomAttribute(field, typeof(System.Runtime.Serialization.EnumMemberAttribute))
as System.Runtime.Serialization.EnumMemberAttribute;
if (attribute != null)
{
return attribute.Value != null ? attribute.Value : name;
}
}
var converted = System.Convert.ToString(System.Convert.ChangeType(value, System.Enum.GetUnderlyingType(value.GetType()), cultureInfo));
return converted == null ? string.Empty : converted;
}
}
else if (value is bool)
{
return System.Convert.ToString((bool)value, cultureInfo).ToLowerInvariant();
}
else if (value is byte[])
{
return System.Convert.ToBase64String((byte[])value);
}
else if (value.GetType().IsArray)
{
var array = System.Linq.Enumerable.OfType<object>((System.Array)value);
return string.Join(",", System.Linq.Enumerable.Select(array, o => ConvertToString(o, cultureInfo)));
}
var result = System.Convert.ToString(value, cultureInfo);
return result == null ? "" : result;
}
}
/// <summary>API access token response</summary>
[System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.5.2.0 (Newtonsoft.Json v11.0.0.0)")]
public partial class TokenResponse
{
/// <summary>Authentication token</summary>
[Newtonsoft.Json.JsonProperty("access_token", Required = Newtonsoft.Json.Required.Always)]
[System.ComponentModel.DataAnnotations.Required(AllowEmptyStrings = true)]
public string Access_token { get; set; }
/// <summary>Authentication token type</summary>
[Newtonsoft.Json.JsonProperty("token_type", Required = Newtonsoft.Json.Required.Always)]
[System.ComponentModel.DataAnnotations.Required(AllowEmptyStrings = true)]
[Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))]
public TokenResponseToken_type Token_type { get; set; }
/// <summary>Authentication token expiration time, in seconds</summary>
[Newtonsoft.Json.JsonProperty("expires_in", Required = Newtonsoft.Json.Required.Always)]
[System.ComponentModel.DataAnnotations.Required(AllowEmptyStrings = true)]
public string Expires_in { get; set; }
/// <summary>Refresh token. This is only provided when the server is set to allow refresh tokens for web services and when the session timeout duration is not set to Unlimited.</summary>
[Newtonsoft.Json.JsonProperty("refresh_token", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)]
public string Refresh_token { get; set; }
}
/// <summary>API access token error response</summary>
[System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.5.2.0 (Newtonsoft.Json v11.0.0.0)")]
public partial class TokenErrorResponse
{
/// <summary>Authentication token</summary>
[Newtonsoft.Json.JsonProperty("message", Required = Newtonsoft.Json.Required.Always)]
[System.ComponentModel.DataAnnotations.Required(AllowEmptyStrings = true)]
public string Message { get; set; }
}
/// <summary>Authentication grant type. Use 'password' when authenticating, and 'refresh_token' when refreshing a token.</summary>
[System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.5.2.0 (Newtonsoft.Json v11.0.0.0)")]
public enum Grant_type
{
[System.Runtime.Serialization.EnumMember(Value = @"password")]
Password = 0,
[System.Runtime.Serialization.EnumMember(Value = @"refresh_token")]
Refresh_token = 1,
}
[System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.5.2.0 (Newtonsoft.Json v11.0.0.0)")]
public enum TokenResponseToken_type
{
[System.Runtime.Serialization.EnumMember(Value = @"bearer")]
Bearer = 0,
}
[System.CodeDom.Compiler.GeneratedCode("NSwag", "13.14.8.0 (NJsonSchema v10.5.2.0 (Newtonsoft.Json v11.0.0.0))")]
public partial class ApiException : System.Exception
{
public int StatusCode { get; private set; }
public string Response { get; private set; }
public System.Collections.Generic.IReadOnlyDictionary<string, System.Collections.Generic.IEnumerable<string>> Headers { get; private set; }
public ApiException(string message, int statusCode, string response, System.Collections.Generic.IReadOnlyDictionary<string, System.Collections.Generic.IEnumerable<string>> headers, System.Exception innerException)
: base(message + "\n\nStatus: " + statusCode + "\nResponse: \n" + ((response == null) ? "(null)" : response.Substring(0, response.Length >= 512 ? 512 : response.Length)), innerException)
{
StatusCode = statusCode;
Response = response;
Headers = headers;
}
public override string ToString()
{
return string.Format("HTTP Response: \n\n{0}\n\n{1}", Response, base.ToString());
}
}
[System.CodeDom.Compiler.GeneratedCode("NSwag", "13.14.8.0 (NJsonSchema v10.5.2.0 (Newtonsoft.Json v11.0.0.0))")]
public partial class ApiException<TResult> : ApiException
{
public TResult Result { get; private set; }
public ApiException(string message, int statusCode, string response, System.Collections.Generic.IReadOnlyDictionary<string, System.Collections.Generic.IEnumerable<string>> headers, TResult result, System.Exception innerException)
: base(message, statusCode, response, headers, innerException)
{
Result = result;
}
}
}
#pragma warning restore 1591
#pragma warning restore 1573
#pragma warning restore 472
#pragma warning restore 114
#pragma warning restore 108
#pragma warning restore 3016

View File

@@ -0,0 +1,144 @@
using Microsoft.Win32;
using SecretServerAuthentication.TSS;
using SecretServerRestClient.TSS;
namespace ExternalConnectors.TSS
{
public class SecretServerInterface
{
private static class SSConnectionData
{
public static string ssUsername = "";
public static string ssPassword = "";
public static string ssUrl = "";
public static bool ssSSO = false;
public static bool initdone = false;
public static void Init()
{
if (ssPassword != "" || initdone == true)
return;
RegistryKey key = Registry.CurrentUser.CreateSubKey(@"SOFTWARE\mRemoteSSInterface");
try
{
// display gui and ask for data
SSConnectionForm f = new SSConnectionForm();
string? un = key.GetValue("Username") as string;
f.tbUsername.Text = un ?? "";
string? url = key.GetValue("URL") as string;
if (url == null || !url.Contains("://"))
url = "https://cred.domain.local/SecretServer";
f.tbSSURL.Text = url;
var b = key.GetValue("SSO");
if (b == null || (string)b != "True")
ssSSO = false;
else
{
ssSSO = true;
initdone = true;
}
f.cbUseSSO.Checked = ssSSO;
// show dialog
_ = f.ShowDialog();
if (f.DialogResult != DialogResult.OK)
return;
// store values to memory
ssUsername = f.tbUsername.Text;
ssPassword = f.tbPassword.Text;
ssUrl = f.tbSSURL.Text;
ssSSO = f.cbUseSSO.Checked;
// write values to registry
key.SetValue("Username", ssUsername);
key.SetValue("URL", ssUrl);
key.SetValue("SSO", ssSSO);
}
catch (Exception)
{
throw;
}
finally
{
key.Close();
}
}
}
private static void FetchSecret(int secretID, out string secretUsername, out string secretPassword, out string secretDomain)
{
string authUsername = SSConnectionData.ssUsername;
string authPassword = SSConnectionData.ssPassword;
string baseURL = SSConnectionData.ssUrl;
SecretModel secret;
if (SSConnectionData.ssSSO)
{
// REQUIRES IIS CONFIG! https://docs.thycotic.com/ss/11.0.0/api-scripting/webservice-iwa-powershell
var handler = new HttpClientHandler() { UseDefaultCredentials = true };
using (var httpClient = new HttpClient(handler))
{
// Call REST API:
var client = new SecretsServiceClient($"{baseURL}/winauthwebservices/api", httpClient);
secret = client.GetSecretAsync(false, true, secretID, null).Result;
}
}
else
{
using (var httpClient = new HttpClient())
{
// Authenticate:
var tokenClient = new OAuth2ServiceClient(baseURL, httpClient);
var token = tokenClient.AuthorizeAsync(Grant_type.Password, authUsername, authPassword, null).Result;
var tokenResult = token.Access_token;
// Set credentials (token):
httpClient.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", tokenResult);
// Call REST API:
var client = new SecretsServiceClient($"{baseURL}/api", httpClient);
secret = client.GetSecretAsync(false, true, secretID, null).Result;
}
}
// clear return variables
secretDomain = "";
secretUsername = "";
secretPassword = "";
// parse data and extract what we need
foreach (var item in secret.Items)
{
if (item.FieldName.ToLower().Equals("domain"))
secretDomain = item.ItemValue;
else if (item.FieldName.ToLower().Equals("username"))
secretUsername = item.ItemValue;
else if (item.FieldName.ToLower().Equals("password"))
secretPassword = item.ItemValue;
}
}
// input must be in form "SSAPI:xxxx" where xxx is the secret id to fetch
public static void FetchSecretFromServer(string input, out string username, out string password, out string domain)
{
// get secret id
if (!input.StartsWith("SSAPI:"))
throw new Exception("calling this function requires SSAPI: input");
int secretID = Int32.Parse(input.Substring(6));
// init connection credentials, display popup if necessary
SSConnectionData.Init();
// get the secret
FetchSecret(secretID, out username, out password, out domain);
}
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -2,7 +2,7 @@
<br/><br/>
<p align="center">
<img width="500" src="https://github.com/mRemoteNG/mRemoteNG/blob/develop/mRemoteNGProjectFiles/Header_dark.png">
<img width="450" src="https://github.com/mRemoteNG/mRemoteNG/blob/develop/mRemoteNGProjectFiles/Header_dark.png">
</p>
<p align="center">
@@ -45,11 +45,11 @@
---
| Update Channel | Build Status | Downloads |
| Channel | Build Status | Downloads |
| ---------------|--------------|-----------|
| Stable | [![Build status](https://ci.appveyor.com/api/projects/status/k0sdbxmq90fgdmj6/branch/master?svg=true)](https://ci.appveyor.com/project/mremoteng/mremoteng/branch/master) | [![Github Releases (by Release)](https://img.shields.io/github/downloads/mRemoteNG/mRemoteNG/v1.76.20/total.svg)](https://github.com/mRemoteNG/mRemoteNG/releases/tag/v1.76.20) |
| Prerelease | [![Build status](https://ci.appveyor.com/api/projects/status/k0sdbxmq90fgdmj6/branch/develop?svg=true)](https://ci.appveyor.com/project/mremoteng/mremoteng/branch/develop) | [![Github Releases (by Release)](https://img.shields.io/github/downloads/mRemoteNG/mRemoteNG/v1.77.1/total.svg)](https://github.com/mRemoteNG/mRemoteNG/releases/tag/v1.77.1) |
| Nightly build | [![Build status](https://ci.appveyor.com/api/projects/status/k0sdbxmq90fgdmj6/branch/develop?svg=true)](https://ci.appveyor.com/project/mremoteng/mremoteng/branch/develop) | [![Github Releases (by Release)](https://img.shields.io/github/downloads/mRemoteNG/mRemoteNG/v1.77.2-nb/total.svg)](https://github.com/mRemoteNG/mRemoteNG/releases/tag/v1.77.2-nb) |
| Stable | ![Build status](https://ci.appveyor.com/api/projects/status/rqwxjxldail7btcf?svg=true) | [![Github Releases (by Release)](https://img.shields.io/github/downloads/mRemoteNG/mRemoteNG/v1.76.20/total.svg)](https://github.com/mRemoteNG/mRemoteNG/releases/tag/v1.76.20) |
| Preview | ![Build status](https://ci.appveyor.com/api/projects/status/rqwxjxldail7btcf/branch/preview?svg=true) | [![Github Releases (by Release)](https://img.shields.io/github/downloads/mRemoteNG/mRemoteNG/v1.77.1/total.svg)](https://github.com/mRemoteNG/mRemoteNG/releases/tag/v1.77.1) |
| Nightly | ![Build status](https://ci.appveyor.com/api/projects/status/rqwxjxldail7btcf/branch/dnightly?svg=true) | [![Github Releases (by Release)](https://img.shields.io/github/downloads/mRemoteNG/mRemoteNG/v1.77.2-nb/total.svg)](https://github.com/mRemoteNG/mRemoteNG/releases/tag/v1.77.2-nb) |
## Features
@@ -73,24 +73,11 @@ For a detailed feature list and general usage support, refer to the [Documentati
- [Windows 11](https://en.wikipedia.org/wiki/Windows_11)
- [Windows 10](https://en.wikipedia.org/wiki/Windows_10)
- [Windows 8.1](https://en.wikipedia.org/wiki/Windows_8.1)
- [Windows Server 2022](https://en.wikipedia.org/wiki/Windows_Server_2022)
- [Windows Server 2019](https://en.wikipedia.org/wiki/Windows_Server_2019)
- [Windows Server 2016](https://en.wikipedia.org/wiki/Windows_Server_2016)
- [Windows Server 2012 R2](https://en.wikipedia.org/wiki/Windows_Server_2012_R2)
### Packaging
Downloads are provided in three different packages.
#### Binary package
The binary package of mRemoteNG is a compiled version of mRemoteNG which comes in an MSI installer.
This is the most common way to install mRemoteNG and get up and running.
#### Portable package
The portable package contains a modified version of the executable which stores and loads all your settings from files in the application's directory.
This package can be used to run mRemoteNG from a USB stick and preserve your configuration wherever you go.
#### Source package
This contains the source code from which mRemoteNG is build.
@@ -98,8 +85,8 @@ You will need to compile it yourself using Visual Studio.
### Minimum Requirements
* [Microsoft Visual C++ Redistributable for Visual Studio 2015, 2017 and 2019](https://support.microsoft.com/en-us/help/2977003/the-latest-supported-visual-c-downloads)
* [Microsoft .NET Framework 4.0](https://www.microsoft.com/en-us/download/details.aspx?id=17851)
* [Microsoft Visual C++ Redistributable for Visual Studio 2015 - 2022](https://support.microsoft.com/en-us/help/2977003/the-latest-supported-visual-c-downloads)
* [Microsoft .NET 6.0](https://dotnet.microsoft.com/download/dotnet/6.0)
* Microsoft Terminal Service Client 6.0 or later
* Needed if you use RDP. mstscax.dll and/or msrdp.ocx be registered.
@@ -113,41 +100,16 @@ mRemoteNG is available as a redistributable MSI package or as a portable ZIP pac
The MSI package of mRemoteNG can be installed using the command line:
`msiexec /i C:\Path\To\mRemoteNG-Installer.exe [INSTALLDIR=value] [IGNOREPREREQUISITES=value]`
`msiexec /i [/qn] C:\Path\To\mRemoteNG-Installer.exe [INSTALLDIR=value] [IGNOREPREREQUISITES=value] [/lv* <log path>]`
| Property | Value | Description |
| Argument/Property | Value | Description |
|-|-|-|
| INSTALLDIR | `folder path` | This allows you to set the installation directory from the command line. For paths that contain spaces, enclose the path in double quotes (""). This overrides any value found in the registry. |
| /qn | `Silent Installation` | Will run the installer silently in the background. |
| /lv* | `Silent Installation` | Will write a logfile to the specified location. (For paths that contain spaces, enclose the path in double quotes) |
| INSTALLDIR | `folder path` | Allows you to set the installation directory from the command line. (For paths that contain spaces, enclose the path in double quotes) |
| IGNOREPREREQUISITES | `0` or `1` | When set to `1`, the installer will not be halted if any prerequisite check is not met. You must still run the installer as administrator. |
#### Examples
**Install to a custom folder**
`msiexec /i C:\Path\To\mRemoteNG-Installer.msi INSTALLDIR="D:\Work Apps\mRemoteNG"`
**Ignore prerequisites during a normal install**
`msiexec /i C:\Path\To\mRemoteNG-Installer.msi IGNOREPREREQUISITES=1`
**Ignore prerequisites during a silent install**
`msiexec /i C:\Path\To\mRemoteNG-Installer.msi /qn IGNOREPREREQUISITES=1`
### Troubleshooting installation
Turn on verbose logging by using the `/lv* <log path>` argument at the command line.
`msiexec /i C:\Path\To\mRemoteNG-Installer.msi /l*v C:\mremoteng_install.log`
## Uninstall
### Standard Uninstall
mRemoteNG basic binary package can be uninstalled with Windows Control Panel. If for some reason it does not work please
follow information provided below for Manual Uninstall.
### Manual Uninstall
## Manual Uninstall
_If you are using the Portable version, simply deleting the folder that contains mRemoteNG should be sufficient. These uninstall instructions are only necessary for the normal binary .MSI installed version of mRemoteNG_

View File

@@ -1,21 +0,0 @@
param (
[string]
$SourcePath,
[string]
$DestinationDir
)
Write-Host $SourcePath
Write-Host $DestinationDir
if (!(Test-Path -Path $DestinationDir))
{
New-Item -Path $DestinationDir -ItemType "directory"
}
$sourceFiles = Get-ChildItem -Path $SourcePath -Recurse | ?{$_.Extension -match "exe|msi"}
foreach ($item in $sourceFiles)
{
Copy-Item -Path $item.FullName -Destination $DestinationDir -Force
}

View File

@@ -25,9 +25,9 @@ param (
$ExcludeFromSigning
)
Write-Output "+=================================================================+"
Write-Output "+===========================================================================================+"
Write-Output "| Beginning mRemoteNG Installer Post Build |"
Write-Output "+=================================================================+"
Write-Output "+===========================================================================================+"
Format-Table -AutoSize -Wrap -InputObject @{
"SolutionDir" = $SolutionDir
"TargetDir" = $TargetDir
@@ -40,5 +40,4 @@ Format-Table -AutoSize -Wrap -InputObject @{
& "$PSScriptRoot\sign_binaries.ps1" -TargetDir $TargetDir -CertificatePath $CertificatePath -CertificatePassword $CertificatePassword -ConfigurationName $ConfigurationName -Exclude $ExcludeFromSigning -SolutionDir $SolutionDir
& "$PSScriptRoot\verify_binary_signatures.ps1" -TargetDir $TargetDir -ConfigurationName $ConfigurationName -CertificatePath $CertificatePath -SolutionDir $SolutionDir
& "$PSScriptRoot\rename_installer_with_version.ps1" -SolutionDir $SolutionDir
& "$PSScriptRoot\copy_release_installer.ps1" -SourcePath $TargetDir -DestinationDir (Join-Path -Path $SolutionDir -ChildPath "Release")
& "$PSScriptRoot\rename_and_copy_installer.ps1" -SolutionDir $SolutionDir

View File

@@ -25,9 +25,9 @@ param (
$ExcludeFromSigning
)
Write-Output "+=================================================================+"
Write-Output "+===========================================================================================+"
Write-Output "| Beginning mRemoteNG Post Build |"
Write-Output "+=================================================================+"
Write-Output "+===========================================================================================+"
Format-Table -AutoSize -Wrap -InputObject @{
"SolutionDir" = $SolutionDir
"TargetDir" = $TargetDir

View File

@@ -0,0 +1,13 @@
param (
[string]
$SolutionDir
)
$targetVersionedFile = "$SolutionDir\mRemoteNG\bin\x64\Release\mRemoteNG.exe"
$version = &"$SolutionDir\Tools\exes\sigcheck.exe" /accepteula -q -n $targetVersionedFile
$src = $SolutionDir + "mRemoteNGInstaller\Installer\bin\Release\en-US\mRemoteNG-Installer.msi"
$dst = $SolutionDir + "Release\mRemoteNG-Installer-" + $version + ".msi"
# Copy file
Copy-Item $src -Destination $dst -Force

View File

@@ -1,29 +0,0 @@
param (
[string]
$SolutionDir
)
$renameTarget = $SolutionDir + "mRemoteNGInstaller\Installer\bin\Release\en-US\mRemoteNG-Installer.msi"
Write-Host $SolutionDir
Write-Host $renameTarget
$targetVersionedFile = "$SolutionDir\mRemoteNG\bin\Release\mRemoteNG.exe"
$version = &"$SolutionDir\Tools\exes\sigcheck.exe" /accepteula -q -n $targetVersionedFile
$renameTargetFileObject = Get-Item -Path $renameTarget -ErrorAction SilentlyContinue
if ($renameTargetFileObject)
{
# Build the new file name
$oldFileName = $renameTargetFileObject.Name
$newFileName = $oldFileName -replace "$("\"+$renameTargetFileObject.Extension)",$("-"+$version+$renameTargetFileObject.Extension)
Write-Host $oldFileName
Write-Host $newFileName
# Delete any items that already exist with the new name (effectively an overwrite)
Remove-Item -Path "$($renameTargetFileObject.Directory.FullName)\$newFileName" -ErrorAction SilentlyContinue
# Rename file
Rename-Item -Path $renameTarget -NewName $newFileName -ErrorAction SilentlyContinue
}

View File

@@ -20,6 +20,7 @@ param (
Write-Output "===== Beginning $($PSCmdlet.MyInvocation.MyCommand) ====="
# validate release versions and if the certificate value was passed
if ($ConfigurationName -match "Release" -And ($CertificatePath)) {

View File

@@ -1,11 +1,11 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 16
VisualStudioVersion = 16.0.28803.352
# Visual Studio Version 17
VisualStudioVersion = 17.0.31912.275
MinimumVisualStudioVersion = 14.0.25420.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "mRemoteNG", "mRemoteNG\mRemoteNG.csproj", "{4934A491-40BC-4E5B-9166-EA1169A220F6}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "mRemoteNG", "mRemoteNG\mRemoteNG.csproj", "{4934A491-40BC-4E5B-9166-EA1169A220F6}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "mRemoteNGTests", "mRemoteNGTests\mRemoteNGTests.csproj", "{1453B37F-8621-499E-B0B2-6091F76DC0BB}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "mRemoteNGTests", "mRemoteNGTests\mRemoteNGTests.csproj", "{1453B37F-8621-499E-B0B2-6091F76DC0BB}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "mRemoteNGInstaller", "mRemoteNGInstaller", "{4FE795BE-646E-4F1B-BAD0-A68EA26394DD}"
EndProject
@@ -16,108 +16,63 @@ Project("{930C7802-8A8C-48F9-8165-68863BCCD9DD}") = "Installer", "mRemoteNGInsta
{5423D985-CB48-4344-B47F-E8C6D60C8B04} = {5423D985-CB48-4344-B47F-E8C6D60C8B04}
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "mRemoteNGSpecs", "mRemoteNGSpecs\mRemoteNGSpecs.csproj", "{16AA21E2-D6B7-427D-AB7D-AA8C611B724E}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "mRemoteNGSpecs", "mRemoteNGSpecs\mRemoteNGSpecs.csproj", "{16AA21E2-D6B7-427D-AB7D-AA8C611B724E}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ExternalConnectors", "ExternalConnectors\ExternalConnectors.csproj", "{A56A2029-79B8-492A-ABE5-D2BFE05801BD}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug Portable|Any CPU = Debug Portable|Any CPU
Debug Portable|x86 = Debug Portable|x86
Debug|Any CPU = Debug|Any CPU
Debug|x86 = Debug|x86
Release Installer|Any CPU = Release Installer|Any CPU
Release Installer|x86 = Release Installer|x86
Release Portable|Any CPU = Release Portable|Any CPU
Release Portable|x86 = Release Portable|x86
Release|Any CPU = Release|Any CPU
Release|x86 = Release|x86
Debug Portable|x64 = Debug Portable|x64
Debug|x64 = Debug|x64
Release Installer|x64 = Release Installer|x64
Release Portable|x64 = Release Portable|x64
Release|x64 = Release|x64
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{4934A491-40BC-4E5B-9166-EA1169A220F6}.Debug Portable|Any CPU.ActiveCfg = Debug Portable|x86
{4934A491-40BC-4E5B-9166-EA1169A220F6}.Debug Portable|Any CPU.Build.0 = Debug Portable|x86
{4934A491-40BC-4E5B-9166-EA1169A220F6}.Debug Portable|x86.ActiveCfg = Debug Portable|x86
{4934A491-40BC-4E5B-9166-EA1169A220F6}.Debug Portable|x86.Build.0 = Debug Portable|x86
{4934A491-40BC-4E5B-9166-EA1169A220F6}.Debug|Any CPU.ActiveCfg = Debug|x86
{4934A491-40BC-4E5B-9166-EA1169A220F6}.Debug|Any CPU.Build.0 = Debug|x86
{4934A491-40BC-4E5B-9166-EA1169A220F6}.Debug|x86.ActiveCfg = Debug|x86
{4934A491-40BC-4E5B-9166-EA1169A220F6}.Debug|x86.Build.0 = Debug|x86
{4934A491-40BC-4E5B-9166-EA1169A220F6}.Release Installer|Any CPU.ActiveCfg = Release|x86
{4934A491-40BC-4E5B-9166-EA1169A220F6}.Release Installer|Any CPU.Build.0 = Release|x86
{4934A491-40BC-4E5B-9166-EA1169A220F6}.Release Installer|x86.ActiveCfg = Release|x86
{4934A491-40BC-4E5B-9166-EA1169A220F6}.Release Installer|x86.Build.0 = Release|x86
{4934A491-40BC-4E5B-9166-EA1169A220F6}.Release Portable|Any CPU.ActiveCfg = Release Portable|x86
{4934A491-40BC-4E5B-9166-EA1169A220F6}.Release Portable|Any CPU.Build.0 = Release Portable|x86
{4934A491-40BC-4E5B-9166-EA1169A220F6}.Release Portable|x86.ActiveCfg = Release Portable|x86
{4934A491-40BC-4E5B-9166-EA1169A220F6}.Release Portable|x86.Build.0 = Release Portable|x86
{4934A491-40BC-4E5B-9166-EA1169A220F6}.Release|Any CPU.ActiveCfg = Release|x86
{4934A491-40BC-4E5B-9166-EA1169A220F6}.Release|Any CPU.Build.0 = Release|x86
{4934A491-40BC-4E5B-9166-EA1169A220F6}.Release|x86.ActiveCfg = Release|x86
{4934A491-40BC-4E5B-9166-EA1169A220F6}.Release|x86.Build.0 = Release|x86
{1453B37F-8621-499E-B0B2-6091F76DC0BB}.Debug Portable|Any CPU.ActiveCfg = Debug Portable|x86
{1453B37F-8621-499E-B0B2-6091F76DC0BB}.Debug Portable|Any CPU.Build.0 = Debug Portable|x86
{1453B37F-8621-499E-B0B2-6091F76DC0BB}.Debug Portable|x86.ActiveCfg = Debug Portable|x86
{1453B37F-8621-499E-B0B2-6091F76DC0BB}.Debug Portable|x86.Build.0 = Debug Portable|x86
{1453B37F-8621-499E-B0B2-6091F76DC0BB}.Debug|Any CPU.ActiveCfg = Debug|x86
{1453B37F-8621-499E-B0B2-6091F76DC0BB}.Debug|Any CPU.Build.0 = Debug|x86
{1453B37F-8621-499E-B0B2-6091F76DC0BB}.Debug|x86.ActiveCfg = Debug|x86
{1453B37F-8621-499E-B0B2-6091F76DC0BB}.Debug|x86.Build.0 = Debug|x86
{1453B37F-8621-499E-B0B2-6091F76DC0BB}.Release Installer|Any CPU.ActiveCfg = Release|x86
{1453B37F-8621-499E-B0B2-6091F76DC0BB}.Release Installer|Any CPU.Build.0 = Release|x86
{1453B37F-8621-499E-B0B2-6091F76DC0BB}.Release Installer|x86.ActiveCfg = Release|x86
{1453B37F-8621-499E-B0B2-6091F76DC0BB}.Release Installer|x86.Build.0 = Release|x86
{1453B37F-8621-499E-B0B2-6091F76DC0BB}.Release Portable|Any CPU.ActiveCfg = Release Portable|x86
{1453B37F-8621-499E-B0B2-6091F76DC0BB}.Release Portable|Any CPU.Build.0 = Release Portable|x86
{1453B37F-8621-499E-B0B2-6091F76DC0BB}.Release Portable|x86.ActiveCfg = Release Portable|x86
{1453B37F-8621-499E-B0B2-6091F76DC0BB}.Release Portable|x86.Build.0 = Release Portable|x86
{1453B37F-8621-499E-B0B2-6091F76DC0BB}.Release|Any CPU.ActiveCfg = Release|x86
{1453B37F-8621-499E-B0B2-6091F76DC0BB}.Release|Any CPU.Build.0 = Release|x86
{1453B37F-8621-499E-B0B2-6091F76DC0BB}.Release|x86.ActiveCfg = Release|x86
{1453B37F-8621-499E-B0B2-6091F76DC0BB}.Release|x86.Build.0 = Release|x86
{5423D985-CB48-4344-B47F-E8C6D60C8B04}.Debug Portable|Any CPU.ActiveCfg = Debug|x86
{5423D985-CB48-4344-B47F-E8C6D60C8B04}.Debug Portable|Any CPU.Build.0 = Debug|x86
{5423D985-CB48-4344-B47F-E8C6D60C8B04}.Debug Portable|x86.ActiveCfg = Debug|x86
{5423D985-CB48-4344-B47F-E8C6D60C8B04}.Debug|Any CPU.ActiveCfg = Debug|x86
{5423D985-CB48-4344-B47F-E8C6D60C8B04}.Debug|x86.ActiveCfg = Debug|x86
{5423D985-CB48-4344-B47F-E8C6D60C8B04}.Debug|x86.Build.0 = Debug|x86
{5423D985-CB48-4344-B47F-E8C6D60C8B04}.Release Installer|Any CPU.ActiveCfg = Release|x86
{5423D985-CB48-4344-B47F-E8C6D60C8B04}.Release Installer|Any CPU.Build.0 = Release|x86
{5423D985-CB48-4344-B47F-E8C6D60C8B04}.Release Installer|x86.ActiveCfg = Release|x86
{5423D985-CB48-4344-B47F-E8C6D60C8B04}.Release Installer|x86.Build.0 = Release|x86
{5423D985-CB48-4344-B47F-E8C6D60C8B04}.Release Portable|Any CPU.ActiveCfg = Release|x86
{5423D985-CB48-4344-B47F-E8C6D60C8B04}.Release Portable|x86.ActiveCfg = Release|x86
{5423D985-CB48-4344-B47F-E8C6D60C8B04}.Release|Any CPU.ActiveCfg = Release|x86
{5423D985-CB48-4344-B47F-E8C6D60C8B04}.Release|Any CPU.Build.0 = Release|x86
{5423D985-CB48-4344-B47F-E8C6D60C8B04}.Release|x86.ActiveCfg = Release|x86
{F0168B9F-6815-40DF-BA53-46CEE7683B68}.Debug Portable|Any CPU.ActiveCfg = Debug Portable|x86
{F0168B9F-6815-40DF-BA53-46CEE7683B68}.Debug Portable|Any CPU.Build.0 = Debug Portable|x86
{F0168B9F-6815-40DF-BA53-46CEE7683B68}.Debug Portable|x86.ActiveCfg = Debug Portable|x86
{F0168B9F-6815-40DF-BA53-46CEE7683B68}.Debug|Any CPU.ActiveCfg = Debug|x86
{F0168B9F-6815-40DF-BA53-46CEE7683B68}.Debug|x86.ActiveCfg = Debug|x86
{F0168B9F-6815-40DF-BA53-46CEE7683B68}.Release Installer|Any CPU.ActiveCfg = Release|x86
{F0168B9F-6815-40DF-BA53-46CEE7683B68}.Release Installer|Any CPU.Build.0 = Release|x86
{F0168B9F-6815-40DF-BA53-46CEE7683B68}.Release Installer|x86.ActiveCfg = Release|x86
{F0168B9F-6815-40DF-BA53-46CEE7683B68}.Release Installer|x86.Build.0 = Release|x86
{F0168B9F-6815-40DF-BA53-46CEE7683B68}.Release Portable|Any CPU.ActiveCfg = Release Portable|x86
{F0168B9F-6815-40DF-BA53-46CEE7683B68}.Release Portable|x86.ActiveCfg = Release Portable|x86
{F0168B9F-6815-40DF-BA53-46CEE7683B68}.Release|Any CPU.ActiveCfg = Release|x86
{F0168B9F-6815-40DF-BA53-46CEE7683B68}.Release|x86.ActiveCfg = Release|x86
{16AA21E2-D6B7-427D-AB7D-AA8C611B724E}.Debug Portable|Any CPU.ActiveCfg = Release|x86
{16AA21E2-D6B7-427D-AB7D-AA8C611B724E}.Debug Portable|Any CPU.Build.0 = Release|x86
{16AA21E2-D6B7-427D-AB7D-AA8C611B724E}.Debug Portable|x86.ActiveCfg = Debug|x86
{16AA21E2-D6B7-427D-AB7D-AA8C611B724E}.Debug Portable|x86.Build.0 = Debug|x86
{16AA21E2-D6B7-427D-AB7D-AA8C611B724E}.Debug|Any CPU.ActiveCfg = Debug|x86
{16AA21E2-D6B7-427D-AB7D-AA8C611B724E}.Debug|x86.ActiveCfg = Debug|x86
{16AA21E2-D6B7-427D-AB7D-AA8C611B724E}.Debug|x86.Build.0 = Debug|x86
{16AA21E2-D6B7-427D-AB7D-AA8C611B724E}.Release Installer|Any CPU.ActiveCfg = Release|x86
{16AA21E2-D6B7-427D-AB7D-AA8C611B724E}.Release Installer|Any CPU.Build.0 = Release|x86
{16AA21E2-D6B7-427D-AB7D-AA8C611B724E}.Release Installer|x86.ActiveCfg = Release|x86
{16AA21E2-D6B7-427D-AB7D-AA8C611B724E}.Release Installer|x86.Build.0 = Release|x86
{16AA21E2-D6B7-427D-AB7D-AA8C611B724E}.Release Portable|Any CPU.ActiveCfg = Release|x86
{16AA21E2-D6B7-427D-AB7D-AA8C611B724E}.Release Portable|Any CPU.Build.0 = Release|x86
{16AA21E2-D6B7-427D-AB7D-AA8C611B724E}.Release Portable|x86.ActiveCfg = Release|x86
{16AA21E2-D6B7-427D-AB7D-AA8C611B724E}.Release Portable|x86.Build.0 = Release|x86
{16AA21E2-D6B7-427D-AB7D-AA8C611B724E}.Release|Any CPU.ActiveCfg = Release|x86
{16AA21E2-D6B7-427D-AB7D-AA8C611B724E}.Release|x86.ActiveCfg = Release|x86
{16AA21E2-D6B7-427D-AB7D-AA8C611B724E}.Release|x86.Build.0 = Release|x86
{4934A491-40BC-4E5B-9166-EA1169A220F6}.Debug Portable|x64.ActiveCfg = Debug Portable|x64
{4934A491-40BC-4E5B-9166-EA1169A220F6}.Debug Portable|x64.Build.0 = Debug Portable|x64
{4934A491-40BC-4E5B-9166-EA1169A220F6}.Debug|x64.ActiveCfg = Debug|x64
{4934A491-40BC-4E5B-9166-EA1169A220F6}.Debug|x64.Build.0 = Debug|x64
{4934A491-40BC-4E5B-9166-EA1169A220F6}.Release Installer|x64.ActiveCfg = Release|x64
{4934A491-40BC-4E5B-9166-EA1169A220F6}.Release Installer|x64.Build.0 = Release|x64
{4934A491-40BC-4E5B-9166-EA1169A220F6}.Release Portable|x64.ActiveCfg = Release Portable|x64
{4934A491-40BC-4E5B-9166-EA1169A220F6}.Release Portable|x64.Build.0 = Release Portable|x64
{4934A491-40BC-4E5B-9166-EA1169A220F6}.Release|x64.ActiveCfg = Release|x64
{4934A491-40BC-4E5B-9166-EA1169A220F6}.Release|x64.Build.0 = Release|x64
{1453B37F-8621-499E-B0B2-6091F76DC0BB}.Debug Portable|x64.ActiveCfg = Debug Portable|x64
{1453B37F-8621-499E-B0B2-6091F76DC0BB}.Debug|x64.ActiveCfg = Debug|x64
{1453B37F-8621-499E-B0B2-6091F76DC0BB}.Release Installer|x64.ActiveCfg = Release|x64
{1453B37F-8621-499E-B0B2-6091F76DC0BB}.Release Portable|x64.ActiveCfg = Release Portable|x64
{1453B37F-8621-499E-B0B2-6091F76DC0BB}.Release Portable|x64.Build.0 = Release Portable|x64
{1453B37F-8621-499E-B0B2-6091F76DC0BB}.Release|x64.ActiveCfg = Release|x64
{1453B37F-8621-499E-B0B2-6091F76DC0BB}.Release|x64.Build.0 = Release|x64
{5423D985-CB48-4344-B47F-E8C6D60C8B04}.Debug Portable|x64.ActiveCfg = Debug Portable|x64
{5423D985-CB48-4344-B47F-E8C6D60C8B04}.Debug|x64.ActiveCfg = Debug|x64
{5423D985-CB48-4344-B47F-E8C6D60C8B04}.Release Installer|x64.ActiveCfg = Release|x64
{5423D985-CB48-4344-B47F-E8C6D60C8B04}.Release Installer|x64.Build.0 = Release|x64
{5423D985-CB48-4344-B47F-E8C6D60C8B04}.Release Portable|x64.ActiveCfg = Release Portable|x64
{5423D985-CB48-4344-B47F-E8C6D60C8B04}.Release Portable|x64.Build.0 = Release Portable|x64
{5423D985-CB48-4344-B47F-E8C6D60C8B04}.Release|x64.ActiveCfg = Release|x64
{F0168B9F-6815-40DF-BA53-46CEE7683B68}.Debug Portable|x64.ActiveCfg = Debug Portable|x64
{F0168B9F-6815-40DF-BA53-46CEE7683B68}.Debug|x64.ActiveCfg = Debug|x64
{F0168B9F-6815-40DF-BA53-46CEE7683B68}.Release Installer|x64.ActiveCfg = Release|x64
{F0168B9F-6815-40DF-BA53-46CEE7683B68}.Release Installer|x64.Build.0 = Release|x64
{F0168B9F-6815-40DF-BA53-46CEE7683B68}.Release Portable|x64.ActiveCfg = Release Portable|x64
{F0168B9F-6815-40DF-BA53-46CEE7683B68}.Release|x64.ActiveCfg = Release|x64
{16AA21E2-D6B7-427D-AB7D-AA8C611B724E}.Debug Portable|x64.ActiveCfg = Debug Portable|x64
{16AA21E2-D6B7-427D-AB7D-AA8C611B724E}.Debug|x64.ActiveCfg = Debug|x64
{16AA21E2-D6B7-427D-AB7D-AA8C611B724E}.Release Installer|x64.ActiveCfg = Release|x64
{16AA21E2-D6B7-427D-AB7D-AA8C611B724E}.Release Portable|x64.ActiveCfg = Release Portable|x64
{16AA21E2-D6B7-427D-AB7D-AA8C611B724E}.Release|x64.ActiveCfg = Release|x64
{A56A2029-79B8-492A-ABE5-D2BFE05801BD}.Debug Portable|x64.ActiveCfg = Debug Portable|x64
{A56A2029-79B8-492A-ABE5-D2BFE05801BD}.Debug Portable|x64.Build.0 = Debug Portable|x64
{A56A2029-79B8-492A-ABE5-D2BFE05801BD}.Debug|x64.ActiveCfg = Debug|x64
{A56A2029-79B8-492A-ABE5-D2BFE05801BD}.Debug|x64.Build.0 = Debug|x64
{A56A2029-79B8-492A-ABE5-D2BFE05801BD}.Release Installer|x64.ActiveCfg = Release|x64
{A56A2029-79B8-492A-ABE5-D2BFE05801BD}.Release Installer|x64.Build.0 = Release|x64
{A56A2029-79B8-492A-ABE5-D2BFE05801BD}.Release Portable|x64.ActiveCfg = Release Portable|x64
{A56A2029-79B8-492A-ABE5-D2BFE05801BD}.Release|x64.ActiveCfg = Release|x64
{A56A2029-79B8-492A-ABE5-D2BFE05801BD}.Release|x64.Build.0 = Release|x64
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE

View File

@@ -7,6 +7,7 @@ using mRemoteNG.Messages;
using mRemoteNG.Properties;
using mRemoteNG.UI.Forms;
using mRemoteNG.UI.TaskDialog;
using mRemoteNG.Resources.Language;
namespace mRemoteNG.App
{

View File

@@ -7,6 +7,7 @@ using mRemoteNG.Connection;
using mRemoteNG.Connection.Protocol;
using mRemoteNG.Container;
using mRemoteNG.Tools;
using mRemoteNG.Resources.Language;
namespace mRemoteNG.App
{

View File

@@ -1,10 +1,12 @@
namespace mRemoteNG.App.Info
using System;
namespace mRemoteNG.App.Info
{
public static class ConnectionsFileInfo
{
public static readonly string DefaultConnectionsPath = SettingsFileInfo.SettingsPath;
public static readonly string DefaultConnectionsFile = "confCons.xml";
public static readonly string DefaultConnectionsFileNew = "confConsNew.xml";
public static readonly double ConnectionFileVersion = 2.8;
public static readonly Version ConnectionFileVersion = new Version(2, 9);
}
}

View File

@@ -3,6 +3,7 @@ using System.Management;
using System.Threading;
using System.Windows.Forms;
using mRemoteNG.Messages;
using mRemoteNG.Resources.Language;
namespace mRemoteNG.App.Initialization
{

View File

@@ -71,6 +71,12 @@ namespace mRemoteNG.App
[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
internal static extern IntPtr SetClipboardViewer(IntPtr hWndNewViewer);
[DllImport("User32.dll", CharSet = CharSet.Auto)]
internal static extern bool ChangeClipboardChain(
IntPtr hWndRemove, // handle to window to remove
IntPtr hWndNewNext // handle to next window
);
[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
internal static extern bool SetForegroundWindow(IntPtr hWnd);

View File

@@ -16,6 +16,7 @@ using System.Security;
using System.Threading;
using System.Windows.Forms;
using mRemoteNG.Properties;
using mRemoteNG.Resources.Language;
namespace mRemoteNG.App
{
@@ -102,6 +103,10 @@ namespace mRemoteNG.App
{
ConnectionsService.LastSqlUpdate = DateTime.Now;
}
else
{
ConnectionsService.LastFileUpdate = System.IO.File.GetLastWriteTime(connectionFileName);
}
// re-enable sql update checking after updates are loaded
ConnectionsService.RemoteConnectionsSyncronizer?.Enable();

View File

@@ -2,10 +2,12 @@
using System;
using System.Diagnostics;
using System.Windows.Forms;
using mRemoteNG.Config.Connections;
using mRemoteNG.Config.Putty;
using mRemoteNG.Properties;
using mRemoteNG.UI.Controls;
using mRemoteNG.UI.Forms;
using mRemoteNG.Resources.Language;
// ReSharper disable ArrangeAccessorOwnerBody
@@ -59,8 +61,34 @@ namespace mRemoteNG.App
private static void SaveConnections()
{
if (Settings.Default.SaveConsOnExit)
DateTime lastUpdate;
DateTime updateDate;
DateTime currentDate = DateTime.Now;
//OBSOLETE: Settings.Default.SaveConsOnExit is obsolete and should be removed in a future release
if (Settings.Default.SaveConsOnExit || (Settings.Default.SaveConnectionsFrequency == (int)ConnectionsBackupFrequencyEnum.OnExit))
{
Runtime.ConnectionsService.SaveConnections();
return;
}
lastUpdate = Runtime.ConnectionsService.UsingDatabase ? Runtime.ConnectionsService.LastSqlUpdate : Runtime.ConnectionsService.LastFileUpdate;
switch (Settings.Default.SaveConnectionsFrequency)
{
case (int)ConnectionsBackupFrequencyEnum.Daily:
updateDate = lastUpdate.AddDays(1);
break;
case (int)ConnectionsBackupFrequencyEnum.Weekly:
updateDate = lastUpdate.AddDays(7);
break;
default:
return;
}
if (currentDate >= updateDate)
{
Runtime.ConnectionsService.SaveConnections();
}
}
private static void SaveSettings(Control quickConnectToolStrip,

View File

@@ -0,0 +1,13 @@
namespace mRemoteNG.Config.Connections
{
public enum ConnectionsBackupFrequencyEnum
{
Unassigned = 0,
Never = 1,
OnEdit = 2,
OnExit = 3,
Daily = 4,
Weekly = 5,
Custom = 6
}
}

View File

@@ -8,7 +8,7 @@ namespace mRemoteNG.Config.Connections.Multiuser
{
public class RemoteConnectionsSyncronizer : IConnectionsUpdateChecker
{
private readonly Timer _updateTimer;
private readonly System.Timers.Timer _updateTimer;
private readonly IConnectionsUpdateChecker _updateChecker;
public double TimerIntervalInMilliseconds
@@ -19,7 +19,7 @@ namespace mRemoteNG.Config.Connections.Multiuser
public RemoteConnectionsSyncronizer(IConnectionsUpdateChecker updateChecker)
{
_updateChecker = updateChecker;
_updateTimer = new Timer(3000);
_updateTimer = new System.Timers.Timer(3000);
SetEventListeners();
}

View File

@@ -3,6 +3,7 @@ using System.Collections.Specialized;
using System.ComponentModel;
using mRemoteNG.Connection;
using mRemoteNG.UI.Forms;
using mRemoteNG.Properties;
namespace mRemoteNG.Config.Connections
{
@@ -48,12 +49,14 @@ namespace mRemoteNG.Config.Connections
private void SaveConnectionOnEdit(string propertyName = "")
{
if (!Properties.Settings.Default.SaveConnectionsAfterEveryEdit)
return;
//OBSOLETE: mRemoteNG.Settings.Default.SaveConnectionsAfterEveryEdit is obsolete and should be removed in a future release
if (mRemoteNG.Properties.Settings.Default.SaveConnectionsAfterEveryEdit || (mRemoteNG.Properties.Settings.Default.SaveConnectionsFrequency == (int)ConnectionsBackupFrequencyEnum.OnEdit))
{
if (FrmMain.Default.IsClosing)
return;
_connectionsService.SaveConnectionsAsync(propertyName);
}
}
}
}

View File

@@ -17,6 +17,7 @@ using mRemoteNG.Security.SymmetricEncryption;
using mRemoteNG.Tools;
using mRemoteNG.Tree;
using mRemoteNG.Tree.Root;
using mRemoteNG.Resources.Language;
namespace mRemoteNG.Config.Connections
{
@@ -139,9 +140,9 @@ namespace mRemoteNG.Config.Connections
{
dbQuery =
databaseConnector.DbCommand(
"INSERT INTO tblRoot (Name, Export, Protected, ConfVersion) VALUES(\'" +
MiscTools.PrepareValueForDB(rootTreeNode.Name) + "\', 0, \'" + strProtected + "\'," +
ConnectionsFileInfo.ConnectionFileVersion.ToString(CultureInfo.InvariantCulture) + ")");
"INSERT INTO tblRoot (Name, Export, Protected, ConfVersion) VALUES('" +
MiscTools.PrepareValueForDB(rootTreeNode.Name) + "', 0, '" + strProtected + "','" +
ConnectionsFileInfo.ConnectionFileVersion.ToString() + "')");
dbQuery.ExecuteNonQuery();
}
else
@@ -171,7 +172,7 @@ namespace mRemoteNG.Config.Connections
{
var dbQuery = databaseConnector.DbCommand("DELETE FROM tblUpdate");
dbQuery.ExecuteNonQuery();
dbQuery = databaseConnector.DbCommand("INSERT INTO tblUpdate (LastUpdate) VALUES(\'" + MiscTools.DBDate(DateTime.Now) + "\')");
dbQuery = databaseConnector.DbCommand("INSERT INTO tblUpdate (LastUpdate) VALUES('" + MiscTools.DBDate(DateTime.Now) + "')");
dbQuery.ExecuteNonQuery();
}

View File

@@ -2,6 +2,7 @@
using System.IO;
using mRemoteNG.App;
using mRemoteNG.Messages;
using mRemoteNG.Resources.Language;
namespace mRemoteNG.Config.DataProviders
{

View File

@@ -136,6 +136,10 @@ namespace mRemoteNG.Config.Serializers.ConnectionSerializers.Csv
? connectionCsv[headers.IndexOf("LoadBalanceInfo")]
: "";
connectionRecord.OpeningCommand = headers.Contains("OpeningCommand")
? connectionCsv[headers.IndexOf("OpeningCommand")]
: "";
connectionRecord.PreExtApp = headers.Contains("PreExtApp")
? connectionCsv[headers.IndexOf("PreExtApp")]
: "";
@@ -186,6 +190,14 @@ namespace mRemoteNG.Config.Serializers.ConnectionSerializers.Csv
? connectionCsv[headers.IndexOf("RDGatewayHostname")]
: "";
connectionRecord.StartProgram = headers.Contains("StartProgram")
? connectionCsv[headers.IndexOf("StartProgram")]
: "";
connectionRecord.StartProgramWorkDir = headers.Contains("StartProgramWorkDir")
? connectionCsv[headers.IndexOf("StartProgramWorkDir")]
: "";
if (headers.Contains("Protocol"))
{
if (Enum.TryParse(connectionCsv[headers.IndexOf("Protocol")], out ProtocolType protocolType))
@@ -536,6 +548,12 @@ namespace mRemoteNG.Config.Serializers.ConnectionSerializers.Csv
connectionRecord.Inheritance.SSHTunnelConnectionName = value;
}
if (headers.Contains("InheritOpeningCommand"))
{
if (bool.TryParse(connectionCsv[headers.IndexOf("InheritOpeningCommand")], out bool value))
connectionRecord.Inheritance.OpeningCommand = value;
}
if (headers.Contains("InheritSSHOptions"))
{
if (bool.TryParse(connectionCsv[headers.IndexOf("InheritSSHOptions")], out bool value))
@@ -656,6 +674,12 @@ namespace mRemoteNG.Config.Serializers.ConnectionSerializers.Csv
connectionRecord.Inheritance.LoadBalanceInfo = value;
}
if (headers.Contains("InheritOpeningCommand"))
{
if (bool.TryParse(connectionCsv[headers.IndexOf("InheritOpeningCommand")], out bool value))
connectionRecord.Inheritance.OpeningCommand = value;
}
if (headers.Contains("InheritPreExtApp"))
{
if (bool.TryParse(connectionCsv[headers.IndexOf("InheritPreExtApp")], out bool value))

View File

@@ -56,12 +56,12 @@ namespace mRemoteNG.Config.Serializers.ConnectionSerializers.Csv
if (_saveFilter.SaveDomain)
sb.Append("Domain;");
sb.Append("Hostname;Port;VmId;Protocol;SSHTunnelConnectionName;SSHOptions;PuttySession;ConnectToConsole;UseCredSsp;UseVmId;UseEnhancedMode;RenderingEngine;RDPAuthenticationLevel;" +
sb.Append("Hostname;Port;VmId;Protocol;SSHTunnelConnectionName;OpeningCommand;SSHOptions;PuttySession;ConnectToConsole;UseCredSsp;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;" +
"VNCProxyPort;VNCProxyUsername;VNCProxyPassword;VNCColors;VNCSmartSizeMode;VNCViewOnly;RDGatewayUsageMethod;RDGatewayHostname;" +
"RDGatewayUseConnectionCredentials;RDGatewayUsername;RDGatewayPassword;RDGatewayDomain;RedirectAudioCapture;RdpVersion;");
"RDGatewayUseConnectionCredentials;RDGatewayUsername;RDGatewayPassword;RDGatewayDomain;RedirectAudioCapture;RdpVersion;StartProgram;StartProgramWorkDir;");
if (_saveFilter.SaveInheritance)
sb.Append("InheritCacheBitmaps;InheritColors;InheritDescription;InheritDisplayThemes;InheritDisplayWallpaper;" +
@@ -120,6 +120,7 @@ namespace mRemoteNG.Config.Serializers.ConnectionSerializers.Csv
.Append(FormatForCsv(con.VmId))
.Append(FormatForCsv(con.Protocol))
.Append(FormatForCsv(con.SSHTunnelConnectionName))
.Append(FormatForCsv(con.OpeningCommand))
.Append(FormatForCsv(con.SSHOptions))
.Append(FormatForCsv(con.PuttySession))
.Append(FormatForCsv(con.UseConsoleSession))
@@ -172,7 +173,9 @@ namespace mRemoteNG.Config.Serializers.ConnectionSerializers.Csv
.Append(FormatForCsv(con.RDGatewayPassword))
.Append(FormatForCsv(con.RDGatewayDomain))
.Append(FormatForCsv(con.RedirectAudioCapture))
.Append(FormatForCsv(con.RdpVersion));
.Append(FormatForCsv(con.RdpVersion))
.Append(FormatForCsv(con.StartProgram))
.Append(FormatForCsv(con.StartProgramWorkDir));
if (!_saveFilter.SaveInheritance)
@@ -196,6 +199,7 @@ namespace mRemoteNG.Config.Serializers.ConnectionSerializers.Csv
.Append(FormatForCsv(con.Inheritance.Port))
.Append(FormatForCsv(con.Inheritance.Protocol))
.Append(FormatForCsv(con.Inheritance.SSHTunnelConnectionName))
.Append(FormatForCsv(con.Inheritance.OpeningCommand))
.Append(FormatForCsv(con.Inheritance.SSHOptions))
.Append(FormatForCsv(con.Inheritance.PuttySession))
.Append(FormatForCsv(con.Inheritance.RedirectDiskDrives))

View File

@@ -91,25 +91,20 @@ namespace mRemoteNG.Config.Serializers.ConnectionSerializers.MsSql
connectionInfo.UseEnhancedMode = (bool)dataRow["UseEnhancedMode"];
connectionInfo.Protocol = (ProtocolType)Enum.Parse(typeof(ProtocolType), (string)dataRow["Protocol"]);
connectionInfo.SSHTunnelConnectionName = (string)dataRow["SSHTunnelConnectionName"];
connectionInfo.OpeningCommand = (string)dataRow["OpeningCommand"];
connectionInfo.SSHOptions = (string)dataRow["SSHOptions"];
connectionInfo.PuttySession = (string)dataRow["PuttySession"];
connectionInfo.Port = (int)dataRow["Port"];
connectionInfo.UseConsoleSession = (bool)dataRow["ConnectToConsole"];
connectionInfo.UseCredSsp = (bool)dataRow["UseCredSsp"];
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"]);
connectionInfo.RenderingEngine = (HTTPBase.RenderingEngine)Enum.Parse(typeof(HTTPBase.RenderingEngine), (string)dataRow["RenderingEngine"]);
connectionInfo.RDPAuthenticationLevel = (AuthenticationLevel)Enum.Parse(typeof(AuthenticationLevel), (string)dataRow["RDPAuthenticationLevel"]);
connectionInfo.RDPMinutesToIdleTimeout = (int)dataRow["RDPMinutesToIdleTimeout"];
connectionInfo.RDPAlertIdleTimeout = (bool)dataRow["RDPAlertIdleTimeout"];
connectionInfo.LoadBalanceInfo = (string)dataRow["LoadBalanceInfo"];
connectionInfo.Colors =
(RDPColors)Enum.Parse(typeof(RDPColors), (string)dataRow["Colors"]);
connectionInfo.Resolution =
(RDPResolutions)Enum.Parse(typeof(RDPResolutions),
(string)dataRow["Resolution"]);
connectionInfo.Colors = (RDPColors)Enum.Parse(typeof(RDPColors), (string)dataRow["Colors"]);
connectionInfo.Resolution = (RDPResolutions)Enum.Parse(typeof(RDPResolutions), (string)dataRow["Resolution"]);
connectionInfo.AutomaticResize = (bool)dataRow["AutomaticResize"];
connectionInfo.DisplayWallpaper = (bool)dataRow["DisplayWallpaper"];
connectionInfo.DisplayThemes = (bool)dataRow["DisplayThemes"];
@@ -125,43 +120,32 @@ namespace mRemoteNG.Config.Serializers.ConnectionSerializers.MsSql
connectionInfo.RedirectPrinters = (bool)dataRow["RedirectPrinters"];
connectionInfo.RedirectClipboard = (bool)dataRow["RedirectClipboard"];
connectionInfo.RedirectSmartCards = (bool)dataRow["RedirectSmartCards"];
connectionInfo.RedirectSound =
(RDPSounds)Enum.Parse(typeof(RDPSounds), (string)dataRow["RedirectSound"]);
connectionInfo.SoundQuality = (RDPSoundQuality)Enum.Parse(typeof(RDPSoundQuality),
(string)dataRow["SoundQuality"]);
connectionInfo.RedirectSound = (RDPSounds)Enum.Parse(typeof(RDPSounds), (string)dataRow["RedirectSound"]);
connectionInfo.SoundQuality = (RDPSoundQuality)Enum.Parse(typeof(RDPSoundQuality), (string)dataRow["SoundQuality"]);
connectionInfo.RedirectAudioCapture = (bool)dataRow["RedirectAudioCapture"];
connectionInfo.StartProgram = (string)dataRow["StartProgram"];
connectionInfo.StartProgramWorkDir = (string)dataRow["StartProgramWorkDir"];
connectionInfo.RedirectKeys = (bool)dataRow["RedirectKeys"];
connectionInfo.OpeningCommand = (string)dataRow["OpeningCommand"];
connectionInfo.PreExtApp = (string)dataRow["PreExtApp"];
connectionInfo.PostExtApp = (string)dataRow["PostExtApp"];
connectionInfo.MacAddress = (string)dataRow["MacAddress"];
connectionInfo.UserField = (string)dataRow["UserField"];
connectionInfo.ExtApp = (string)dataRow["ExtApp"];
connectionInfo.VNCCompression = (ProtocolVNC.Compression)Enum.Parse(typeof(ProtocolVNC.Compression),
(string)dataRow["VNCCompression"]);
connectionInfo.VNCEncoding =
(ProtocolVNC.Encoding)Enum.Parse(typeof(ProtocolVNC.Encoding), (string)dataRow["VNCEncoding"]);
connectionInfo.VNCAuthMode =
(ProtocolVNC.AuthMode)Enum.Parse(typeof(ProtocolVNC.AuthMode), (string)dataRow["VNCAuthMode"]);
connectionInfo.VNCProxyType =
(ProtocolVNC.ProxyType)Enum.Parse(typeof(ProtocolVNC.ProxyType), (string)dataRow["VNCProxyType"]);
connectionInfo.VNCCompression = (ProtocolVNC.Compression)Enum.Parse(typeof(ProtocolVNC.Compression), (string)dataRow["VNCCompression"]);
connectionInfo.VNCEncoding = (ProtocolVNC.Encoding)Enum.Parse(typeof(ProtocolVNC.Encoding), (string)dataRow["VNCEncoding"]);
connectionInfo.VNCAuthMode = (ProtocolVNC.AuthMode)Enum.Parse(typeof(ProtocolVNC.AuthMode), (string)dataRow["VNCAuthMode"]);
connectionInfo.VNCProxyType = (ProtocolVNC.ProxyType)Enum.Parse(typeof(ProtocolVNC.ProxyType), (string)dataRow["VNCProxyType"]);
connectionInfo.VNCProxyIP = (string)dataRow["VNCProxyIP"];
connectionInfo.VNCProxyPort = (int)dataRow["VNCProxyPort"];
connectionInfo.VNCProxyUsername = (string)dataRow["VNCProxyUsername"];
connectionInfo.VNCProxyPassword = DecryptValue((string)dataRow["VNCProxyPassword"]);
connectionInfo.VNCColors =
(ProtocolVNC.Colors)Enum.Parse(typeof(ProtocolVNC.Colors), (string)dataRow["VNCColors"]);
connectionInfo.VNCSmartSizeMode = (ProtocolVNC.SmartSizeMode)Enum.Parse(typeof(ProtocolVNC.SmartSizeMode),
(string)dataRow
["VNCSmartSizeMode"]);
connectionInfo.VNCColors = (ProtocolVNC.Colors)Enum.Parse(typeof(ProtocolVNC.Colors), (string)dataRow["VNCColors"]);
connectionInfo.VNCSmartSizeMode = (ProtocolVNC.SmartSizeMode)Enum.Parse(typeof(ProtocolVNC.SmartSizeMode), (string)dataRow["VNCSmartSizeMode"]);
connectionInfo.VNCViewOnly = (bool)dataRow["VNCViewOnly"];
connectionInfo.RDGatewayUsageMethod =
(RDGatewayUsageMethod)Enum.Parse(typeof(RDGatewayUsageMethod),
(string)dataRow["RDGatewayUsageMethod"]);
connectionInfo.RDGatewayUsageMethod = (RDGatewayUsageMethod)Enum.Parse(typeof(RDGatewayUsageMethod), (string)dataRow["RDGatewayUsageMethod"]);
connectionInfo.RDGatewayHostname = (string)dataRow["RDGatewayHostname"];
connectionInfo.RDGatewayUseConnectionCredentials =
(RDGatewayUseConnectionCredentials)Enum.Parse(typeof(RDGatewayUseConnectionCredentials),
(string)dataRow["RDGatewayUseConnectionCredentials"]);
connectionInfo.RDGatewayUseConnectionCredentials = (RDGatewayUseConnectionCredentials)Enum.Parse(typeof(RDGatewayUseConnectionCredentials), (string)dataRow["RDGatewayUseConnectionCredentials"]);
connectionInfo.RDGatewayUsername = (string)dataRow["RDGatewayUsername"];
connectionInfo.RDGatewayPassword = DecryptValue((string)dataRow["RDGatewayPassword"]);
connectionInfo.RDGatewayDomain = (string)dataRow["RDGatewayDomain"];
@@ -188,6 +172,7 @@ namespace mRemoteNG.Config.Serializers.ConnectionSerializers.MsSql
connectionInfo.Inheritance.Port = (bool)dataRow["InheritPort"];
connectionInfo.Inheritance.Protocol = (bool)dataRow["InheritProtocol"];
connectionInfo.Inheritance.SSHTunnelConnectionName = (bool)dataRow["InheritSSHTunnelConnectionName"];
connectionInfo.Inheritance.OpeningCommand = (bool)dataRow["InheritOpeningCommand"];
connectionInfo.Inheritance.SSHOptions = (bool)dataRow["InheritSSHOptions"];
connectionInfo.Inheritance.PuttySession = (bool)dataRow["InheritPuttySession"];
connectionInfo.Inheritance.RedirectDiskDrives = (bool)dataRow["InheritRedirectDiskDrives"];
@@ -212,6 +197,7 @@ namespace mRemoteNG.Config.Serializers.ConnectionSerializers.MsSql
connectionInfo.Inheritance.RDPAlertIdleTimeout = (bool)dataRow["InheritRDPAlertIdleTimeout"];
connectionInfo.Inheritance.RDPMinutesToIdleTimeout = (bool)dataRow["InheritRDPMinutesToIdleTimeout"];
connectionInfo.Inheritance.LoadBalanceInfo = (bool)dataRow["InheritLoadBalanceInfo"];
connectionInfo.Inheritance.OpeningCommand = (bool)dataRow["InheritOpeningCommand"];
connectionInfo.Inheritance.PreExtApp = (bool)dataRow["InheritPreExtApp"];
connectionInfo.Inheritance.PostExtApp = (bool)dataRow["InheritPostExtApp"];
connectionInfo.Inheritance.MacAddress = (bool)dataRow["InheritMacAddress"];
@@ -230,8 +216,7 @@ namespace mRemoteNG.Config.Serializers.ConnectionSerializers.MsSql
connectionInfo.Inheritance.VNCViewOnly = (bool)dataRow["InheritVNCViewOnly"];
connectionInfo.Inheritance.RDGatewayUsageMethod = (bool)dataRow["InheritRDGatewayUsageMethod"];
connectionInfo.Inheritance.RDGatewayHostname = (bool)dataRow["InheritRDGatewayHostname"];
connectionInfo.Inheritance.RDGatewayUseConnectionCredentials =
(bool)dataRow["InheritRDGatewayUseConnectionCredentials"];
connectionInfo.Inheritance.RDGatewayUseConnectionCredentials = (bool)dataRow["InheritRDGatewayUseConnectionCredentials"];
connectionInfo.Inheritance.RDGatewayUsername = (bool)dataRow["InheritRDGatewayUsername"];
connectionInfo.Inheritance.RDGatewayPassword = (bool)dataRow["InheritRDGatewayPassword"];
connectionInfo.Inheritance.RDGatewayDomain = (bool)dataRow["InheritRDGatewayDomain"];

View File

@@ -138,6 +138,7 @@ namespace mRemoteNG.Config.Serializers.ConnectionSerializers.MsSql
dataTable.Columns.Add("RedirectAudioCapture", typeof(bool));
dataTable.Columns.Add("RedirectKeys", typeof(bool));
dataTable.Columns.Add("Connected", typeof(bool));
dataTable.Columns.Add("OpeningCommand", typeof(string));
dataTable.Columns.Add("PreExtApp", typeof(string));
dataTable.Columns.Add("PostExtApp", typeof(string));
dataTable.Columns.Add("MacAddress", typeof(string));
@@ -194,6 +195,7 @@ namespace mRemoteNG.Config.Serializers.ConnectionSerializers.MsSql
dataTable.Columns.Add("InheritRenderingEngine", typeof(bool));
dataTable.Columns.Add("InheritRDPAuthenticationLevel", typeof(bool));
dataTable.Columns.Add("InheritUsername", typeof(bool));
dataTable.Columns.Add("InheritOpeningCommand", typeof(bool));
dataTable.Columns.Add("InheritPreExtApp", typeof(bool));
dataTable.Columns.Add("InheritPostExtApp", typeof(bool));
dataTable.Columns.Add("InheritMacAddress", typeof(bool));
@@ -236,6 +238,12 @@ namespace mRemoteNG.Config.Serializers.ConnectionSerializers.MsSql
dataTable.Columns.Add("InheritRdpVersion", typeof(bool));
dataTable.Columns.Add("EnhancedMode", typeof(bool));
dataTable.Columns.Add("InheritEnhancedMode", typeof(bool));
dataTable.Columns.Add("Favorite", typeof(bool));
dataTable.Columns.Add("InheritFavorite", typeof(bool));
dataTable.Columns.Add("ICAEncryptionStrength", typeof(string));
dataTable.Columns.Add("InheritICAEncryptionStrength", typeof(bool));
dataTable.Columns.Add("StartProgram", typeof(string));
dataTable.Columns.Add("StartProgramWorkDir", typeof(string));
}
private void SetPrimaryKey(DataTable dataTable)
@@ -314,10 +322,13 @@ namespace mRemoteNG.Config.Serializers.ConnectionSerializers.MsSql
dataRow["RedirectSound"].Equals(connectionInfo.RedirectSound.ToString()) &&
dataRow["SoundQuality"].Equals(connectionInfo.SoundQuality.ToString()) &&
dataRow["RedirectAudioCapture"].Equals(connectionInfo.RedirectAudioCapture) &&
dataRow["RedirectKeys"].Equals(connectionInfo.RedirectKeys);
dataRow["RedirectKeys"].Equals(connectionInfo.RedirectKeys) &&
dataRow["StartProgram"].Equals(connectionInfo.StartProgram) &&
dataRow["StartProgramWorkDir"].Equals(connectionInfo.StartProgramWorkDir);
isFieldNotChange = isFieldNotChange &&
dataRow["Connected"].Equals(false) && // TODO: this column can eventually be removed. we now save this property locally
dataRow["OpeningCommand"].Equals(connectionInfo.OpeningCommand) &&
dataRow["PreExtApp"].Equals(connectionInfo.PreExtApp) &&
dataRow["PostExtApp"].Equals(connectionInfo.PostExtApp) &&
dataRow["MacAddress"].Equals(connectionInfo.MacAddress) &&
@@ -337,7 +348,6 @@ namespace mRemoteNG.Config.Serializers.ConnectionSerializers.MsSql
dataRow["RDGatewayHostname"].Equals(connectionInfo.RDGatewayHostname) &&
dataRow["RDGatewayUseConnectionCredentials"].Equals(connectionInfo.RDGatewayUseConnectionCredentials.ToString()) &&
dataRow["RDGatewayUsername"].Equals(connectionInfo.RDGatewayUsername) &&
dataRow["RDGatewayDomain"].Equals(connectionInfo.RDGatewayDomain) &&
dataRow["RdpVersion"].Equals(connectionInfo.RdpVersion.ToString());
@@ -384,6 +394,7 @@ namespace mRemoteNG.Config.Serializers.ConnectionSerializers.MsSql
dataRow["InheritRDPMinutesToIdleTimeout"].Equals(connectionInfo.Inheritance.RDPMinutesToIdleTimeout) &&
dataRow["InheritRDPAlertIdleTimeout"].Equals(connectionInfo.Inheritance.RDPAlertIdleTimeout) &&
dataRow["InheritLoadBalanceInfo"].Equals(connectionInfo.Inheritance.LoadBalanceInfo) &&
dataRow["InheritOpeningCommand"].Equals(connectionInfo.Inheritance.OpeningCommand) &&
dataRow["InheritPreExtApp"].Equals(connectionInfo.Inheritance.PreExtApp) &&
dataRow["InheritPostExtApp"].Equals(connectionInfo.Inheritance.PostExtApp) &&
dataRow["InheritMacAddress"].Equals(connectionInfo.Inheritance.MacAddress) &&
@@ -447,6 +458,7 @@ namespace mRemoteNG.Config.Serializers.ConnectionSerializers.MsSql
dataRow["InheritRDPMinutesToIdleTimeout"].Equals(false) &&
dataRow["InheritRDPAlertIdleTimeout"].Equals(false) &&
dataRow["InheritLoadBalanceInfo"].Equals(false) &&
dataRow["InheritOpeningCommand"].Equals(false) &&
dataRow["InheritPreExtApp"].Equals(false) &&
dataRow["InheritPostExtApp"].Equals(false) &&
dataRow["InheritMacAddress"].Equals(false) &&
@@ -516,6 +528,7 @@ namespace mRemoteNG.Config.Serializers.ConnectionSerializers.MsSql
dataRow["VmId"] = connectionInfo.VmId;
dataRow["Protocol"] = connectionInfo.Protocol;
dataRow["SSHTunnelConnectionName"] = connectionInfo.SSHTunnelConnectionName;
dataRow["OpeningCommand"] = connectionInfo.OpeningCommand;
dataRow["SSHOptions"] = connectionInfo.SSHOptions;
dataRow["PuttySession"] = connectionInfo.PuttySession;
dataRow["Port"] = connectionInfo.Port;
@@ -550,6 +563,7 @@ namespace mRemoteNG.Config.Serializers.ConnectionSerializers.MsSql
dataRow["RedirectAudioCapture"] = connectionInfo.RedirectAudioCapture;
dataRow["RedirectKeys"] = connectionInfo.RedirectKeys;
dataRow["Connected"] = false; // TODO: this column can eventually be removed. we now save this property locally
dataRow["OpeningCommand"] = connectionInfo.OpeningCommand;
dataRow["PreExtApp"] = connectionInfo.PreExtApp;
dataRow["PostExtApp"] = connectionInfo.PostExtApp;
dataRow["MacAddress"] = connectionInfo.MacAddress;
@@ -574,7 +588,10 @@ namespace mRemoteNG.Config.Serializers.ConnectionSerializers.MsSql
dataRow["RDGatewayPassword"] = _cryptographyProvider.Encrypt(connectionInfo.RDGatewayPassword, _encryptionKey);
dataRow["RDGatewayDomain"] = connectionInfo.RDGatewayDomain;
dataRow["RdpVersion"] = connectionInfo.RdpVersion;
dataRow["Favorite"] = connectionInfo.Favorite;
dataRow["ICAEncryptionStrength"] = string.Empty;
dataRow["Prop_StartProgram"] = connectionInfo.StartProgram;
dataRow["Prop_StartProgramWorkDir"] = connectionInfo.StartProgramWorkDir;
if (_saveFilter.SaveInheritance)
{
@@ -596,6 +613,7 @@ namespace mRemoteNG.Config.Serializers.ConnectionSerializers.MsSql
dataRow["InheritPort"] = connectionInfo.Inheritance.Port;
dataRow["InheritProtocol"] = connectionInfo.Inheritance.Protocol;
dataRow["InheritSSHTunnelConnectionName"] = connectionInfo.Inheritance.SSHTunnelConnectionName;
dataRow["InheritOpeningCommand"] = connectionInfo.Inheritance.OpeningCommand;
dataRow["InheritSSHOptions"] = connectionInfo.Inheritance.SSHOptions;
dataRow["InheritPuttySession"] = connectionInfo.Inheritance.PuttySession;
dataRow["InheritRedirectDiskDrives"] = connectionInfo.Inheritance.RedirectDiskDrives;
@@ -620,6 +638,7 @@ namespace mRemoteNG.Config.Serializers.ConnectionSerializers.MsSql
dataRow["InheritRDPMinutesToIdleTimeout"] = connectionInfo.Inheritance.RDPMinutesToIdleTimeout;
dataRow["InheritRDPAlertIdleTimeout"] = connectionInfo.Inheritance.RDPAlertIdleTimeout;
dataRow["InheritLoadBalanceInfo"] = connectionInfo.Inheritance.LoadBalanceInfo;
dataRow["InheritOpeningCommand"] = connectionInfo.Inheritance.OpeningCommand;
dataRow["InheritPreExtApp"] = connectionInfo.Inheritance.PreExtApp;
dataRow["InheritPostExtApp"] = connectionInfo.Inheritance.PostExtApp;
dataRow["InheritMacAddress"] = connectionInfo.Inheritance.MacAddress;
@@ -643,6 +662,8 @@ namespace mRemoteNG.Config.Serializers.ConnectionSerializers.MsSql
dataRow["InheritRDGatewayPassword"] = connectionInfo.Inheritance.RDGatewayPassword;
dataRow["InheritRDGatewayDomain"] = connectionInfo.Inheritance.RDGatewayDomain;
dataRow["InheritRdpVersion"] = connectionInfo.Inheritance.RdpVersion;
dataRow["InheritFavorite"] = connectionInfo.Inheritance.Favorite;
dataRow["InheritICAEncryptionStrength"] = false;
}
else
{
@@ -685,6 +706,7 @@ namespace mRemoteNG.Config.Serializers.ConnectionSerializers.MsSql
dataRow["InheritRDPMinutesToIdleTimeout"] = false;
dataRow["InheritRDPAlertIdleTimeout"] = false;
dataRow["InheritLoadBalanceInfo"] = false;
dataRow["InheritOpeningCommand"] = false;
dataRow["InheritPreExtApp"] = false;
dataRow["InheritPostExtApp"] = false;
dataRow["InheritMacAddress"] = false;
@@ -708,6 +730,8 @@ namespace mRemoteNG.Config.Serializers.ConnectionSerializers.MsSql
dataRow["InheritRDGatewayPassword"] = false;
dataRow["InheritRDGatewayDomain"] = false;
dataRow["InheritRdpVersion"] = false;
dataRow["InheritFavorite"] = false;
dataRow["InheritICAEncryptionStrength"] = false;
}
if (isNewRow)_dataTable.Rows.Add(dataRow);
}

View File

@@ -80,9 +80,9 @@ namespace mRemoteNG.Config.Serializers.ConnectionSerializers.MsSql
if (rootTreeNode != null)
{
cmd = databaseConnector.DbCommand(
"INSERT INTO tblRoot (Name, Export, Protected, ConfVersion) VALUES(\'" +
MiscTools.PrepareValueForDB(rootTreeNode.Name) + "\', 0, \'" + strProtected + "\'," +
ConnectionsFileInfo.ConnectionFileVersion.ToString(CultureInfo.InvariantCulture) + ")");
"INSERT INTO tblRoot (Name, Export, Protected, ConfVersion) VALUES('" +
MiscTools.PrepareValueForDB(rootTreeNode.Name) + "', 0, '" + strProtected + "','" +
ConnectionsFileInfo.ConnectionFileVersion.ToString() + "')");
cmd.ExecuteNonQuery();
}
else

View File

@@ -1,4 +1,4 @@
using System;
using System;
using System.Security;
using System.Xml.Linq;
using mRemoteNG.Connection;
@@ -66,6 +66,7 @@ namespace mRemoteNG.Config.Serializers.ConnectionSerializers.Xml
element.Add(new XAttribute("Hostname", connectionInfo.Hostname));
element.Add(new XAttribute("Protocol", connectionInfo.Protocol));
element.Add(new XAttribute("SSHTunnelConnectionName", connectionInfo.SSHTunnelConnectionName));
element.Add(new XAttribute("OpeningCommand", connectionInfo.OpeningCommand));
element.Add(new XAttribute("SSHOptions", connectionInfo.SSHOptions));
element.Add(new XAttribute("PuttySession", connectionInfo.PuttySession));
element.Add(new XAttribute("Port", connectionInfo.Port));
@@ -168,6 +169,8 @@ namespace mRemoteNG.Config.Serializers.ConnectionSerializers.Xml
element.Add(new XAttribute("InheritProtocol", inheritance.Protocol.ToString().ToLowerInvariant()));
if (inheritance.SSHTunnelConnectionName)
element.Add(new XAttribute("InheritSSHTunnelConnectionName", inheritance.SSHTunnelConnectionName.ToString().ToLowerInvariant()));
if (inheritance.OpeningCommand)
element.Add(new XAttribute("InheritOpeningCommand", inheritance.OpeningCommand.ToString().ToLowerInvariant()));
if (inheritance.SSHOptions)
element.Add(new XAttribute("InheritSSHOptions", inheritance.SSHOptions.ToString().ToLowerInvariant()));
if (inheritance.PuttySession)

View File

@@ -1,4 +1,4 @@
using System;
using System;
using System.Security;
using System.Xml.Linq;
using mRemoteNG.App;
@@ -76,6 +76,7 @@ namespace mRemoteNG.Config.Serializers.ConnectionSerializers.Xml
element.Add(new XAttribute("Protocol", connectionInfo.Protocol));
element.Add(new XAttribute("RdpVersion", connectionInfo.RdpVersion.ToString().ToLowerInvariant()));
element.Add(new XAttribute("SSHTunnelConnectionName", connectionInfo.SSHTunnelConnectionName));
element.Add(new XAttribute("OpeningCommand", connectionInfo.OpeningCommand));
element.Add(new XAttribute("SSHOptions", connectionInfo.SSHOptions));
element.Add(new XAttribute("PuttySession", connectionInfo.PuttySession));
element.Add(new XAttribute("Port", connectionInfo.Port));
@@ -115,6 +116,7 @@ namespace mRemoteNG.Config.Serializers.ConnectionSerializers.Xml
element.Add(new XAttribute("Favorite", connectionInfo.Favorite));
element.Add(new XAttribute("ExtApp", connectionInfo.ExtApp));
element.Add(new XAttribute("StartProgram", connectionInfo.StartProgram));
element.Add(new XAttribute("StartProgramWorkDir", connectionInfo.StartProgramWorkDir));
element.Add(new XAttribute("VNCCompression", connectionInfo.VNCCompression));
element.Add(new XAttribute("VNCEncoding", connectionInfo.VNCEncoding));
element.Add(new XAttribute("VNCAuthMode", connectionInfo.VNCAuthMode));
@@ -194,6 +196,8 @@ namespace mRemoteNG.Config.Serializers.ConnectionSerializers.Xml
element.Add(new XAttribute("InheritRdpVersion", inheritance.RdpVersion.ToString().ToLowerInvariant()));
if (inheritance.SSHTunnelConnectionName)
element.Add(new XAttribute("InheritSSHTunnelConnectionName", inheritance.SSHTunnelConnectionName.ToString().ToLowerInvariant()));
if (inheritance.OpeningCommand)
element.Add(new XAttribute("InheritOpeningCommand", inheritance.OpeningCommand.ToString().ToLowerInvariant()));
if (inheritance.SSHOptions)
element.Add(new XAttribute("InheritSSHOptions", inheritance.SSHOptions.ToString().ToLowerInvariant()));
if (inheritance.PuttySession)

View File

@@ -17,6 +17,7 @@ using mRemoteNG.Tree;
using mRemoteNG.Tree.Root;
using mRemoteNG.UI.Forms;
using mRemoteNG.UI.TaskDialog;
using mRemoteNG.Resources.Language;
namespace mRemoteNG.Config.Serializers.ConnectionSerializers.Xml
{
@@ -538,12 +539,15 @@ namespace mRemoteNG.Config.Serializers.ConnectionSerializers.Xml
connectionInfo.UseEnhancedMode = xmlnode.GetAttributeAsBool("UseEnhancedMode");
connectionInfo.RdpVersion = xmlnode.GetAttributeAsEnum("RdpVersion", RdpVersion.Highest);
connectionInfo.SSHTunnelConnectionName = xmlnode.GetAttributeAsString("SSHTunnelConnectionName");
connectionInfo.OpeningCommand = xmlnode.GetAttributeAsString("OpeningCommand");
connectionInfo.SSHOptions = xmlnode.GetAttributeAsString("SSHOptions");
connectionInfo.StartProgram = xmlnode.GetAttributeAsString("StartProgram");
connectionInfo.DisableFullWindowDrag = xmlnode.GetAttributeAsBool("DisableFullWindowDrag");
connectionInfo.DisableMenuAnimations = xmlnode.GetAttributeAsBool("DisableMenuAnimations");
connectionInfo.DisableCursorShadow = xmlnode.GetAttributeAsBool("DisableCursorShadow");
connectionInfo.DisableCursorBlinking = xmlnode.GetAttributeAsBool("DisableCursorBlinking");
connectionInfo.StartProgram = xmlnode.GetAttributeAsString("StartProgram");
connectionInfo.StartProgramWorkDir = xmlnode.GetAttributeAsString("StartProgramWorkDir");
connectionInfo.Inheritance.RedirectClipboard = xmlnode.GetAttributeAsBool("InheritRedirectClipboard");
connectionInfo.Inheritance.Favorite = xmlnode.GetAttributeAsBool("InheritFavorite");
connectionInfo.Inheritance.RdpVersion = xmlnode.GetAttributeAsBool("InheritRdpVersion");
@@ -551,12 +555,14 @@ namespace mRemoteNG.Config.Serializers.ConnectionSerializers.Xml
connectionInfo.Inheritance.VmId = xmlnode.GetAttributeAsBool("InheritVmId");
connectionInfo.Inheritance.UseEnhancedMode = xmlnode.GetAttributeAsBool("InheritUseEnhancedMode");
connectionInfo.Inheritance.SSHTunnelConnectionName = xmlnode.GetAttributeAsBool("InheritSSHTunnelConnectionName");
connectionInfo.Inheritance.OpeningCommand = xmlnode.GetAttributeAsBool("InheritOpeningCommand");
connectionInfo.Inheritance.SSHOptions = xmlnode.GetAttributeAsBool("InheritSSHOptions");
connectionInfo.Inheritance.DisableFullWindowDrag = xmlnode.GetAttributeAsBool("InheritDisableFullWindowDrag");
connectionInfo.Inheritance.DisableMenuAnimations = xmlnode.GetAttributeAsBool("InheritDisableMenuAnimations");
connectionInfo.Inheritance.DisableCursorShadow = xmlnode.GetAttributeAsBool("InheritDisableCursorShadow");
connectionInfo.Inheritance.DisableCursorBlinking = xmlnode.GetAttributeAsBool("InheritDisableCursorBlinking");
}
}
catch (Exception ex)
{

View File

@@ -9,6 +9,7 @@ using mRemoteNG.Container;
using mRemoteNG.Tools;
using mRemoteNG.Tree;
using mRemoteNG.Tree.Root;
using mRemoteNG.Resources.Language;
namespace mRemoteNG.Config.Serializers.MiscSerializers
{

View File

@@ -1,4 +1,4 @@
using System;
using System;
using System.IO;
using System.Security.Cryptography;
using System.Text;
@@ -9,6 +9,7 @@ using mRemoteNG.Connection.Protocol.RDP;
using mRemoteNG.Container;
using mRemoteNG.Tree;
using mRemoteNG.Tree.Root;
using mRemoteNG.Resources.Language;
namespace mRemoteNG.Config.Serializers.MiscSerializers
{

View File

@@ -2,12 +2,15 @@
using mRemoteNG.App.Info;
using mRemoteNG.Config.DatabaseConnectors;
using mRemoteNG.Messages;
using mRemoteNG.Resources.Language;
using System;
namespace mRemoteNG.Config.Serializers.Versioning
{
public class SqlDatabaseVersionVerifier
{
protected readonly Version currentSupportedVersion = new Version(2, 9);
private readonly IDatabaseConnector _databaseConnector;
public SqlDatabaseVersionVerifier(IDatabaseConnector DatabaseConnector)
@@ -38,6 +41,7 @@ namespace mRemoteNG.Config.Serializers.Versioning
new SqlVersion25To26Upgrader(_databaseConnector),
new SqlVersion26To27Upgrader(_databaseConnector),
new SqlVersion27To28Upgrader(_databaseConnector),
new SqlVersion28To29Upgrader(_databaseConnector),
};
foreach (var upgrader in dbUpgraders)
@@ -49,7 +53,7 @@ namespace mRemoteNG.Config.Serializers.Versioning
}
// DB is at the highest current supported version
if (databaseVersion.CompareTo(new Version(2, 8)) == 0)
if (databaseVersion.CompareTo(currentSupportedVersion) == 0)
isVerified = true;
if (isVerified == false)

View File

@@ -0,0 +1,80 @@
using mRemoteNG.App;
using mRemoteNG.Config.DatabaseConnectors;
using mRemoteNG.Messages;
using System;
using System.Data.Common;
namespace mRemoteNG.Config.Serializers.Versioning
{
public class SqlVersion28To29Upgrader : IVersionUpgrader
{
private readonly Version version = new Version(2, 9);
private readonly IDatabaseConnector _databaseConnector;
public SqlVersion28To29Upgrader(IDatabaseConnector databaseConnector)
{
_databaseConnector = databaseConnector ?? throw new ArgumentNullException(nameof(databaseConnector));
}
public bool CanUpgrade(Version currentVersion)
{
return currentVersion == new Version(2, 8) ||
// Support upgrading during dev revisions, 2.9.1, 2.9.2, etc...
(currentVersion <= new Version(2, 9) &&
currentVersion < version);
}
public Version Upgrade()
{
Runtime.MessageCollector.AddMessage(MessageClass.InformationMsg,
string.Format("Upgrading database to version {0}.", version));
const string mySqlAlter = @"
ALTER TABLE tblCons ADD COLUMN StartProgram varchar(512) DEFAULT NULL;
ALTER TABLE tblCons ADD COLUMN StartProgramWorkDir varchar(512) DEFAULT NULL;
ALTER TABLE tblRoot CHANGE COLUMN ConfVersion ConfVersion VARCHAR(15) NOT NULL;";
const string mySqlUpdate = @"UPDATE tblRoot SET ConfVersion=?;";
const string msSqlAlter = @"
IF NOT EXISTS (SELECT * FROM sys.columns WHERE object_id = OBJECT_ID(N'[dbo].[tblCons]') AND name = 'StartProgram')
BEGIN
ALTER TABLE tblCons ADD StartProgram varchar(512), StartProgramWorkDir varchar(512);
END;GO;
ALTER TABLE tblRoot MODIFY COLUMN ConfVersion varchar(15);GO;";
const string msSqlUpdate = @"UPDATE tblRoot SET ConfVersion=@confVersion;";
using (var sqlTran = _databaseConnector.DbConnection().BeginTransaction(System.Data.IsolationLevel.Serializable))
{
DbCommand dbCommand;
if (_databaseConnector.GetType() == typeof(MSSqlDatabaseConnector))
{
dbCommand = _databaseConnector.DbCommand(msSqlAlter);
dbCommand.Transaction = sqlTran;
dbCommand.ExecuteNonQuery();
dbCommand = _databaseConnector.DbCommand(msSqlUpdate);
dbCommand.Transaction = sqlTran;
}
else if (_databaseConnector.GetType() == typeof(MySqlDatabaseConnector))
{
dbCommand = _databaseConnector.DbCommand(mySqlAlter);
dbCommand.Transaction = sqlTran;
dbCommand.ExecuteNonQuery();
dbCommand = _databaseConnector.DbCommand(mySqlUpdate);
dbCommand.Transaction = sqlTran;
}
else
{
throw new Exception("Unknown database back-end");
}
var pConfVersion = dbCommand.CreateParameter();
pConfVersion.ParameterName = "confVersion";
pConfVersion.Value = version.ToString();
pConfVersion.DbType = System.Data.DbType.String;
pConfVersion.Direction = System.Data.ParameterDirection.Input;
dbCommand.Parameters.Add(pConfVersion);
dbCommand.ExecuteNonQuery();
sqlTran.Commit();
}
return version;
}
}
}

View File

@@ -7,6 +7,7 @@ using mRemoteNG.Connection.Protocol.VNC;
using mRemoteNG.Properties;
using mRemoteNG.Tools;
using mRemoteNG.Tools.Attributes;
using mRemoteNG.Resources.Language;
namespace mRemoteNG.Connection
@@ -26,6 +27,7 @@ namespace mRemoteNG.Connection
private string _domain = "";
private string _vmId = "";
private bool _useEnhancedMode;
private string _startProgramWorkDir = "";
private string _sshTunnelConnectionName = "";
private ProtocolType _protocol;
@@ -76,6 +78,7 @@ namespace mRemoteNG.Connection
private string _preExtApp;
private string _postExtApp;
private string _macAddress;
private string _openingCommand;
private string _userField;
private string _startProgram;
private bool _favorite;
@@ -210,6 +213,16 @@ namespace mRemoteNG.Connection
get => GetPropertyValue("SSHTunnelConnectionName", _sshTunnelConnectionName).Trim();
set => SetField(ref _sshTunnelConnectionName, value?.Trim(), "SSHTunnelConnectionName");
}
[LocalizedAttributes.LocalizedCategory(nameof(Language.Miscellaneous), 7),
LocalizedAttributes.LocalizedDisplayName(nameof(Language.OpeningCommand)),
LocalizedAttributes.LocalizedDescription(nameof(Language.PropertyDescriptionOpeningCommand)),
AttributeUsedInProtocol(ProtocolType.SSH1, ProtocolType.SSH2)]
public virtual string OpeningCommand
{
get => GetPropertyValue("OpeningCommand", _openingCommand);
set => SetField(ref _openingCommand, value, "OpeningCommand");
}
#endregion
#region Protocol
@@ -740,6 +753,16 @@ namespace mRemoteNG.Connection
set => SetField(ref _startProgram, value, "StartProgram");
}
[LocalizedAttributes.LocalizedCategory(nameof(Language.Miscellaneous), 7),
LocalizedAttributes.LocalizedDisplayName(nameof(Language.RDPStartProgramWorkDir)),
LocalizedAttributes.LocalizedDescription(nameof(Language.PropertyDescriptionRDPStartProgramWorkDir)),
AttributeUsedInProtocol(ProtocolType.RDP)]
public virtual string StartProgramWorkDir
{
get => GetPropertyValue("StartProgramWorkDir", _startProgramWorkDir);
set => SetField(ref _startProgramWorkDir, value, "StartProgramWorkDir");
}
#endregion
#region VNC

View File

@@ -16,6 +16,7 @@ using mRemoteNG.Connection.Protocol.VNC;
using mRemoteNG.Container;
using mRemoteNG.Properties;
using mRemoteNG.Tree;
using mRemoteNG.Resources.Language;
using mRemoteNG.Tree.Root;
@@ -66,6 +67,7 @@ namespace mRemoteNG.Connection
SetTreeDisplayDefaults();
SetConnectionDefaults();
SetProtocolDefaults();
SetRemoteDesktopServicesDefaults();
SetRdGatewayDefaults();
SetAppearanceDefaults();
SetRedirectDefaults();
@@ -313,6 +315,12 @@ namespace mRemoteNG.Connection
UseEnhancedMode = Settings.Default.ConDefaultUseEnhancedMode;
}
private void SetRemoteDesktopServicesDefaults()
{
StartProgram = string.Empty;
StartProgramWorkDir = string.Empty;
}
private void SetRdGatewayDefaults()
{
RDGatewayUsageMethod = (RDGatewayUsageMethod)Enum.Parse(typeof(RDGatewayUsageMethod), Settings.Default.ConDefaultRDGatewayUsageMethod);
@@ -360,6 +368,7 @@ namespace mRemoteNG.Connection
UserField = Settings.Default.ConDefaultUserField;
Favorite = Settings.Default.ConDefaultFavorite;
StartProgram = Settings.Default.ConDefaultStartProgram;
OpeningCommand = Settings.Default.OpeningCommand;
}
private void SetVncDefaults()

View File

@@ -4,6 +4,7 @@ using System.Linq;
using System.Reflection;
using mRemoteNG.Tools;
using mRemoteNG.Tree.Root;
using mRemoteNG.Resources.Language;
namespace mRemoteNG.Connection
{
@@ -92,6 +93,15 @@ namespace mRemoteNG.Connection
[Browsable(true)]
public bool SSHTunnelConnectionName { get; set; }
[LocalizedAttributes.LocalizedCategory(nameof(Language.Connection), 3),
LocalizedAttributes.LocalizedDisplayNameInheritAttribute(nameof(Language.OpeningCommand)),
LocalizedAttributes.LocalizedDescriptionInheritAttribute(nameof(Language.PropertyDescriptionOpeningCommand)),
TypeConverter(typeof(MiscTools.YesNoTypeConverter))]
[Browsable(true)]
public bool OpeningCommand { get; set; }
#endregion
#region Protocol

View File

@@ -11,6 +11,7 @@ using mRemoteNG.UI.Panels;
using mRemoteNG.UI.Tabs;
using mRemoteNG.UI.Window;
using WeifenLuo.WinFormsUI.Docking;
using mRemoteNG.Resources.Language;
namespace mRemoteNG.Connection

View File

@@ -18,6 +18,7 @@ using mRemoteNG.Tools;
using mRemoteNG.Tree;
using mRemoteNG.Tree.Root;
using mRemoteNG.UI;
using mRemoteNG.Resources.Language;
namespace mRemoteNG.Connection
{
@@ -36,6 +37,7 @@ namespace mRemoteNG.Connection
public string ConnectionFileName { get; private set; }
public RemoteConnectionsSyncronizer RemoteConnectionsSyncronizer { get; set; }
public DateTime LastSqlUpdate { get; set; }
public DateTime LastFileUpdate { get; set; }
public ConnectionTreeModel ConnectionTreeModel { get; private set; }

View File

@@ -4,6 +4,7 @@ using Microsoft.Web.WebView2.WinForms;
using mRemoteNG.Tools;
using mRemoteNG.App;
using mRemoteNG.UI.Tabs;
using mRemoteNG.Resources.Language;
namespace mRemoteNG.Connection.Protocol.Http

View File

@@ -7,6 +7,7 @@ using mRemoteNG.App;
using mRemoteNG.Messages;
using mRemoteNG.Properties;
using mRemoteNG.Tools;
using mRemoteNG.Resources.Language;
namespace mRemoteNG.Connection.Protocol
{

View File

@@ -3,6 +3,7 @@ using System.Drawing;
using System.Windows.Forms;
using mRemoteNG.App;
using mRemoteNG.Messages;
using mRemoteNG.Resources.Language;
namespace mRemoteNG.Connection.Protocol.PowerShell
{

View File

@@ -8,6 +8,7 @@ using mRemoteNG.Connection.Protocol.VNC;
using System;
using mRemoteNG.Connection.Protocol.PowerShell;
using mRemoteNG.Properties;
using mRemoteNG.Resources.Language;
namespace mRemoteNG.Connection.Protocol
{

View File

@@ -1,4 +1,5 @@
using mRemoteNG.Tools;
using mRemoteNG.Resources.Language;
namespace mRemoteNG.Connection.Protocol
{

View File

@@ -10,6 +10,7 @@ using System.Drawing;
using System.Threading;
using System.Windows.Forms;
using mRemoteNG.Properties;
using mRemoteNG.Resources.Language;
// ReSharper disable ArrangeAccessorOwnerBody
@@ -113,6 +114,20 @@ namespace mRemoteNG.Connection.Protocol
}
}
// access secret server api if necessary
if (username.StartsWith("SSAPI:"))
{
var domain = ""; // dummy
try
{
ExternalConnectors.TSS.SecretServerInterface.FetchSecretFromServer(username, out username, out password, out domain);
}
catch (Exception ex)
{
Event_ErrorOccured(this, "Secret Server Interface Error: " + ex.Message, 0);
}
}
arguments.Add("-" + (int)PuttySSHVersion);
if (!Force.HasFlag(ConnectionInfo.Force.NoCredentials))
@@ -187,6 +202,13 @@ namespace mRemoteNG.Connection.Protocol
string.Format(Language.PanelHandle,
InterfaceControl.Parent.Handle), true);
if (!string.IsNullOrEmpty(InterfaceControl.Info?.OpeningCommand))
{
NativeMethods.SetForegroundWindow(PuttyHandle);
var finalCommand = InterfaceControl.Info.OpeningCommand.TrimEnd() + "\n";
SendKeys.SendWait(finalCommand);
}
Resize(this, new EventArgs());
base.Connect();
return true;

View File

@@ -1,4 +1,5 @@
using mRemoteNG.Tools;
using mRemoteNG.Resources.Language;
namespace mRemoteNG.Connection.Protocol.RDP
{

View File

@@ -1,4 +1,5 @@
using mRemoteNG.Tools;
using mRemoteNG.Resources.Language;
namespace mRemoteNG.Connection.Protocol.RDP
{

View File

@@ -1,4 +1,5 @@
using mRemoteNG.Tools;
using mRemoteNG.Resources.Language;
namespace mRemoteNG.Connection.Protocol.RDP
{

View File

@@ -1,4 +1,5 @@
using mRemoteNG.Tools;
using mRemoteNG.Resources.Language;
namespace mRemoteNG.Connection.Protocol.RDP
{

View File

@@ -1,5 +1,6 @@
using System.ComponentModel;
using mRemoteNG.Tools;
using mRemoteNG.Resources.Language;
namespace mRemoteNG.Connection.Protocol.RDP
{

View File

@@ -1,4 +1,5 @@
using mRemoteNG.Tools;
using mRemoteNG.Resources.Language;
namespace mRemoteNG.Connection.Protocol.RDP
{

View File

@@ -1,4 +1,5 @@
using mRemoteNG.Tools;
using mRemoteNG.Resources.Language;
namespace mRemoteNG.Connection.Protocol.RDP
{

View File

@@ -1,6 +1,7 @@
using System;
using System.Collections;
using mRemoteNG.App;
using mRemoteNG.Resources.Language;
namespace mRemoteNG.Connection.Protocol.RDP
{

View File

@@ -14,6 +14,7 @@ using mRemoteNG.UI;
using mRemoteNG.UI.Forms;
using mRemoteNG.UI.Tabs;
using MSTSCLib;
using mRemoteNG.Resources.Language;
namespace mRemoteNG.Connection.Protocol.RDP
{
@@ -286,6 +287,11 @@ namespace mRemoteNG.Connection.Protocol.RDP
_alertOnIdleDisconnect = connectionInfo.RDPAlertIdleTimeout;
_rdpClient.AdvancedSettings2.MinutesToIdleTimeout = connectionInfo.RDPMinutesToIdleTimeout;
#region Remote Desktop Services
_rdpClient.SecuredSettings2.StartProgram = connectionInfo.StartProgram;
_rdpClient.SecuredSettings2.WorkDir = connectionInfo.StartProgramWorkDir;
#endregion
//not user changeable
_rdpClient.AdvancedSettings2.GrabFocusOnConnect = true;
_rdpClient.AdvancedSettings3.EnableAutoReconnect = true;
@@ -296,8 +302,6 @@ namespace mRemoteNG.Connection.Protocol.RDP
_rdpClient.AdvancedSettings2.overallConnectionTimeout = Settings.Default.ConRDPOverallConnectionTimeout;
_rdpClient.SecuredSettings2.StartProgram = connectionInfo.StartProgram;
_rdpClient.AdvancedSettings2.BitmapPeristence = Convert.ToInt32(connectionInfo.CacheBitmaps);
if (_rdpVersion >= Versions.RDC61)
{
@@ -460,6 +464,20 @@ namespace mRemoteNG.Connection.Protocol.RDP
var password = connectionInfo?.Password ?? "";
var domain = connectionInfo?.Domain ?? "";
// access secret server api if necessary
if (userName.StartsWith("SSAPI:"))
{
try
{
ExternalConnectors.TSS.SecretServerInterface.FetchSecretFromServer(userName, out userName, out password, out domain);
}
catch (Exception ex)
{
Event_ErrorOccured(this, "Secret Server Interface Error: " + ex.Message, 0);
}
}
if (string.IsNullOrEmpty(userName))
{
if (Settings.Default.EmptyCredentials == "windows")

View File

@@ -3,6 +3,7 @@ using mRemoteNG.App;
using MSTSCLib;
using System;
using System.Windows.Forms;
using mRemoteNG.Resources.Language;
namespace mRemoteNG.Connection.Protocol.RDP
{

View File

@@ -5,6 +5,7 @@ using AxMSTSCLib;
using mRemoteNG.App;
using mRemoteNG.Messages;
using MSTSCLib;
using mRemoteNG.Resources.Language;
namespace mRemoteNG.Connection.Protocol.RDP
{

View File

@@ -5,33 +5,18 @@ using System.Net.Sockets;
using mRemoteNG.App;
using mRemoteNG.Tools;
using mRemoteNG.UI.Forms;
using mRemoteNG.Resources.Language;
// ReSharper disable ArrangeAccessorOwnerBody
namespace mRemoteNG.Connection.Protocol.VNC
{
public class ProtocolVNC : ProtocolBase, ISupportsViewOnly
public class ProtocolVNC : ProtocolBase
{
#region Properties
public bool SmartSize
{
get => _vnc.Scaled;
set => _vnc.Scaled = value;
}
public bool ViewOnly
{
get => _vnc.ViewOnly;
set => _vnc.ViewOnly = value;
}
#endregion
#region Private Declarations
private VncSharp.RemoteDesktop _vnc;
private VncSharpCore.RemoteDesktop _vnc;
private ConnectionInfo _info;
private static bool _isConnectionSuccessful;
private static Exception _socketexception;
@@ -43,7 +28,7 @@ namespace mRemoteNG.Connection.Protocol.VNC
public ProtocolVNC()
{
Control = new VncSharp.RemoteDesktop();
Control = new VncSharpCore.RemoteDesktop();
}
public override bool Initialize()
@@ -52,7 +37,7 @@ namespace mRemoteNG.Connection.Protocol.VNC
try
{
_vnc = (VncSharp.RemoteDesktop)Control;
_vnc = (VncSharpCore.RemoteDesktop)Control;
_info = InterfaceControl.Info;
_vnc.VncPort = _info.Port;
@@ -108,10 +93,10 @@ namespace mRemoteNG.Connection.Protocol.VNC
switch (Keys)
{
case SpecialKeys.CtrlAltDel:
_vnc.SendSpecialKeys(VncSharp.SpecialKeys.CtrlAltDel);
_vnc.SendSpecialKeys(VncSharpCore.SpecialKeys.CtrlAltDel);
break;
case SpecialKeys.CtrlEsc:
_vnc.SendSpecialKeys(VncSharp.SpecialKeys.CtrlEsc);
_vnc.SendSpecialKeys(VncSharpCore.SpecialKeys.CtrlEsc);
break;
}
}
@@ -123,36 +108,6 @@ namespace mRemoteNG.Connection.Protocol.VNC
}
}
public void ToggleSmartSize()
{
try
{
SmartSize = !SmartSize;
RefreshScreen();
}
catch (Exception ex)
{
Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg,
Language.VncToggleSmartSizeFailed + Environment.NewLine +
ex.Message, true);
}
}
public void ToggleViewOnly()
{
try
{
ViewOnly = !ViewOnly;
}
catch (Exception ex)
{
Runtime.MessageCollector.AddMessage(Messages.MessageClass.ErrorMsg,
Language.VncToggleViewOnlyFailed + Environment.NewLine +
ex.Message, true);
}
}
public void StartChat()
{
throw new NotImplementedException();

View File

@@ -1,5 +1,6 @@
using System.ComponentModel;
using mRemoteNG.Tools;
using mRemoteNG.Resources.Language;
namespace mRemoteNG.Connection.Protocol.VNC
{

View File

@@ -1,4 +1,4 @@
using mRemoteNG.App;
using mRemoteNG.App;
using mRemoteNG.Messages;
using mRemoteNG.Tools;
using System;
@@ -6,6 +6,7 @@ using System.ComponentModel;
using mRemoteNG.Connection.Protocol;
using mRemoteNG.Tree;
using mRemoteNG.Tree.Root;
using mRemoteNG.Resources.Language;
namespace mRemoteNG.Connection

View File

@@ -1,4 +1,5 @@
using mRemoteNG.Connection.Protocol;
using mRemoteNG.Resources.Language;
namespace mRemoteNG.Connection
{

View File

@@ -3,6 +3,7 @@ using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
using mRemoteNG.Tree;
using mRemoteNG.Resources.Language;
namespace mRemoteNG.Credential

View File

@@ -3,6 +3,7 @@ using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Security;
using mRemoteNG.Resources.Language;
namespace mRemoteNG.Credential
{

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,82 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="PropertyDescriptionColors" xml:space="preserve">
<value>Valitse käytettävä värilaatu.</value>
</data>
<data name="Colors" xml:space="preserve">
<value>Värit</value>
</data>
<data name="Rdp16777216Colors" xml:space="preserve">
<value>16777216 Värit (24-bit)</value>
</data>
<data name="Rdp256Colors" xml:space="preserve">
<value>256 Värit (8-bit)</value>
</data>
<data name="Rdp32768Colors" xml:space="preserve">
<value>32768 Värit (15-bit)</value>
</data>
<data name="Rdp4294967296Colors" xml:space="preserve">
<value>16777216 Värit (32-bit)</value>
</data>
<data name="Rdp65536Colors" xml:space="preserve">
<value>65536 Värit (16-bit)</value>
</data>
</root>

File diff suppressed because it is too large Load Diff

View File

@@ -1313,7 +1313,7 @@ If you run into such an error, please create a new connection file!</value>
<value>Creating quick connect failed</value>
</data>
<data name="_CloseWarnAll" xml:space="preserve">
<value>&amp;Warn me when closing connections</value>
<value>Warn me when closing connections</value>
</data>
<data name="RadioCloseWarnExit" xml:space="preserve">
<value>Warn me only when e&amp;xiting mRemoteNG</value>
@@ -1483,8 +1483,35 @@ If you run into such an error, please create a new connection file!</value>
<data name="SaveConnectionsFileBeforeOpeningAnother" xml:space="preserve">
<value>Do you want to save the current connections file before loading another?</value>
</data>
<data name="SaveConsOnExit" xml:space="preserve">
<value>Save connections on exit</value>
<data name="ConnectionsBackupFrequencyDaily" xml:space="preserve">
<value>Daily</value>
</data>
<data name="strConnectionBackupFrequency" xml:space="preserve">
<value>Connection Backup Frequency</value>
</data>
<data name="ConnectionsBackupFrequencyWeekly" xml:space="preserve">
<value>Weekly</value>
</data>
<data name="strConnectionsBackupMaxCount" xml:space="preserve">
<value>Maximum number of backups</value>
</data>
<data name="strConnectionsBackupPath" xml:space="preserve">
<value>Location of connection file backup</value>
</data>
<data name="ConnectionsBackupFrequencyOnEdit" xml:space="preserve">
<value>On Edit</value>
</data>
<data name="ConnectionsBackupFrequencyOnExit" xml:space="preserve">
<value>On Exit</value>
</data>
<data name="ConnectionsBackupFrequencyNever" xml:space="preserve">
<value>Never backup connections</value>
</data>
<data name="strBrowse" xml:space="preserve">
<value>Browse...</value>
</data>
<data name="strBackup" xml:space="preserve">
<value>Backup</value>
</data>
<data name="SaveImageFilter" xml:space="preserve">
<value>Graphics Interchange Format File (.gif)|*.gif|Joint Photographic Experts Group File (.jpeg)|*.jpeg|Joint Photographic Experts Group File (.jpg)|*.jpg|Portable Network Graphics File (.png)|*.png</value>
@@ -1834,7 +1861,6 @@ mRemoteNG will now quit and begin with the installation.</value>
</data>
<data name="CredentialUnavailable" xml:space="preserve">
<value>Credential not available</value>
</data>
<data name="OptionsThemeDeleteConfirmation" xml:space="preserve">
<value>Do you really want to delete the theme?</value>
@@ -2141,14 +2167,25 @@ Nightly Channel includes Alphas, Betas &amp; Release Candidates.</value>
<data name="ShowHideMenu" xml:space="preserve">
<value>Show/Hide Menu Strip</value>
</data>
<data name="PropertyDescriptionStartProgram" xml:space="preserve">
<value>Start Program/alternate shell</value>
<data name="PropertyDescriptionRDPStartProgram" xml:space="preserve">
<value>The program to be started on the remote server upon connection.</value>
</data>
<data name="StartProgram" xml:space="preserve">
<value>Start Program</value>
<data name="PropertyDescriptionRDPStartProgramWorkDir" xml:space="preserve">
<value>Specifies the working directory of the alternate shell.</value>
</data>
<data name="WebView2InitializationFailed" xml:space="preserve">
<value>WebView2 creation failed with exception</value>
<data name="RDPStartProgram" xml:space="preserve">
<value>Alternate Shell</value>
<comment>https://docs.microsoft.com/en-us/windows/win32/termserv/imstscsecuredsettings-startprogram</comment>
</data>
<data name="RDPStartProgramWorkDir" xml:space="preserve">
<value>Alternate shell working directory</value>
<comment>https://docs.microsoft.com/en-us/windows/win32/termserv/imstscsecuredsettings-workdir</comment>
</data>
<data name="RedirectDrives" xml:space="preserve">
<value>Disk Drives</value>
</data>
<data name="RedirectSmartCards" xml:space="preserve">
<value>Smart Cards</value>
</data>
<data name="ApplyInheritanceToChildren" xml:space="preserve">
<value>Apply inheritance to children</value>
@@ -2159,4 +2196,7 @@ Nightly Channel includes Alphas, Betas &amp; Release Candidates.</value>
<data name="SmartCard" xml:space="preserve">
<value>SmartCard</value>
</data>
<data name="RemoteDesktopServices" xml:space="preserve">
<value>Remote Desktop Services</value>
</data>
</root>

View File

@@ -1,5 +1,6 @@
using System;
using System.Windows.Forms;
using mRemoteNG.Resources.Language;
namespace mRemoteNG.Messages.MessageWriters
{

View File

@@ -1,36 +0,0 @@
using System.Reflection;
using System.Resources;
using System.Runtime.InteropServices;
// General Information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
// Review the values of the assembly attributes
[assembly: AssemblyTitle("mRemoteNG")]
[assembly: AssemblyDescription("Multi-protocol remote connections manager")]
[assembly: AssemblyCompany("mRemoteNG")]
[assembly: AssemblyProduct("mRemoteNG")]
[assembly: AssemblyCopyright("2020 mRemoteNG Dev Team, 2010-2013 Riley McArdle, 2007-2009 Felix Deimel")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
//The following GUID is for the ID of the typelib if this project is exposed to COM
[assembly: Guid("A99669B2-FAEB-11DE-995A-826C56D89593")]
// Version information for an assembly consists of the following four values:
//
// Major Version
// Minor Version
// Build Number
// Revision
//
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
// <Assembly: AssemblyVersion("1.0.*")>
[assembly: AssemblyVersion("1.77.2.*")]
[assembly: NeutralResourcesLanguage("en")]

View File

@@ -1,10 +1,10 @@
//------------------------------------------------------------------------------
// <auto-generated>
// Dieser Code wurde von einem Tool generiert.
// Laufzeitversion:4.0.30319.42000
// This code was generated by a tool.
// Runtime Version:4.0.30319.42000
//
// Änderungen an dieser Datei können falsches Verhalten verursachen und gehen verloren, wenn
// der Code erneut generiert wird.
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
@@ -13,13 +13,13 @@ namespace mRemoteNG.Properties {
/// <summary>
/// Eine stark typisierte Ressourcenklasse zum Suchen von lokalisierten Zeichenfolgen usw.
/// A strongly-typed resource class, for looking up localized strings, etc.
/// </summary>
// Diese Klasse wurde von der StronglyTypedResourceBuilder automatisch generiert
// -Klasse über ein Tool wie ResGen oder Visual Studio automatisch generiert.
// Um einen Member hinzuzufügen oder zu entfernen, bearbeiten Sie die .ResX-Datei und führen dann ResGen
// mit der /str-Option erneut aus, oder Sie erstellen Ihr VS-Projekt neu.
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")]
// This class was auto-generated by the StronglyTypedResourceBuilder
// class via a tool like ResGen or Visual Studio.
// To add or remove a member, edit your .ResX file then rerun ResGen
// with the /str option, or rebuild your VS project.
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
internal class Resources {
@@ -33,7 +33,7 @@ namespace mRemoteNG.Properties {
}
/// <summary>
/// Gibt die zwischengespeicherte ResourceManager-Instanz zurück, die von dieser Klasse verwendet wird.
/// Returns the cached ResourceManager instance used by this class.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Resources.ResourceManager ResourceManager {
@@ -47,8 +47,8 @@ namespace mRemoteNG.Properties {
}
/// <summary>
/// Überschreibt die CurrentUICulture-Eigenschaft des aktuellen Threads für alle
/// Ressourcenzuordnungen, die diese stark typisierte Ressourcenklasse verwenden.
/// Overrides the current thread's CurrentUICulture property for all
/// resource lookups using this strongly typed resource class.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Globalization.CultureInfo Culture {
@@ -61,7 +61,7 @@ namespace mRemoteNG.Properties {
}
/// <summary>
/// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap.
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap Add_16x {
get {
@@ -71,7 +71,7 @@ namespace mRemoteNG.Properties {
}
/// <summary>
/// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap.
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap AddFolder_16x {
get {
@@ -81,7 +81,7 @@ namespace mRemoteNG.Properties {
}
/// <summary>
/// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap.
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap AddItem_16x {
get {
@@ -91,7 +91,7 @@ namespace mRemoteNG.Properties {
}
/// <summary>
/// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap.
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap AppearanceEditor_16x {
get {
@@ -101,7 +101,7 @@ namespace mRemoteNG.Properties {
}
/// <summary>
/// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap.
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap ASPWebSite_16x {
get {
@@ -111,7 +111,18 @@ namespace mRemoteNG.Properties {
}
/// <summary>
/// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap.
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap DocumentsFolder_16x
{
get {
object obj = ResourceManager.GetObject("DocumentsFolder_16x", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap Close_16x {
get {
@@ -121,7 +132,7 @@ namespace mRemoteNG.Properties {
}
/// <summary>
/// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap.
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap CloseSolution_16x {
get {
@@ -131,7 +142,7 @@ namespace mRemoteNG.Properties {
}
/// <summary>
/// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap.
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap CollapseAll_16x {
get {
@@ -141,7 +152,7 @@ namespace mRemoteNG.Properties {
}
/// <summary>
/// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap.
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap ConnectedOverlay {
get {
@@ -151,7 +162,7 @@ namespace mRemoteNG.Properties {
}
/// <summary>
/// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap.
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap Console_16x {
get {
@@ -161,7 +172,7 @@ namespace mRemoteNG.Properties {
}
/// <summary>
/// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap.
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap Copy_16x {
get {
@@ -171,7 +182,7 @@ namespace mRemoteNG.Properties {
}
/// <summary>
/// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap.
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap Diagram_16x {
get {
@@ -181,7 +192,7 @@ namespace mRemoteNG.Properties {
}
/// <summary>
/// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap.
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap Disconnect_16x {
get {
@@ -191,7 +202,7 @@ namespace mRemoteNG.Properties {
}
/// <summary>
/// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap.
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap Document_16x {
get {
@@ -201,7 +212,7 @@ namespace mRemoteNG.Properties {
}
/// <summary>
/// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap.
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap ExpandAll_16x {
get {
@@ -211,7 +222,7 @@ namespace mRemoteNG.Properties {
}
/// <summary>
/// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap.
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap ExpandDown_16x {
get {
@@ -221,7 +232,7 @@ namespace mRemoteNG.Properties {
}
/// <summary>
/// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap.
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap Export_16x {
get {
@@ -231,7 +242,7 @@ namespace mRemoteNG.Properties {
}
/// <summary>
/// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap.
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap ExtendedProperty_16x {
get {
@@ -241,7 +252,7 @@ namespace mRemoteNG.Properties {
}
/// <summary>
/// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap.
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap F1Help_16x {
get {
@@ -251,7 +262,7 @@ namespace mRemoteNG.Properties {
}
/// <summary>
/// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap.
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap Favorite_16x {
get {
@@ -261,7 +272,7 @@ namespace mRemoteNG.Properties {
}
/// <summary>
/// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap.
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap FolderClosed_16x {
get {
@@ -271,7 +282,7 @@ namespace mRemoteNG.Properties {
}
/// <summary>
/// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap.
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap FullScreen_16x {
get {
@@ -281,7 +292,7 @@ namespace mRemoteNG.Properties {
}
/// <summary>
/// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap.
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap GlyphDown_16x {
get {
@@ -291,7 +302,7 @@ namespace mRemoteNG.Properties {
}
/// <summary>
/// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap.
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap GlyphLeft_16x {
get {
@@ -301,7 +312,7 @@ namespace mRemoteNG.Properties {
}
/// <summary>
/// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap.
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap GlyphRight_16x {
get {
@@ -311,7 +322,7 @@ namespace mRemoteNG.Properties {
}
/// <summary>
/// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap.
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap GlyphUp_16x {
get {
@@ -321,7 +332,7 @@ namespace mRemoteNG.Properties {
}
/// <summary>
/// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap.
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap Header_dark {
get {
@@ -331,7 +342,7 @@ namespace mRemoteNG.Properties {
}
/// <summary>
/// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap.
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap HostStatus_Check {
get {
@@ -341,7 +352,7 @@ namespace mRemoteNG.Properties {
}
/// <summary>
/// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap.
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap HostStatus_Off {
get {
@@ -351,7 +362,7 @@ namespace mRemoteNG.Properties {
}
/// <summary>
/// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap.
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap HostStatus_On {
get {
@@ -361,7 +372,7 @@ namespace mRemoteNG.Properties {
}
/// <summary>
/// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap.
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap InsertPanel_16x {
get {
@@ -371,7 +382,7 @@ namespace mRemoteNG.Properties {
}
/// <summary>
/// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap.
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap Key_16x {
get {
@@ -381,7 +392,7 @@ namespace mRemoteNG.Properties {
}
/// <summary>
/// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap.
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap Loading_Spinner {
get {
@@ -391,7 +402,7 @@ namespace mRemoteNG.Properties {
}
/// <summary>
/// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap.
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap Lock_16x {
get {
@@ -401,7 +412,7 @@ namespace mRemoteNG.Properties {
}
/// <summary>
/// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap.
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap LogError_16x {
get {
@@ -411,7 +422,7 @@ namespace mRemoteNG.Properties {
}
/// <summary>
/// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap.
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap LogWarning_16x {
get {
@@ -421,7 +432,7 @@ namespace mRemoteNG.Properties {
}
/// <summary>
/// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap.
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap Message_16x {
get {
@@ -431,7 +442,7 @@ namespace mRemoteNG.Properties {
}
/// <summary>
/// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap.
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap Monitor_16x {
get {
@@ -441,7 +452,7 @@ namespace mRemoteNG.Properties {
}
/// <summary>
/// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Icon ähnlich wie (Symbol).
/// Looks up a localized resource of type System.Drawing.Icon similar to (Icon).
/// </summary>
internal static System.Drawing.Icon mRemoteNG_Icon {
get {
@@ -451,14 +462,14 @@ namespace mRemoteNG.Properties {
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die &lt;Application xmlns:xsi=&apos;http://www.w3.org/2001/XMLSchema-instance&apos;&gt;
/// Looks up a localized string similar to &lt;Application xmlns:xsi=&apos;http://www.w3.org/2001/XMLSchema-instance&apos;&gt;
/// &lt;VisualElements
/// BackgroundColor=&apos;#343A40&apos;
/// ShowNameOnSquare150x150Logo=&apos;on&apos;
/// ForegroundText=&apos;light&apos;
/// Square150x150Logo=&apos;VisualElements_150.png&apos;
/// Square70x70Logo=&apos;VisualElements_70.png&apos; /&gt;
///&lt;/Application&gt; ähnelt.
///&lt;/Application&gt;.
/// </summary>
internal static string mRemoteNG_VisualElementsManifest {
get {
@@ -467,7 +478,7 @@ namespace mRemoteNG.Properties {
}
/// <summary>
/// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap.
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap NewFile_16x {
get {
@@ -477,7 +488,7 @@ namespace mRemoteNG.Properties {
}
/// <summary>
/// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap.
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap OpenFile_16x {
get {
@@ -487,7 +498,7 @@ namespace mRemoteNG.Properties {
}
/// <summary>
/// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap.
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap Panel_16x {
get {
@@ -497,7 +508,7 @@ namespace mRemoteNG.Properties {
}
/// <summary>
/// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap.
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap Property_16x {
get {
@@ -507,7 +518,7 @@ namespace mRemoteNG.Properties {
}
/// <summary>
/// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap.
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap PuttyConfig {
get {
@@ -517,7 +528,7 @@ namespace mRemoteNG.Properties {
}
/// <summary>
/// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap.
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap PuttySessions {
get {
@@ -527,7 +538,7 @@ namespace mRemoteNG.Properties {
}
/// <summary>
/// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap.
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap Refresh_16x {
get {
@@ -537,7 +548,7 @@ namespace mRemoteNG.Properties {
}
/// <summary>
/// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap.
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap Remove_16x {
get {
@@ -547,7 +558,7 @@ namespace mRemoteNG.Properties {
}
/// <summary>
/// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap.
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap Rename_16x {
get {
@@ -557,7 +568,7 @@ namespace mRemoteNG.Properties {
}
/// <summary>
/// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap.
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap Resize_16x {
get {
@@ -567,7 +578,7 @@ namespace mRemoteNG.Properties {
}
/// <summary>
/// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap.
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap Run_16x {
get {
@@ -577,7 +588,7 @@ namespace mRemoteNG.Properties {
}
/// <summary>
/// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap.
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap RunUpdate_16x {
get {
@@ -587,7 +598,7 @@ namespace mRemoteNG.Properties {
}
/// <summary>
/// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap.
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap Save_16x {
get {
@@ -597,7 +608,7 @@ namespace mRemoteNG.Properties {
}
/// <summary>
/// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap.
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap Schema_16x {
get {
@@ -607,7 +618,7 @@ namespace mRemoteNG.Properties {
}
/// <summary>
/// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap.
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap SchemaObjectProperty_16x {
get {
@@ -617,7 +628,7 @@ namespace mRemoteNG.Properties {
}
/// <summary>
/// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap.
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap Search_16x {
get {
@@ -627,7 +638,7 @@ namespace mRemoteNG.Properties {
}
/// <summary>
/// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap.
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap SearchAndApps_16x {
get {
@@ -637,7 +648,7 @@ namespace mRemoteNG.Properties {
}
/// <summary>
/// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap.
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap Settings_16x {
get {
@@ -647,7 +658,7 @@ namespace mRemoteNG.Properties {
}
/// <summary>
/// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap.
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap SortAscending_16x {
get {
@@ -657,7 +668,7 @@ namespace mRemoteNG.Properties {
}
/// <summary>
/// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap.
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap SortDescending_16x {
get {
@@ -667,7 +678,7 @@ namespace mRemoteNG.Properties {
}
/// <summary>
/// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap.
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap SQLDatabase_16x {
get {
@@ -677,7 +688,7 @@ namespace mRemoteNG.Properties {
}
/// <summary>
/// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap.
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap StartupProject_16x {
get {
@@ -687,7 +698,7 @@ namespace mRemoteNG.Properties {
}
/// <summary>
/// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap.
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap StatusInformation_16x {
get {
@@ -697,7 +708,7 @@ namespace mRemoteNG.Properties {
}
/// <summary>
/// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap.
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap Stop_16x {
get {
@@ -707,7 +718,7 @@ namespace mRemoteNG.Properties {
}
/// <summary>
/// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap.
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap SyncArrow_16x {
get {
@@ -717,7 +728,7 @@ namespace mRemoteNG.Properties {
}
/// <summary>
/// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap.
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap Tab_16x {
get {
@@ -727,7 +738,7 @@ namespace mRemoteNG.Properties {
}
/// <summary>
/// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap.
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap Test_16x {
get {
@@ -737,7 +748,7 @@ namespace mRemoteNG.Properties {
}
/// <summary>
/// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap.
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap ToggleOfficeKeyboardScheme_16x {
get {
@@ -747,7 +758,7 @@ namespace mRemoteNG.Properties {
}
/// <summary>
/// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap.
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap UIAboutBox_16x {
get {
@@ -757,7 +768,7 @@ namespace mRemoteNG.Properties {
}
/// <summary>
/// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap.
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap UniqueKeyError_16x {
get {
@@ -767,7 +778,7 @@ namespace mRemoteNG.Properties {
}
/// <summary>
/// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap.
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap ViewDownBySchema_16x {
get {
@@ -777,7 +788,7 @@ namespace mRemoteNG.Properties {
}
/// <summary>
/// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap.
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap VisualElements_150 {
get {
@@ -787,7 +798,7 @@ namespace mRemoteNG.Properties {
}
/// <summary>
/// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap.
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap VisualElements_70 {
get {

View File

@@ -112,12 +112,12 @@
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="ConnectedOverlay" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\ConnectedOverlay.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
@@ -337,4 +337,7 @@
<data name="Property_16x" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\Property_16x.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="DocumentsFolder_16x" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\DocumentsFolder_16x.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
</root>

View File

@@ -1,10 +1,10 @@
//------------------------------------------------------------------------------
// <auto-generated>
// Dieser Code wurde von einem Tool generiert.
// Laufzeitversion:4.0.30319.42000
// This code was generated by a tool.
// Runtime Version:4.0.30319.42000
//
// Änderungen an dieser Datei können falsches Verhalten verursachen und gehen verloren, wenn
// der Code erneut generiert wird.
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
@@ -12,7 +12,7 @@ namespace mRemoteNG.Properties {
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "16.10.0.0")]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "17.0.3.0")]
internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
@@ -2903,6 +2903,18 @@ namespace mRemoteNG.Properties {
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("0")]
public int SaveConnectionsFrequency {
get {
return ((int)(this["SaveConnectionsFrequency"]));
}
set {
this["SaveConnectionsFrequency"] = value;
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("Highest")]
@@ -3026,9 +3038,9 @@ namespace mRemoteNG.Properties {
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("False")]
public string StartupComponentsCheck {
public bool StartupComponentsCheck {
get {
return ((string)(this["StartupComponentsCheck"]));
return ((bool)(this["StartupComponentsCheck"]));
}
set {
this["StartupComponentsCheck"] = value;
@@ -3190,5 +3202,17 @@ namespace mRemoteNG.Properties {
this["ConDefaultRenderingEngine"] = value;
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("")]
public string OpeningCommand {
get {
return ((string)(this["OpeningCommand"]));
}
set {
this["OpeningCommand"] = value;
}
}
}
}

View File

@@ -1,5 +1,5 @@
<?xml version='1.0' encoding='utf-8'?>
<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)" GeneratedClassNamespace="mRemoteNG" GeneratedClassName="Settings" UseMySettingsClassName="true">
<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)" GeneratedClassNamespace="mRemoteNG.Properties" GeneratedClassName="Settings" UseMySettingsClassName="true">
<Profiles />
<Settings>
<Setting Name="MainFormLocation" Type="System.Drawing.Point" Scope="User">
@@ -722,6 +722,9 @@
<Setting Name="InhDefaultUseVmId" Type="System.Boolean" Scope="User">
<Value Profile="(Default)">False</Value>
</Setting>
<Setting Name="SaveConnectionsFrequency" Type="System.Int32" Scope="User">
<Value Profile="(Default)">0</Value>
</Setting>
<Setting Name="ConDefaultRdpVersion" Type="System.String" Scope="User">
<Value Profile="(Default)">Highest</Value>
</Setting>
@@ -752,7 +755,7 @@
<Setting Name="CloseToTray" Type="System.Boolean" Scope="User">
<Value Profile="(Default)">False</Value>
</Setting>
<Setting Name="StartupComponentsCheck" Type="System.String" Scope="User">
<Setting Name="StartupComponentsCheck" Type="System.Boolean" Scope="User">
<Value Profile="(Default)">False</Value>
</Setting>
<Setting Name="ConDefaultDisableFullWindowDrag" Type="System.Boolean" Scope="User">
@@ -794,5 +797,9 @@
<Setting Name="ConDefaultRenderingEngine" Type="System.String" Scope="User">
<Value Profile="(Default)">EdgeChromium</Value>
</Setting>
<Setting Name="OpeningCommand" Type="System.String" Scope="User">
<Value Profile="(Default)">
</Value>
</Setting>
</Settings>
</SettingsFile>

Binary file not shown.

After

Width:  |  Height:  |  Size: 313 B

View File

@@ -101,7 +101,6 @@
<xs:attribute name="RDGatewayUsername" type="xs:string" use="required" />
<xs:attribute name="RDGatewayPassword" type="xs:string" use="required" />
<xs:attribute name="RDGatewayDomain" type="xs:string" use="required" />
<xs:attribute name="StartProgram" type="xs:string" use="optional" />
<xs:attribute name="InheritCredentialRecord" type="xs:boolean" use="optional" />
<xs:attribute name="InheritCacheBitmaps" type="xs:boolean" use="optional" />
<xs:attribute name="InheritColors" type="xs:boolean" use="optional" />
@@ -170,5 +169,7 @@
<xs:attribute name="InheritRDGatewayUsername" type="xs:boolean" use="optional" />
<xs:attribute name="InheritRDGatewayPassword" type="xs:boolean" use="optional" />
<xs:attribute name="InheritRDGatewayDomain" type="xs:boolean" use="optional" />
<xs:attribute name="StartProgram" type="xs:string" use="optional" />
<xs:attribute name="StartProgramWorkDir" type="xs:string" use="optional" />
</xs:complexType>
</xs:schema>

View File

@@ -1,6 +1,7 @@
using System;
using System.Security;
using System.Text.RegularExpressions;
using mRemoteNG.Resources.Language;
namespace mRemoteNG.Security.PasswordCreation
{

View File

@@ -1,6 +1,7 @@
using System;
using System.Security;
using System.Text.RegularExpressions;
using mRemoteNG.Resources.Language;
namespace mRemoteNG.Security.PasswordCreation
{

View File

@@ -2,6 +2,7 @@
using System.Collections.Generic;
using System.Security;
using System.Text.RegularExpressions;
using mRemoteNG.Resources.Language;
namespace mRemoteNG.Security.PasswordCreation

View File

@@ -1,6 +1,7 @@
using System;
using System.Security;
using System.Text.RegularExpressions;
using mRemoteNG.Resources.Language;
namespace mRemoteNG.Security.PasswordCreation
{

View File

@@ -1,5 +1,6 @@
using System;
using System.Security;
using mRemoteNG.Resources.Language;
namespace mRemoteNG.Security.PasswordCreation

View File

@@ -1,4 +1,4 @@
/*
/*
* Initial work:
* This work (Modern Encryption of a String C#, by James Tuley),
* identified by James Tuley, is free of known copyright restrictions.
@@ -16,6 +16,7 @@ using Org.BouncyCastle.Crypto.Engines;
using Org.BouncyCastle.Crypto.Modes;
using Org.BouncyCastle.Crypto.Parameters;
using Org.BouncyCastle.Security;
using mRemoteNG.Resources.Language;
// ReSharper disable ArrangeAccessorOwnerBody

View File

@@ -1,10 +1,11 @@
using System;
using System;
using System.IO;
using System.Security;
using System.Security.Cryptography;
using System.Text;
using mRemoteNG.App;
using mRemoteNG.Messages;
using mRemoteNG.Resources.Language;
namespace mRemoteNG.Security.SymmetricEncryption
@@ -23,29 +24,24 @@ namespace mRemoteNG.Security.SymmetricEncryption
BlockSizeInBytes = 16;
}
public string Encrypt(string strToEncrypt, SecureString strSecret)
{
if (strToEncrypt == "" || strSecret.Length == 0)
if (string.IsNullOrWhiteSpace(strToEncrypt) || strSecret.Length == 0)
return strToEncrypt;
try
{
var rd = new RijndaelManaged();
var md5 = new MD5CryptoServiceProvider();
using var aes = Aes.Create();
using var md5 = MD5.Create();
var key = md5.ComputeHash(Encoding.UTF8.GetBytes(strSecret.ConvertToUnsecureString()));
md5.Clear();
rd.Key = key;
rd.GenerateIV();
aes.Key = key;
aes.GenerateIV();
var iv = rd.IV;
var ms = new MemoryStream();
using var ms = new MemoryStream(aes.IV);
ms.Write(iv, 0, iv.Length);
var cs = new CryptoStream(ms, rd.CreateEncryptor(), CryptoStreamMode.Write);
var cs = new CryptoStream(ms, aes.CreateEncryptor(), CryptoStreamMode.Write);
var data = Encoding.UTF8.GetBytes(strToEncrypt);
cs.Write(data, 0, data.Length);
@@ -53,7 +49,7 @@ namespace mRemoteNG.Security.SymmetricEncryption
var encdata = ms.ToArray();
cs.Close();
rd.Clear();
aes.Clear();
return Convert.ToBase64String(encdata);
}
@@ -73,31 +69,25 @@ namespace mRemoteNG.Security.SymmetricEncryption
try
{
var plaintext = "";
using (var rijndaelManaged = new RijndaelManaged())
{
using (var md5 = new MD5CryptoServiceProvider())
{
using var aes = Aes.Create();
using var md5 = MD5.Create();
var key = md5.ComputeHash(Encoding.UTF8.GetBytes(password.ConvertToUnsecureString()));
rijndaelManaged.Key = key;
}
md5.Clear();
aes.Key = key;
var ciphertext = Convert.FromBase64String(ciphertextBase64);
var memoryStream = new MemoryStream(ciphertext);
var iv = new byte[BlockSizeInBytes];
memoryStream.Read(iv, 0, iv.Length);
rijndaelManaged.IV = iv;
using var ms = new MemoryStream(ciphertext);
var cryptoStream = new CryptoStream(memoryStream, rijndaelManaged.CreateDecryptor(),
CryptoStreamMode.Read);
using (var streamReader = new StreamReader(cryptoStream, Encoding.UTF8, true))
{
plaintext = streamReader.ReadToEnd();
rijndaelManaged.Clear();
}
} // rijndaelManaged
var iv = new byte[BlockSizeInBytes];
ms.Read(iv, 0, iv.Length);
aes.IV = iv;
using var cryptoStream = new CryptoStream(ms, aes.CreateDecryptor(), CryptoStreamMode.Read);
using var streamReader = new StreamReader(cryptoStream, Encoding.UTF8, true);
var plaintext = streamReader.ReadToEnd();
aes.Clear();
return plaintext;
}

View File

@@ -1,22 +1,25 @@
//------------------------------------------------------------------------------
// <auto-generated>
// Dieser Code wurde von einem Tool generiert.
// Laufzeitversion:4.0.30319.42000
// This code was generated by a tool.
// Runtime Version:4.0.30319.42000
//
// Änderungen an dieser Datei können falsches Verhalten verursachen und gehen verloren, wenn
// der Code erneut generiert wird.
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace mRemoteNG.Themes {
namespace mRemoteNG {
using System;
/// <summary>
/// Eine stark typisierte Ressourcenklasse zum Suchen von lokalisierten Zeichenfolgen usw.
/// A strongly-typed resource class, for looking up localized strings, etc.
/// </summary>
// Diese Klasse wurde von der StronglyTypedResourceBuilder automatisch generiert
// -Klasse über ein Tool wie ResGen oder Visual Studio automatisch generiert.
// Um einen Member hinzuzufügen oder zu entfernen, bearbeiten Sie die .ResX-Datei und führen dann ResGen
// mit der /str-Option erneut aus, oder Sie erstellen Ihr VS-Projekt neu.
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")]
// This class was auto-generated by the StronglyTypedResourceBuilder
// class via a tool like ResGen or Visual Studio.
// To add or remove a member, edit your .ResX file then rerun ResGen
// with the /str option, or rebuild your VS project.
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
internal class ColorMapTheme {
@@ -30,7 +33,7 @@ namespace mRemoteNG.Themes {
}
/// <summary>
/// Gibt die zwischengespeicherte ResourceManager-Instanz zurück, die von dieser Klasse verwendet wird.
/// Returns the cached ResourceManager instance used by this class.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Resources.ResourceManager ResourceManager {
@@ -44,8 +47,8 @@ namespace mRemoteNG.Themes {
}
/// <summary>
/// Überschreibt die CurrentUICulture-Eigenschaft des aktuellen Threads für alle
/// Ressourcenzuordnungen, die diese stark typisierte Ressourcenklasse verwenden.
/// Overrides the current thread's CurrentUICulture property for all
/// resource lookups using this strongly typed resource class.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Globalization.CultureInfo Culture {
@@ -58,7 +61,7 @@ namespace mRemoteNG.Themes {
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die /Themes/Theme/Category[@Name=&apos;CommonControls&apos;]/Color[@Name=&apos;Button&apos;]/Background/@Source ähnelt.
/// Looks up a localized string similar to /Themes/Theme/Category[@Name=&apos;CommonControls&apos;]/Color[@Name=&apos;Button&apos;]/Background/@Source.
/// </summary>
internal static string Button_Background {
get {
@@ -67,7 +70,7 @@ namespace mRemoteNG.Themes {
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die /Themes/Theme/Category[@Name=&apos;CommonControls&apos;]/Color[@Name=&apos;ButtonBorder&apos;]/Background/@Source ähnelt.
/// Looks up a localized string similar to /Themes/Theme/Category[@Name=&apos;CommonControls&apos;]/Color[@Name=&apos;ButtonBorder&apos;]/Background/@Source.
/// </summary>
internal static string Button_Border {
get {
@@ -76,7 +79,7 @@ namespace mRemoteNG.Themes {
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die /Themes/Theme/Category[@Name=&apos;CommonControls&apos;]/Color[@Name=&apos;ButtonDisabled&apos;]/Background/@Source ähnelt.
/// Looks up a localized string similar to /Themes/Theme/Category[@Name=&apos;CommonControls&apos;]/Color[@Name=&apos;ButtonDisabled&apos;]/Background/@Source.
/// </summary>
internal static string Button_Disabled_Background {
get {
@@ -85,7 +88,7 @@ namespace mRemoteNG.Themes {
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die /Themes/Theme/Category[@Name=&apos;CommonControls&apos;]/Color[@Name=&apos;ButtonBorderDisabled&apos;]/Background/@Source ähnelt.
/// Looks up a localized string similar to /Themes/Theme/Category[@Name=&apos;CommonControls&apos;]/Color[@Name=&apos;ButtonBorderDisabled&apos;]/Background/@Source.
/// </summary>
internal static string Button_Disabled_Border {
get {
@@ -94,7 +97,7 @@ namespace mRemoteNG.Themes {
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die /Themes/Theme/Category[@Name=&apos;CommonControls&apos;]/Color[@Name=&apos;ButtonDisabled&apos;]/Foreground/@Source ähnelt.
/// Looks up a localized string similar to /Themes/Theme/Category[@Name=&apos;CommonControls&apos;]/Color[@Name=&apos;ButtonDisabled&apos;]/Foreground/@Source.
/// </summary>
internal static string Button_Disabled_Foreground {
get {
@@ -103,7 +106,7 @@ namespace mRemoteNG.Themes {
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die /Themes/Theme/Category[@Name=&apos;CommonControls&apos;]/Color[@Name=&apos;Button&apos;]/Foreground/@Source ähnelt.
/// Looks up a localized string similar to /Themes/Theme/Category[@Name=&apos;CommonControls&apos;]/Color[@Name=&apos;Button&apos;]/Foreground/@Source.
/// </summary>
internal static string Button_Foreground {
get {
@@ -112,7 +115,7 @@ namespace mRemoteNG.Themes {
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die /Themes/Theme/Category[@Name=&apos;CommonControls&apos;]/Color[@Name=&apos;ButtonHover&apos;]/Background/@Source ähnelt.
/// Looks up a localized string similar to /Themes/Theme/Category[@Name=&apos;CommonControls&apos;]/Color[@Name=&apos;ButtonHover&apos;]/Background/@Source.
/// </summary>
internal static string Button_Hover_Background {
get {
@@ -121,7 +124,7 @@ namespace mRemoteNG.Themes {
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die /Themes/Theme/Category[@Name=&apos;CommonControls&apos;]/Color[@Name=&apos;ButtonBorderHover&apos;]/Background/@Source ähnelt.
/// Looks up a localized string similar to /Themes/Theme/Category[@Name=&apos;CommonControls&apos;]/Color[@Name=&apos;ButtonBorderHover&apos;]/Background/@Source.
/// </summary>
internal static string Button_Hover_Border {
get {
@@ -130,7 +133,7 @@ namespace mRemoteNG.Themes {
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die /Themes/Theme/Category[@Name=&apos;CommonControls&apos;]/Color[@Name=&apos;ButtonHover&apos;]/Foreground/@Source ähnelt.
/// Looks up a localized string similar to /Themes/Theme/Category[@Name=&apos;CommonControls&apos;]/Color[@Name=&apos;ButtonHover&apos;]/Foreground/@Source.
/// </summary>
internal static string Button_Hover_Foreground {
get {
@@ -139,7 +142,7 @@ namespace mRemoteNG.Themes {
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die /Themes/Theme/Category[@Name=&apos;CommonControls&apos;]/Color[@Name=&apos;ButtonPressed&apos;]/Background/@Source ähnelt.
/// Looks up a localized string similar to /Themes/Theme/Category[@Name=&apos;CommonControls&apos;]/Color[@Name=&apos;ButtonPressed&apos;]/Background/@Source.
/// </summary>
internal static string Button_Pressed_Background {
get {
@@ -148,7 +151,7 @@ namespace mRemoteNG.Themes {
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die /Themes/Theme/Category[@Name=&apos;CommonControls&apos;]/Color[@Name=&apos;ButtonBorderPressed&apos;]/Background/@Source ähnelt.
/// Looks up a localized string similar to /Themes/Theme/Category[@Name=&apos;CommonControls&apos;]/Color[@Name=&apos;ButtonBorderPressed&apos;]/Background/@Source.
/// </summary>
internal static string Button_Pressed_Border {
get {
@@ -157,7 +160,7 @@ namespace mRemoteNG.Themes {
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die /Themes/Theme/Category[@Name=&apos;CommonControls&apos;]/Color[@Name=&apos;ButtonPressed&apos;]/Foreground/@Source ähnelt.
/// Looks up a localized string similar to /Themes/Theme/Category[@Name=&apos;CommonControls&apos;]/Color[@Name=&apos;ButtonPressed&apos;]/Foreground/@Source.
/// </summary>
internal static string Button_Pressed_Foreground {
get {
@@ -166,7 +169,7 @@ namespace mRemoteNG.Themes {
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die /Themes/Theme/Category[@Name=&apos;CommonControls&apos;]/Color[@Name=&apos;CheckBoxBackground&apos;]/Background/@Source ähnelt.
/// Looks up a localized string similar to /Themes/Theme/Category[@Name=&apos;CommonControls&apos;]/Color[@Name=&apos;CheckBoxBackground&apos;]/Background/@Source.
/// </summary>
internal static string CheckBox_Background {
get {
@@ -175,7 +178,7 @@ namespace mRemoteNG.Themes {
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die /Themes/Theme/Category[@Name=&apos;CommonControls&apos;]/Color[@Name=&apos;CheckBoxBorder&apos;]/Background/@Source ähnelt.
/// Looks up a localized string similar to /Themes/Theme/Category[@Name=&apos;CommonControls&apos;]/Color[@Name=&apos;CheckBoxBorder&apos;]/Background/@Source.
/// </summary>
internal static string CheckBox_Border {
get {
@@ -184,7 +187,7 @@ namespace mRemoteNG.Themes {
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die /Themes/Theme/Category[@Name=&apos;CommonControls&apos;]/Color[@Name=&apos;CheckBoxBorderDisabled&apos;]/Background/@Source ähnelt.
/// Looks up a localized string similar to /Themes/Theme/Category[@Name=&apos;CommonControls&apos;]/Color[@Name=&apos;CheckBoxBorderDisabled&apos;]/Background/@Source.
/// </summary>
internal static string CheckBox_Border_Disabled {
get {
@@ -193,7 +196,7 @@ namespace mRemoteNG.Themes {
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die /Themes/Theme/Category[@Name=&apos;CommonControls&apos;]/Color[@Name=&apos;CheckBoxBorderHover&apos;]/Background/@Source ähnelt.
/// Looks up a localized string similar to /Themes/Theme/Category[@Name=&apos;CommonControls&apos;]/Color[@Name=&apos;CheckBoxBorderHover&apos;]/Background/@Source.
/// </summary>
internal static string CheckBox_Border_Hover {
get {
@@ -202,7 +205,7 @@ namespace mRemoteNG.Themes {
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die /Themes/Theme/Category[@Name=&apos;CommonControls&apos;]/Color[@Name=&apos;CheckBoxBorderPressed&apos;]/Background/@Source ähnelt.
/// Looks up a localized string similar to /Themes/Theme/Category[@Name=&apos;CommonControls&apos;]/Color[@Name=&apos;CheckBoxBorderPressed&apos;]/Background/@Source.
/// </summary>
internal static string CheckBox_Border_Pressed {
get {
@@ -211,7 +214,7 @@ namespace mRemoteNG.Themes {
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die /Themes/Theme/Category[@Name=&apos;CommonControls&apos;]/Color[@Name=&apos;CheckBoxGlyph&apos;]/Background/@Source ähnelt.
/// Looks up a localized string similar to /Themes/Theme/Category[@Name=&apos;CommonControls&apos;]/Color[@Name=&apos;CheckBoxGlyph&apos;]/Background/@Source.
/// </summary>
internal static string CheckBox_Glyph {
get {
@@ -220,7 +223,7 @@ namespace mRemoteNG.Themes {
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die /Themes/Theme/Category[@Name=&apos;CommonControls&apos;]/Color[@Name=&apos;CheckBoxGlyphDisabled&apos;]/Background/@Source ähnelt.
/// Looks up a localized string similar to /Themes/Theme/Category[@Name=&apos;CommonControls&apos;]/Color[@Name=&apos;CheckBoxGlyphDisabled&apos;]/Background/@Source.
/// </summary>
internal static string CheckBox_Glyph_Disabled {
get {
@@ -229,7 +232,7 @@ namespace mRemoteNG.Themes {
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die /Themes/Theme/Category[@Name=&apos;CommonControls&apos;]/Color[@Name=&apos;CheckBoxText&apos;]/Background/@Source ähnelt.
/// Looks up a localized string similar to /Themes/Theme/Category[@Name=&apos;CommonControls&apos;]/Color[@Name=&apos;CheckBoxText&apos;]/Background/@Source.
/// </summary>
internal static string CheckBox_Text {
get {
@@ -238,7 +241,7 @@ namespace mRemoteNG.Themes {
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die /Themes/Theme/Category[@Name=&apos;CommonControls&apos;]/Color[@Name=&apos;CheckBoxTextDisabled&apos;]/Background/@Source ähnelt.
/// Looks up a localized string similar to /Themes/Theme/Category[@Name=&apos;CommonControls&apos;]/Color[@Name=&apos;CheckBoxTextDisabled&apos;]/Background/@Source.
/// </summary>
internal static string CheckBox_Text_Disabled {
get {
@@ -247,7 +250,7 @@ namespace mRemoteNG.Themes {
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die /Themes/Theme/Category[@Name=&apos;Cider&apos;]/Color[@Name=&apos;ComboBox&apos;]/Background/@Source ähnelt.
/// Looks up a localized string similar to /Themes/Theme/Category[@Name=&apos;Cider&apos;]/Color[@Name=&apos;ComboBox&apos;]/Background/@Source.
/// </summary>
internal static string ComboBox_Background {
get {
@@ -256,7 +259,7 @@ namespace mRemoteNG.Themes {
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die /Themes/Theme/Category[@Name=&apos;Cider&apos;]/Color[@Name=&apos;ComboBoxBorder&apos;]/Background/@Source ähnelt.
/// Looks up a localized string similar to /Themes/Theme/Category[@Name=&apos;Cider&apos;]/Color[@Name=&apos;ComboBoxBorder&apos;]/Background/@Source.
/// </summary>
internal static string ComboBox_Border {
get {
@@ -265,7 +268,7 @@ namespace mRemoteNG.Themes {
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die /Themes/Theme/Category[@Name=&apos;Cider&apos;]/Color[@Name=&apos;ComboBoxButton&apos;]/Background/@Source ähnelt.
/// Looks up a localized string similar to /Themes/Theme/Category[@Name=&apos;Cider&apos;]/Color[@Name=&apos;ComboBoxButton&apos;]/Background/@Source.
/// </summary>
internal static string ComboBox_Button_Background {
get {
@@ -274,7 +277,7 @@ namespace mRemoteNG.Themes {
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die /Themes/Theme/Category[@Name=&apos;Cider&apos;]/Color[@Name=&apos;ComboBoxButtonBorder&apos;]/Background/@Source ähnelt.
/// Looks up a localized string similar to /Themes/Theme/Category[@Name=&apos;Cider&apos;]/Color[@Name=&apos;ComboBoxButtonBorder&apos;]/Background/@Source.
/// </summary>
internal static string ComboBox_Button_Border {
get {
@@ -283,7 +286,7 @@ namespace mRemoteNG.Themes {
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die /Themes/Theme/Category[@Name=&apos;Cider&apos;]/Color[@Name=&apos;ComboBoxButton&apos;]/Foreground/@Source ähnelt.
/// Looks up a localized string similar to /Themes/Theme/Category[@Name=&apos;Cider&apos;]/Color[@Name=&apos;ComboBoxButton&apos;]/Foreground/@Source.
/// </summary>
internal static string ComboBox_Button_Foreground {
get {
@@ -292,7 +295,7 @@ namespace mRemoteNG.Themes {
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die /Themes/Theme/Category[@Name=&apos;Cider&apos;]/Color[@Name=&apos;ComboBoxButtonMouseOver&apos;]/Background/@Source ähnelt.
/// Looks up a localized string similar to /Themes/Theme/Category[@Name=&apos;Cider&apos;]/Color[@Name=&apos;ComboBoxButtonMouseOver&apos;]/Background/@Source.
/// </summary>
internal static string ComboBox_Button_MouseOver_Background {
get {
@@ -301,7 +304,7 @@ namespace mRemoteNG.Themes {
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die /Themes/Theme/Category[@Name=&apos;Cider&apos;]/Color[@Name=&apos;ComboBoxButtonMouseOverBorder&apos;]/Background/@Source ähnelt.
/// Looks up a localized string similar to /Themes/Theme/Category[@Name=&apos;Cider&apos;]/Color[@Name=&apos;ComboBoxButtonMouseOverBorder&apos;]/Background/@Source.
/// </summary>
internal static string ComboBox_Button_MouseOver_Border {
get {
@@ -310,7 +313,7 @@ namespace mRemoteNG.Themes {
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die /Themes/Theme/Category[@Name=&apos;Cider&apos;]/Color[@Name=&apos;ComboBoxButtonMouseOver&apos;]/Foreground/@Source ähnelt.
/// Looks up a localized string similar to /Themes/Theme/Category[@Name=&apos;Cider&apos;]/Color[@Name=&apos;ComboBoxButtonMouseOver&apos;]/Foreground/@Source.
/// </summary>
internal static string ComboBox_Button_MouseOver_Foreground {
get {
@@ -319,7 +322,7 @@ namespace mRemoteNG.Themes {
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die /Themes/Theme/Category[@Name=&apos;Cider&apos;]/Color[@Name=&apos;ComboBoxButtonPressed&apos;]/Background/@Source ähnelt.
/// Looks up a localized string similar to /Themes/Theme/Category[@Name=&apos;Cider&apos;]/Color[@Name=&apos;ComboBoxButtonPressed&apos;]/Background/@Source.
/// </summary>
internal static string ComboBox_Button_Pressed_Background {
get {
@@ -328,7 +331,7 @@ namespace mRemoteNG.Themes {
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die /Themes/Theme/Category[@Name=&apos;Cider&apos;]/Color[@Name=&apos;ComboBoxButtonPressed&apos;]/Foreground/@Source ähnelt.
/// Looks up a localized string similar to /Themes/Theme/Category[@Name=&apos;Cider&apos;]/Color[@Name=&apos;ComboBoxButtonPressed&apos;]/Foreground/@Source.
/// </summary>
internal static string ComboBox_Button_Pressed_Foreground {
get {
@@ -337,7 +340,7 @@ namespace mRemoteNG.Themes {
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die /Themes/Theme/Category[@Name=&apos;Cider&apos;]/Color[@Name=&apos;ComboBoxDisabled&apos;]/Background/@Source ähnelt.
/// Looks up a localized string similar to /Themes/Theme/Category[@Name=&apos;Cider&apos;]/Color[@Name=&apos;ComboBoxDisabled&apos;]/Background/@Source.
/// </summary>
internal static string ComboBox_Disabled_Background {
get {
@@ -346,7 +349,7 @@ namespace mRemoteNG.Themes {
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die /Themes/Theme/Category[@Name=&apos;Cider&apos;]/Color[@Name=&apos;ComboBoxDisabled&apos;]/Foreground/@Source ähnelt.
/// Looks up a localized string similar to /Themes/Theme/Category[@Name=&apos;Cider&apos;]/Color[@Name=&apos;ComboBoxDisabled&apos;]/Foreground/@Source.
/// </summary>
internal static string ComboBox_Disabled_Foreground {
get {
@@ -355,7 +358,7 @@ namespace mRemoteNG.Themes {
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die /Themes/Theme/Category[@Name=&apos;Cider&apos;]/Color[@Name=&apos;ComboBox&apos;]/Foreground/@Source ähnelt.
/// Looks up a localized string similar to /Themes/Theme/Category[@Name=&apos;Cider&apos;]/Color[@Name=&apos;ComboBox&apos;]/Foreground/@Source.
/// </summary>
internal static string ComboBox_Foreground {
get {
@@ -364,7 +367,7 @@ namespace mRemoteNG.Themes {
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die /Themes/Theme/Category[@Name=&apos;Cider&apos;]/Color[@Name=&apos;ComboBoxMouseOverBorder&apos;]/Background/@Source ähnelt.
/// Looks up a localized string similar to /Themes/Theme/Category[@Name=&apos;Cider&apos;]/Color[@Name=&apos;ComboBoxMouseOverBorder&apos;]/Background/@Source.
/// </summary>
internal static string ComboBox_MouseOver_Border {
get {
@@ -373,7 +376,7 @@ namespace mRemoteNG.Themes {
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die /Themes/Theme/Category[@Name=&apos;Cider&apos;]/Color[@Name=&apos;ComboBoxPopUpBorder&apos;]/ComboBoxPopUp/@Source ähnelt.
/// Looks up a localized string similar to /Themes/Theme/Category[@Name=&apos;Cider&apos;]/Color[@Name=&apos;ComboBoxPopUpBorder&apos;]/ComboBoxPopUp/@Source.
/// </summary>
internal static string ComboBox_PopUp {
get {
@@ -382,7 +385,7 @@ namespace mRemoteNG.Themes {
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die /Themes/Theme/Category[@Name=&apos;Cider&apos;]/Color[@Name=&apos;ComboBoxPopUpBorder&apos;]/Background/@Source ähnelt.
/// Looks up a localized string similar to /Themes/Theme/Category[@Name=&apos;Cider&apos;]/Color[@Name=&apos;ComboBoxPopUpBorder&apos;]/Background/@Source.
/// </summary>
internal static string ComboBox_PopUp_Border {
get {
@@ -391,7 +394,7 @@ namespace mRemoteNG.Themes {
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die /Themes/Theme/Category[@Name=&apos;Environment&apos;]/Color[@Name=&apos;CommandShelfHighlightGradientBegin&apos;]/Background/@Source ähnelt.
/// Looks up a localized string similar to /Themes/Theme/Category[@Name=&apos;Environment&apos;]/Color[@Name=&apos;CommandShelfHighlightGradientBegin&apos;]/Background/@Source.
/// </summary>
internal static string CommandBarMenuDefault_Background {
get {
@@ -400,7 +403,7 @@ namespace mRemoteNG.Themes {
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die /Themes/Theme/Category[@Name=&apos;Environment&apos;]/Color[@Name=&apos;CommandBarTextActive&apos;]/Background/@Source ähnelt.
/// Looks up a localized string similar to /Themes/Theme/Category[@Name=&apos;Environment&apos;]/Color[@Name=&apos;CommandBarTextActive&apos;]/Background/@Source.
/// </summary>
internal static string CommandBarMenuDefault_Foreground {
get {
@@ -409,7 +412,7 @@ namespace mRemoteNG.Themes {
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die /Themes/Theme/Category[@Name=&apos;Cider&apos;]/Color[@Name=&apos;Dialog&apos;]/Background/@Source ähnelt.
/// Looks up a localized string similar to /Themes/Theme/Category[@Name=&apos;Cider&apos;]/Color[@Name=&apos;Dialog&apos;]/Background/@Source.
/// </summary>
internal static string Dialog_Background {
get {
@@ -418,7 +421,7 @@ namespace mRemoteNG.Themes {
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die /Themes/Theme/Category[@Name=&apos;Cider&apos;]/Color[@Name=&apos;Dialog&apos;]/Foreground/@Source ähnelt.
/// Looks up a localized string similar to /Themes/Theme/Category[@Name=&apos;Cider&apos;]/Color[@Name=&apos;Dialog&apos;]/Foreground/@Source.
/// </summary>
internal static string Dialog_Foreground {
get {
@@ -427,7 +430,7 @@ namespace mRemoteNG.Themes {
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die /Themes/Theme/Category[@Name=&apos;Text Editor Text Marker Items&apos;]/Color[@Name=&apos;compiler error&apos;]/Background/@Source ähnelt.
/// Looks up a localized string similar to /Themes/Theme/Category[@Name=&apos;Text Editor Text Marker Items&apos;]/Color[@Name=&apos;compiler error&apos;]/Background/@Source.
/// </summary>
internal static string ErrorText_Background {
get {
@@ -436,7 +439,7 @@ namespace mRemoteNG.Themes {
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die /Themes/Theme/Category[@Name=&apos;Text Editor Text Marker Items&apos;]/Color[@Name=&apos;compiler error&apos;]/Foreground/@Source ähnelt.
/// Looks up a localized string similar to /Themes/Theme/Category[@Name=&apos;Text Editor Text Marker Items&apos;]/Color[@Name=&apos;compiler error&apos;]/Foreground/@Source.
/// </summary>
internal static string ErrorText_Foreground {
get {
@@ -445,7 +448,7 @@ namespace mRemoteNG.Themes {
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die /Themes/Theme/Category[@Name=&apos;CommonControls&apos;]/Color[@Name=&apos;InnerTabActiveBackground&apos;]/Background/@Source ähnelt.
/// Looks up a localized string similar to /Themes/Theme/Category[@Name=&apos;CommonControls&apos;]/Color[@Name=&apos;InnerTabActiveBackground&apos;]/Background/@Source.
/// </summary>
internal static string GroupBox_Backgorund {
get {
@@ -454,7 +457,7 @@ namespace mRemoteNG.Themes {
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die /Themes/Theme/Category[@Name=&apos;CommonControls&apos;]/Color[@Name=&apos;InnerTabInactiveBackground&apos;]/Background/@Source ähnelt.
/// Looks up a localized string similar to /Themes/Theme/Category[@Name=&apos;CommonControls&apos;]/Color[@Name=&apos;InnerTabInactiveBackground&apos;]/Background/@Source.
/// </summary>
internal static string GroupBox_Disabled_Background {
get {
@@ -463,7 +466,7 @@ namespace mRemoteNG.Themes {
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die /Themes/Theme/Category[@Name=&apos;CommonControls&apos;]/Color[@Name=&apos;InnerTabInactiveText&apos;]/Background/@Source ähnelt.
/// Looks up a localized string similar to /Themes/Theme/Category[@Name=&apos;CommonControls&apos;]/Color[@Name=&apos;InnerTabInactiveText&apos;]/Background/@Source.
/// </summary>
internal static string GroupBox_Disabled_Foreground {
get {
@@ -472,7 +475,7 @@ namespace mRemoteNG.Themes {
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die /Themes/Theme/Category[@Name=&apos;CommonControls&apos;]/Color[@Name=&apos;InnerTabInactiveBorder&apos;]/Background/@Source ähnelt.
/// Looks up a localized string similar to /Themes/Theme/Category[@Name=&apos;CommonControls&apos;]/Color[@Name=&apos;InnerTabInactiveBorder&apos;]/Background/@Source.
/// </summary>
internal static string GroupBox_Disabled_Line {
get {
@@ -481,7 +484,7 @@ namespace mRemoteNG.Themes {
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die /Themes/Theme/Category[@Name=&apos;CommonControls&apos;]/Color[@Name=&apos;InnerTabActiveText&apos;]/Background/@Source ähnelt.
/// Looks up a localized string similar to /Themes/Theme/Category[@Name=&apos;CommonControls&apos;]/Color[@Name=&apos;InnerTabActiveText&apos;]/Background/@Source.
/// </summary>
internal static string GroupBox_Foreground {
get {
@@ -490,7 +493,7 @@ namespace mRemoteNG.Themes {
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die /Themes/Theme/Category[@Name=&apos;CommonControls&apos;]/Color[@Name=&apos;InnerTabActiveBorder&apos;]/Background/@Source ähnelt.
/// Looks up a localized string similar to /Themes/Theme/Category[@Name=&apos;CommonControls&apos;]/Color[@Name=&apos;InnerTabActiveBorder&apos;]/Background/@Source.
/// </summary>
internal static string GroupBox_Line {
get {
@@ -499,7 +502,7 @@ namespace mRemoteNG.Themes {
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die /Themes/Theme/Category[@Name=&apos;Cider&apos;]/Color[@Name=&apos;ListBackground&apos;]/Background/@Source ähnelt.
/// Looks up a localized string similar to /Themes/Theme/Category[@Name=&apos;Cider&apos;]/Color[@Name=&apos;ListBackground&apos;]/Background/@Source.
/// </summary>
internal static string List_Background {
get {
@@ -508,7 +511,7 @@ namespace mRemoteNG.Themes {
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die /Themes/Theme/Category[@Name=&apos;Cider&apos;]/Color[@Name=&apos;ListHeader&apos;]/Background/@Source ähnelt.
/// Looks up a localized string similar to /Themes/Theme/Category[@Name=&apos;Cider&apos;]/Color[@Name=&apos;ListHeader&apos;]/Background/@Source.
/// </summary>
internal static string List_Header_Background {
get {
@@ -517,7 +520,7 @@ namespace mRemoteNG.Themes {
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die /Themes/Theme/Category[@Name=&apos;Cider&apos;]/Color[@Name=&apos;ListHeader&apos;]/Foreground/@Source ähnelt.
/// Looks up a localized string similar to /Themes/Theme/Category[@Name=&apos;Cider&apos;]/Color[@Name=&apos;ListHeader&apos;]/Foreground/@Source.
/// </summary>
internal static string List_Header_Foreground {
get {
@@ -526,7 +529,7 @@ namespace mRemoteNG.Themes {
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die /Themes/Theme/Category[@Name=&apos;Cider&apos;]/Color[@Name=&apos;ListItem&apos;]/Background/@Source ähnelt.
/// Looks up a localized string similar to /Themes/Theme/Category[@Name=&apos;Cider&apos;]/Color[@Name=&apos;ListItem&apos;]/Background/@Source.
/// </summary>
internal static string List_Item_Background {
get {
@@ -535,7 +538,7 @@ namespace mRemoteNG.Themes {
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die /Themes/Theme/Category[@Name=&apos;Cider&apos;]/Color[@Name=&apos;ListItemBorder&apos;]/Background/@Source ähnelt.
/// Looks up a localized string similar to /Themes/Theme/Category[@Name=&apos;Cider&apos;]/Color[@Name=&apos;ListItemBorder&apos;]/Background/@Source.
/// </summary>
internal static string List_Item_Border {
get {
@@ -544,7 +547,7 @@ namespace mRemoteNG.Themes {
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die /Themes/Theme/Category[@Name=&apos;Cider&apos;]/Color[@Name=&apos;ListItemDisabled&apos;]/Background/@Source ähnelt.
/// Looks up a localized string similar to /Themes/Theme/Category[@Name=&apos;Cider&apos;]/Color[@Name=&apos;ListItemDisabled&apos;]/Background/@Source.
/// </summary>
internal static string List_Item_Disabled_Background {
get {
@@ -553,7 +556,7 @@ namespace mRemoteNG.Themes {
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die /Themes/Theme/Category[@Name=&apos;Cider&apos;]/Color[@Name=&apos;ListItemDisabledBorder&apos;]/Background/@Source ähnelt.
/// Looks up a localized string similar to /Themes/Theme/Category[@Name=&apos;Cider&apos;]/Color[@Name=&apos;ListItemDisabledBorder&apos;]/Background/@Source.
/// </summary>
internal static string List_Item_Disabled_Border {
get {
@@ -562,7 +565,7 @@ namespace mRemoteNG.Themes {
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die /Themes/Theme/Category[@Name=&apos;Cider&apos;]/Color[@Name=&apos;ListItemDisabled&apos;]/Foreground/@Source ähnelt.
/// Looks up a localized string similar to /Themes/Theme/Category[@Name=&apos;Cider&apos;]/Color[@Name=&apos;ListItemDisabled&apos;]/Foreground/@Source.
/// </summary>
internal static string List_Item_Disabled_Foreground {
get {
@@ -571,7 +574,7 @@ namespace mRemoteNG.Themes {
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die /Themes/Theme/Category[@Name=&apos;Cider&apos;]/Color[@Name=&apos;ListItem&apos;]/Foreground/@Source ähnelt.
/// Looks up a localized string similar to /Themes/Theme/Category[@Name=&apos;Cider&apos;]/Color[@Name=&apos;ListItem&apos;]/Foreground/@Source.
/// </summary>
internal static string List_Item_Foreground {
get {
@@ -580,7 +583,7 @@ namespace mRemoteNG.Themes {
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die /Themes/Theme/Category[@Name=&apos;Cider&apos;]/Color[@Name=&apos;ListItemSelected&apos;]/Background/@Source ähnelt.
/// Looks up a localized string similar to /Themes/Theme/Category[@Name=&apos;Cider&apos;]/Color[@Name=&apos;ListItemSelected&apos;]/Background/@Source.
/// </summary>
internal static string List_Item_Selected_Background {
get {
@@ -589,7 +592,7 @@ namespace mRemoteNG.Themes {
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die /Themes/Theme/Category[@Name=&apos;Cider&apos;]/Color[@Name=&apos;ListItemSelectedBorder&apos;]/Background/@Source ähnelt.
/// Looks up a localized string similar to /Themes/Theme/Category[@Name=&apos;Cider&apos;]/Color[@Name=&apos;ListItemSelectedBorder&apos;]/Background/@Source.
/// </summary>
internal static string List_Item_Selected_Border {
get {
@@ -598,7 +601,7 @@ namespace mRemoteNG.Themes {
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die /Themes/Theme/Category[@Name=&apos;Cider&apos;]/Color[@Name=&apos;ListItemSelected&apos;]/Foreground/@Source ähnelt.
/// Looks up a localized string similar to /Themes/Theme/Category[@Name=&apos;Cider&apos;]/Color[@Name=&apos;ListItemSelected&apos;]/Foreground/@Source.
/// </summary>
internal static string List_Item_Selected_Foreground {
get {
@@ -607,7 +610,7 @@ namespace mRemoteNG.Themes {
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die /Themes/Theme/Category[@Name=&apos;ProgressBar&apos;]/Color[@Name=&apos;Background&apos;]/Background/@Source ähnelt.
/// Looks up a localized string similar to /Themes/Theme/Category[@Name=&apos;ProgressBar&apos;]/Color[@Name=&apos;Background&apos;]/Background/@Source.
/// </summary>
internal static string ProgressBar_Background {
get {
@@ -616,7 +619,7 @@ namespace mRemoteNG.Themes {
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die /Themes/Theme/Category[@Name=&apos;ProgressBar&apos;]/Color[@Name=&apos;IndicatorFill&apos;]/Background/@Source ähnelt.
/// Looks up a localized string similar to /Themes/Theme/Category[@Name=&apos;ProgressBar&apos;]/Color[@Name=&apos;IndicatorFill&apos;]/Background/@Source.
/// </summary>
internal static string ProgressBar_Fill {
get {
@@ -625,7 +628,7 @@ namespace mRemoteNG.Themes {
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die /Themes/Theme/Category[@Name=&apos;ProgressBar&apos;]/Color[@Name=&apos;IndicatorFillCritical&apos;]/Background/@Source ähnelt.
/// Looks up a localized string similar to /Themes/Theme/Category[@Name=&apos;ProgressBar&apos;]/Color[@Name=&apos;IndicatorFillCritical&apos;]/Background/@Source.
/// </summary>
internal static string ProgressBar_Fill_Critical {
get {
@@ -634,7 +637,7 @@ namespace mRemoteNG.Themes {
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die /Themes/Theme/Category[@Name=&apos;ProgressBar&apos;]/Color[@Name=&apos;IndicatorFillWarning&apos;]/Background/@Source ähnelt.
/// Looks up a localized string similar to /Themes/Theme/Category[@Name=&apos;ProgressBar&apos;]/Color[@Name=&apos;IndicatorFillWarning&apos;]/Background/@Source.
/// </summary>
internal static string ProgressBar_Fill_Warning {
get {
@@ -643,7 +646,7 @@ namespace mRemoteNG.Themes {
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die /Themes/Theme/Category[@Name=&apos;Cider&apos;]/Color[@Name=&apos;TabBackground&apos;]/Background/@Source ähnelt.
/// Looks up a localized string similar to /Themes/Theme/Category[@Name=&apos;Cider&apos;]/Color[@Name=&apos;TabBackground&apos;]/Background/@Source.
/// </summary>
internal static string Tab_Background {
get {
@@ -652,7 +655,7 @@ namespace mRemoteNG.Themes {
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die /Themes/Theme/Category[@Name=&apos;Cider&apos;]/Color[@Name=&apos;TabItem&apos;]/Background/@Source ähnelt.
/// Looks up a localized string similar to /Themes/Theme/Category[@Name=&apos;Cider&apos;]/Color[@Name=&apos;TabItem&apos;]/Background/@Source.
/// </summary>
internal static string Tab_Item_Background {
get {
@@ -661,7 +664,7 @@ namespace mRemoteNG.Themes {
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die /Themes/Theme/Category[@Name=&apos;Cider&apos;]/Color[@Name=&apos;TabItemDisabled&apos;]/Background/@Source ähnelt.
/// Looks up a localized string similar to /Themes/Theme/Category[@Name=&apos;Cider&apos;]/Color[@Name=&apos;TabItemDisabled&apos;]/Background/@Source.
/// </summary>
internal static string Tab_Item_Disabled_Background {
get {
@@ -670,7 +673,7 @@ namespace mRemoteNG.Themes {
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die /Themes/Theme/Category[@Name=&apos;Cider&apos;]/Color[@Name=&apos;TabItemDisabled&apos;]/Foreground/@Source ähnelt.
/// Looks up a localized string similar to /Themes/Theme/Category[@Name=&apos;Cider&apos;]/Color[@Name=&apos;TabItemDisabled&apos;]/Foreground/@Source.
/// </summary>
internal static string Tab_Item_Disabled_Foreground {
get {
@@ -679,7 +682,7 @@ namespace mRemoteNG.Themes {
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die /Themes/Theme/Category[@Name=&apos;Cider&apos;]/Color[@Name=&apos;TabItem&apos;]/Foreground/@Source ähnelt.
/// Looks up a localized string similar to /Themes/Theme/Category[@Name=&apos;Cider&apos;]/Color[@Name=&apos;TabItem&apos;]/Foreground/@Source.
/// </summary>
internal static string Tab_Item_Foreground {
get {
@@ -688,7 +691,7 @@ namespace mRemoteNG.Themes {
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die /Themes/Theme/Category[@Name=&apos;CommonControls&apos;]/Color[@Name=&apos;TextBoxBackground&apos;]/Background/@Source ähnelt.
/// Looks up a localized string similar to /Themes/Theme/Category[@Name=&apos;CommonControls&apos;]/Color[@Name=&apos;TextBoxBackground&apos;]/Background/@Source.
/// </summary>
internal static string TextBox_Background {
get {
@@ -697,7 +700,7 @@ namespace mRemoteNG.Themes {
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die /Themes/Theme/Category[@Name=&apos;CommonControls&apos;]/Color[@Name=&apos;TextBoxBorder&apos;]/Background/@Source ähnelt.
/// Looks up a localized string similar to /Themes/Theme/Category[@Name=&apos;CommonControls&apos;]/Color[@Name=&apos;TextBoxBorder&apos;]/Background/@Source.
/// </summary>
internal static string TextBox_Border {
get {
@@ -706,7 +709,7 @@ namespace mRemoteNG.Themes {
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die /Themes/Theme/Category[@Name=&apos;CommonControls&apos;]/Color[@Name=&apos;TextBoxBorderDisabled&apos;]/Background/@Source ähnelt.
/// Looks up a localized string similar to /Themes/Theme/Category[@Name=&apos;CommonControls&apos;]/Color[@Name=&apos;TextBoxBorderDisabled&apos;]/Background/@Source.
/// </summary>
internal static string TextBox_Border_Disabled {
get {
@@ -715,7 +718,7 @@ namespace mRemoteNG.Themes {
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die /Themes/Theme/Category[@Name=&apos;CommonControls&apos;]/Color[@Name=&apos;TextBoxBorderFocused&apos;]/Background/@Source ähnelt.
/// Looks up a localized string similar to /Themes/Theme/Category[@Name=&apos;CommonControls&apos;]/Color[@Name=&apos;TextBoxBorderFocused&apos;]/Background/@Source.
/// </summary>
internal static string TextBox_Border_Focused {
get {
@@ -724,7 +727,7 @@ namespace mRemoteNG.Themes {
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die /Themes/Theme/Category[@Name=&apos;CommonControls&apos;]/Color[@Name=&apos;TextBoxBackgroundDisabled&apos;]/Background/@Source ähnelt.
/// Looks up a localized string similar to /Themes/Theme/Category[@Name=&apos;CommonControls&apos;]/Color[@Name=&apos;TextBoxBackgroundDisabled&apos;]/Background/@Source.
/// </summary>
internal static string TextBox_Disabled_Background {
get {
@@ -733,7 +736,7 @@ namespace mRemoteNG.Themes {
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die /Themes/Theme/Category[@Name=&apos;CommonControls&apos;]/Color[@Name=&apos;TextBoxTextDisabled&apos;]/Background/@Source ähnelt.
/// Looks up a localized string similar to /Themes/Theme/Category[@Name=&apos;CommonControls&apos;]/Color[@Name=&apos;TextBoxTextDisabled&apos;]/Background/@Source.
/// </summary>
internal static string TextBox_Disabled_Foreground {
get {
@@ -742,7 +745,7 @@ namespace mRemoteNG.Themes {
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die /Themes/Theme/Category[@Name=&apos;CommonControls&apos;]/Color[@Name=&apos;TextBoxBackgroundFocused&apos;]/Background/@Source ähnelt.
/// Looks up a localized string similar to /Themes/Theme/Category[@Name=&apos;CommonControls&apos;]/Color[@Name=&apos;TextBoxBackgroundFocused&apos;]/Background/@Source.
/// </summary>
internal static string TextBox_Focused_Background {
get {
@@ -751,7 +754,7 @@ namespace mRemoteNG.Themes {
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die /Themes/Theme/Category[@Name=&apos;CommonControls&apos;]/Color[@Name=&apos;TextBoxTextFocused&apos;]/Background/@Source ähnelt.
/// Looks up a localized string similar to /Themes/Theme/Category[@Name=&apos;CommonControls&apos;]/Color[@Name=&apos;TextBoxTextFocused&apos;]/Background/@Source.
/// </summary>
internal static string TextBox_Focused_Foreground {
get {
@@ -760,7 +763,7 @@ namespace mRemoteNG.Themes {
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die /Themes/Theme/Category[@Name=&apos;CommonControls&apos;]/Color[@Name=&apos;TextBoxText&apos;]/Background/@Source ähnelt.
/// Looks up a localized string similar to /Themes/Theme/Category[@Name=&apos;CommonControls&apos;]/Color[@Name=&apos;TextBoxText&apos;]/Background/@Source.
/// </summary>
internal static string TextBox_Foreground {
get {
@@ -769,7 +772,7 @@ namespace mRemoteNG.Themes {
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die /Themes/Theme/Category[@Name=&apos;TreeView&apos;]/Color[@Name=&apos;Background&apos;]/Background/@Source ähnelt.
/// Looks up a localized string similar to /Themes/Theme/Category[@Name=&apos;TreeView&apos;]/Color[@Name=&apos;Background&apos;]/Background/@Source.
/// </summary>
internal static string TreeView_Background {
get {
@@ -778,7 +781,7 @@ namespace mRemoteNG.Themes {
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die /Themes/Theme/Category[@Name=&apos;TreeView&apos;]/Color[@Name=&apos;Background&apos;]/Foreground/@Source ähnelt.
/// Looks up a localized string similar to /Themes/Theme/Category[@Name=&apos;TreeView&apos;]/Color[@Name=&apos;Background&apos;]/Foreground/@Source.
/// </summary>
internal static string TreeView_Foreground {
get {
@@ -787,7 +790,7 @@ namespace mRemoteNG.Themes {
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die /Themes/Theme/Category[@Name=&apos;TreeView&apos;]/Color[@Name=&apos;SelectedItemActive&apos;]/Background/@Source ähnelt.
/// Looks up a localized string similar to /Themes/Theme/Category[@Name=&apos;TreeView&apos;]/Color[@Name=&apos;SelectedItemActive&apos;]/Background/@Source.
/// </summary>
internal static string Treeview_SelectedItem_Active_Background {
get {
@@ -796,7 +799,7 @@ namespace mRemoteNG.Themes {
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die /Themes/Theme/Category[@Name=&apos;TreeView&apos;]/Color[@Name=&apos;SelectedItemActive&apos;]/Foreground/@Source ähnelt.
/// Looks up a localized string similar to /Themes/Theme/Category[@Name=&apos;TreeView&apos;]/Color[@Name=&apos;SelectedItemActive&apos;]/Foreground/@Source.
/// </summary>
internal static string Treeview_SelectedItem_Active_Foreground {
get {
@@ -805,7 +808,7 @@ namespace mRemoteNG.Themes {
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die /Themes/Theme/Category[@Name=&apos;TreeView&apos;]/Color[@Name=&apos;SelectedItemInactive&apos;]/Background/@Source ähnelt.
/// Looks up a localized string similar to /Themes/Theme/Category[@Name=&apos;TreeView&apos;]/Color[@Name=&apos;SelectedItemInactive&apos;]/Background/@Source.
/// </summary>
internal static string Treeview_SelectedItem_Inactive_Background {
get {
@@ -814,7 +817,7 @@ namespace mRemoteNG.Themes {
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die /Themes/Theme/Category[@Name=&apos;TreeView&apos;]/Color[@Name=&apos;SelectedItemInactive&apos;]/Foreground/@Source ähnelt.
/// Looks up a localized string similar to /Themes/Theme/Category[@Name=&apos;TreeView&apos;]/Color[@Name=&apos;SelectedItemInactive&apos;]/Foreground/@Source.
/// </summary>
internal static string Treeview_SelectedItem_Inactive_Foreground {
get {
@@ -823,7 +826,7 @@ namespace mRemoteNG.Themes {
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die /Themes/Theme/Category[@Name=&apos;Text Editor Text Marker Items&apos;]/Color[@Name=&apos;compiler warning&apos;]/Background/@Source ähnelt.
/// Looks up a localized string similar to /Themes/Theme/Category[@Name=&apos;Text Editor Text Marker Items&apos;]/Color[@Name=&apos;compiler warning&apos;]/Background/@Source.
/// </summary>
internal static string WarningText_Background {
get {
@@ -832,7 +835,7 @@ namespace mRemoteNG.Themes {
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die /Themes/Theme/Category[@Name=&apos;Text Editor Text Marker Items&apos;]/Color[@Name=&apos;compiler warning&apos;]/Foreground/@Source ähnelt.
/// Looks up a localized string similar to /Themes/Theme/Category[@Name=&apos;Text Editor Text Marker Items&apos;]/Color[@Name=&apos;compiler warning&apos;]/Foreground/@Source.
/// </summary>
internal static string WarningText_Foreground {
get {

View File

@@ -1,4 +1,4 @@
using mRemoteNG.App;
using mRemoteNG.App;
using System;
using System.Collections;
using System.Collections.Generic;
@@ -167,18 +167,6 @@ namespace mRemoteNG.Themes
//Load the embedded themes, extended palettes are taken from the vs2015 themes, trying to match the color theme
// 2003
var vs2003 = new ThemeInfo("vs2003", new VS2003Theme(), "",
VisualStudioToolStripExtender.VsVersion.Vs2003,
((ThemeInfo)themes["vs2015lightNG"]).ExtendedPalette);
themes.Add(vs2003.Name, vs2003);
// 2005
var vs2005 = new ThemeInfo("vs2005", new VS2005Theme(), "",
VisualStudioToolStripExtender.VsVersion.Vs2005,
((ThemeInfo)themes["vs2015lightNG"]).ExtendedPalette);
themes.Add(vs2005.Name, vs2005);
// 2012
var vs2012Light = new ThemeInfo("vs2012Light", new VS2012LightTheme(), "",
VisualStudioToolStripExtender.VsVersion.Vs2012,

View File

@@ -6,6 +6,7 @@ using System.Windows.Forms;
using mRemoteNG.App.Info;
using mRemoteNG.Messages;
using mRemoteNG.Properties;
using mRemoteNG.Resources.Language;
namespace mRemoteNG.Tools.Cmdline

View File

@@ -9,6 +9,7 @@ using mRemoteNG.Connection;
using mRemoteNG.Connection.Protocol;
using mRemoteNG.Container;
using mRemoteNG.Messages;
using mRemoteNG.Resources.Language;
// ReSharper disable ArrangeAccessorOwnerBody

View File

@@ -11,6 +11,7 @@ using mRemoteNG.Messages;
using mRemoteNG.Properties;
using mRemoteNG.UI.Forms;
using MySql.Data.Types;
using mRemoteNG.Resources.Language;
using static System.String;
namespace mRemoteNG.Tools

View File

@@ -6,6 +6,7 @@ using mRemoteNG.Connection;
using mRemoteNG.Container;
using mRemoteNG.Properties;
using mRemoteNG.UI.Forms;
using mRemoteNG.Resources.Language;
namespace mRemoteNG.Tools

Some files were not shown because too many files have changed in this diff Show More