Merge pull request #2208 from Pwnoz0r/MR-887_rdm_import

Add Remote Desktop Manager (Devolutions) Importer
This commit is contained in:
Dimitrij
2022-04-23 21:02:32 +01:00
committed by GitHub
7 changed files with 1126 additions and 780 deletions

View File

@@ -38,8 +38,8 @@ namespace mRemoteNG.App
return;
HeadlessFileImport(
openFileDialog.FileNames,
importDestinationContainer,
openFileDialog.FileNames,
importDestinationContainer,
Runtime.ConnectionsService,
fileName => MessageBox.Show(string.Format(Language.ImportFileFailedContent, fileName), Language.AskUpdatesMainInstruction,
MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1));
@@ -51,9 +51,40 @@ namespace mRemoteNG.App
}
}
public static void ImportFromRemoteDesktopManagerCsv(ContainerInfo importDestinationContainer)
{
try
{
using (Runtime.ConnectionsService.BatchedSavingContext())
{
using (var openFileDialog = new OpenFileDialog())
{
openFileDialog.CheckFileExists = true;
openFileDialog.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.Personal);
openFileDialog.Multiselect = false;
var fileTypes = new List<string>();
fileTypes.AddRange(new[] {Language.FiltermRemoteRemoteDesktopManagerCSV, "*.csv"});
openFileDialog.Filter = string.Join("|", fileTypes.ToArray());
if (openFileDialog.ShowDialog() != DialogResult.OK)
return;
var importer = new RemoteDesktopManagerImporter();
importer.Import(openFileDialog.FileName, importDestinationContainer);
}
}
}
catch (Exception ex)
{
Runtime.MessageCollector.AddExceptionMessage("App.Import.ImportFromRemoteDesktopManagerCsv() failed.", ex);
}
}
public static void HeadlessFileImport(
IEnumerable<string> filePaths,
ContainerInfo importDestinationContainer,
IEnumerable<string> filePaths,
ContainerInfo importDestinationContainer,
ConnectionsService connectionsService,
Action<string> exceptionAction = null)
{

View File

@@ -0,0 +1,45 @@
#region
using System.IO;
using Castle.Core.Internal;
using mRemoteNG.App;
using mRemoteNG.Config.DataProviders;
using mRemoteNG.Config.Serializers.ConnectionSerializers.Csv.RemoteDesktopManager;
using mRemoteNG.Container;
using mRemoteNG.Messages;
#endregion
namespace mRemoteNG.Config.Import;
public class RemoteDesktopManagerImporter : IConnectionImporter<string>
{
public void Import(string filePath, ContainerInfo destinationContainer)
{
if (string.IsNullOrEmpty(filePath))
{
Runtime.MessageCollector.AddMessage(MessageClass.ErrorMsg, "Unable to import file. File path is null.");
return;
}
if (!File.Exists(filePath))
Runtime.MessageCollector.AddMessage(MessageClass.ErrorMsg,
$"Unable to import file. File does not exist. Path: {filePath}");
var dataProvider = new FileDataProvider(filePath);
var csvString = dataProvider.Load();
if (csvString.IsNullOrEmpty())
{
Runtime.MessageCollector.AddMessage(MessageClass.ErrorMsg, "Unable to import file. File is empty.");
return;
}
var csvDeserializer = new CsvConnectionsDeserializerRdmFormat();
var connectionTreeModel = csvDeserializer.Deserialize(csvString);
var rootContainer = new ContainerInfo { Name = Path.GetFileNameWithoutExtension(filePath) };
rootContainer.AddChildRange(connectionTreeModel.RootNodes);
destinationContainer.AddChild(rootContainer);
}
}

View File

@@ -0,0 +1,226 @@
#region
using System;
using System.Collections.Generic;
using System.Linq;
using mRemoteNG.Connection;
using mRemoteNG.Connection.Protocol;
using mRemoteNG.Container;
using mRemoteNG.Tree;
#endregion
namespace mRemoteNG.Config.Serializers.ConnectionSerializers.Csv.RemoteDesktopManager;
/// <summary>
/// Import of connections from the Remote Desktop Manager (RDM) in a CSV file format
/// </summary>
public partial class CsvConnectionsDeserializerRdmFormat : IDeserializer<string, ConnectionTreeModel>
{
private readonly List<RemoteDesktopManagerConnectionInfo> _connectionTypes;
private readonly HashSet<string> _groups;
public CsvConnectionsDeserializerRdmFormat()
{
_connectionTypes = new List<RemoteDesktopManagerConnectionInfo>
{
new(ProtocolType.RDP, "RDP (Microsoft Remote Desktop)", 3389, "Remote Desktop"),
new(ProtocolType.SSH2, "SSH Shell", 22, "SSH")
};
_groups = new HashSet<string>();
Containers = new List<ContainerInfo>();
}
private List<ContainerInfo> Containers { get; }
/// <summary>
/// Deserializes the CSV file into a <see cref="ConnectionTreeModel" />
/// </summary>
/// <param name="serializedData">Data from the CSV file</param>
/// <returns></returns>
public ConnectionTreeModel Deserialize(string serializedData)
{
var lines = serializedData.Split(new[] { "\r\n", "\r", "\n" }, StringSplitOptions.RemoveEmptyEntries);
var csvHeaders = new List<string>();
var connections = new List<(ConnectionInfo, string)>(); // (ConnectionInfo, group)
for (var lineNumber = 0; lineNumber < lines.Length; lineNumber++)
{
var line = lines[lineNumber].Split(',');
if (lineNumber == 0)
{
csvHeaders = line.ToList();
}
else
{
var (connectionInfo, group) = ParseConnectionInfo(csvHeaders, line);
if (connectionInfo == default) continue;
connections.Add((connectionInfo, group));
}
}
var connectionTreeModel = new ConnectionTreeModel();
var unsortedConnections = new ContainerInfo { Name = "Unsorted" };
foreach (var containerInfo in Containers) connectionTreeModel.AddRootNode(containerInfo);
var allChildren = Containers.SelectMany(x => x.GetRecursiveChildList().Select(y => (ContainerInfo)y)).ToList();
foreach (var (connection, path) in connections)
if (string.IsNullOrEmpty(path))
{
unsortedConnections.AddChild(connection);
}
else
{
var container = allChildren.FirstOrDefault(x => x.ConstantID == path);
if (container == default) continue;
container.AddChild(connection);
}
if (unsortedConnections.HasChildren())
connectionTreeModel.AddRootNode(unsortedConnections);
return connectionTreeModel;
}
/// <summary>
/// Parses a line from the CSV file and returns <see cref="ConnectionInfo" />
/// </summary>
/// <param name="headers">CSV Headers</param>
/// <param name="connectionCsv">CSV Columns</param>
/// <returns></returns>
private (ConnectionInfo connectionInfo, string) ParseConnectionInfo(IList<string> headers, IReadOnlyList<string> connectionCsv)
{
if (headers.Count != connectionCsv.Count) return default;
var hostString = connectionCsv[headers.IndexOf("Host")].Trim();
if (string.IsNullOrEmpty(hostString)) return default;
var hostType = Uri.CheckHostName(hostString);
if (hostType == UriHostNameType.Unknown) return default;
var connectionTypeString = connectionCsv[headers.IndexOf("ConnectionType")];
if (string.IsNullOrEmpty(connectionTypeString)) return default;
var connectionType = _connectionTypes.FirstOrDefault(x => x.Name == connectionTypeString);
if (connectionType == default) return default;
var portString = connectionCsv[headers.IndexOf("Port")] ?? connectionType.Port.ToString();
if (!int.TryParse(portString, out var port)) port = connectionType.Port;
var name = connectionCsv[headers.IndexOf("Name")];
var description = connectionCsv[headers.IndexOf("Description")];
var group = connectionCsv[headers.IndexOf("Group")];
var username = connectionCsv[headers.IndexOf("CredentialUserName")];
var domain = connectionCsv[headers.IndexOf("CredentialDomain")];
var password = connectionCsv[headers.IndexOf("CredentialPassword")];
var connectionInfo = new ConnectionInfo(Guid.NewGuid().ToString())
{
Name = name,
Hostname = hostString,
Port = port,
Username = username,
Password = password,
Domain = domain,
Icon = connectionType.IconName ?? "mRemoteNG",
Description = description,
Protocol = connectionType.Protocol
};
if (!string.IsNullOrEmpty(group))
if (group.Contains('\\'))
{
var groupParts = group.Split('\\').ToList();
var parentContainerName = groupParts[0];
var parentContainer = Containers.FirstOrDefault(x => x.Name == parentContainerName);
if (parentContainer == default)
{
parentContainer = new ContainerInfo(group) { Name = parentContainerName };
Containers.Add(parentContainer);
}
groupParts.RemoveAt(0);
AddChildrenRecursive(group, groupParts, parentContainer);
}
return string.IsNullOrEmpty(group) ? (connectionInfo, default) : (connectionInfo, group);
}
/// <summary>
/// Adds a child to a container recursively
/// </summary>
/// <param name="group">Full path of the RDM Grouping</param>
/// <param name="groupParts">Segements of the group path</param>
/// <param name="parentContainer">Parent container to add children to</param>
private void AddChildrenRecursive(string group, IList<string> groupParts, ContainerInfo parentContainer)
{
if (_groups.Contains(group)) return;
var groupCount = groupParts.Count;
while (groupCount > 0)
{
var childName = groupParts[0];
var newContainer = new ContainerInfo(group) { Name = childName };
var childrenNames = parentContainer.GetRecursiveChildList().Select(x => x.Name).ToList();
if (!childrenNames.Any())
{
groupCount = AddChild(parentContainer, newContainer, groupCount);
_groups.Add(group);
continue;
}
if (groupParts.Count > 1)
{
var childContainer = (ContainerInfo)parentContainer.Children.FirstOrDefault(x => x.Name == childName);
if (childContainer == default)
{
groupCount = AddChild(parentContainer, newContainer, groupCount);
continue;
}
AddChildrenRecursive(group, groupParts.Skip(1).ToList(), childContainer);
}
else
{
parentContainer.AddChild(newContainer);
_groups.Add(group);
}
groupCount--;
}
}
/// <summary>
/// Adds a child to a container and returns the remaining group count
/// </summary>
/// <param name="parentContainer">Parent container</param>
/// <param name="newContainer">New child container</param>
/// <param name="groupCount">Remaining group count</param>
/// <returns></returns>
private static int AddChild(ContainerInfo parentContainer, ContainerInfo newContainer, int groupCount)
{
parentContainer.AddChild(newContainer);
groupCount--;
return groupCount;
}
}
/// <summary>
/// Record of supported connection types
/// </summary>
/// <param name="Protocol">Procotol</param>
/// <param name="Name">Display Name</param>
/// <param name="Port">Default Port</param>
/// <param name="IconName">Icon Name</param>
internal sealed record RemoteDesktopManagerConnectionInfo(ProtocolType Protocol, string Name, int Port, string IconName);

View File

@@ -0,0 +1,18 @@
#region
using System;
using mRemoteNG.Connection;
#endregion
namespace mRemoteNG.Config.Serializers.ConnectionSerializers.Csv.RemoteDesktopManager;
public partial class CsvConnectionsDeserializerRdmFormat : ISerializer<ConnectionInfo, string>
{
public string Serialize(ConnectionInfo model)
{
throw new NotImplementedException();
}
public Version Version { get; }
}

File diff suppressed because it is too large Load Diff

View File

@@ -1086,15 +1086,12 @@ If you run into such an error, please create a new connection file!</value>
<data name="PropertyDescriptionUseCredSsp" xml:space="preserve">
<value>Use the Credential Security Support Provider (CredSSP) for authentication if it is available.</value>
</data>
<data name="PropertyDescriptionUseRestrictedAdmin" xml:space="preserve">
<value>Use restricted admin mode on the target host (local system context).</value>
</data>
<data name="PropertyDescriptionUseRCG" xml:space="preserve">
<value>Use Remote Credential Guard to tunnel authentication on target back to source through the RDP channel.</value>
</data>
<data name="PropertyDescriptionUser1" xml:space="preserve">
<value>Feel free to enter any information you need here.</value>
</data>
@@ -1248,15 +1245,12 @@ If you run into such an error, please create a new connection file!</value>
<data name="UseCredSsp" xml:space="preserve">
<value>Use CredSSP</value>
</data>
<data name="UseRestrictedAdmin" xml:space="preserve">
<value>Use Restricted Admin</value>
</data>
<data name="UseRCG" xml:space="preserve">
<value>Use Remote Credential Guard</value>
</data>
<data name="UserField" xml:space="preserve">
<value>User Field</value>
</data>
@@ -2283,4 +2277,7 @@ Nightly Channel includes Alphas, Betas &amp; Release Candidates.</value>
<data name="ShowForUser" xml:space="preserve">
<value>Show for user</value>
</data>
<data name="FiltermRemoteRemoteDesktopManagerCSV" xml:space="preserve">
<value>Remote Desktop Manager Files (*.csv)</value>
</data>
</root>

View File

@@ -50,6 +50,7 @@ namespace mRemoteNG.UI.Controls
private ToolStripMenuItem _cMenTreeExportFile;
private ToolStripSeparator _toolStripSeparator1;
private ToolStripMenuItem _cMenTreeImportFile;
private ToolStripMenuItem _cMenTreeImportFromRemoteDesktopManager;
private ToolStripMenuItem _cMenTreeImportActiveDirectory;
private ToolStripMenuItem _cMenTreeImportPortScan;
private ToolStripMenuItem _cMenTreeApplyInheritanceToChildren;
@@ -98,6 +99,7 @@ namespace mRemoteNG.UI.Controls
_cMenTreeSep3 = new ToolStripSeparator();
_cMenTreeImport = new ToolStripMenuItem();
_cMenTreeImportFile = new ToolStripMenuItem();
_cMenTreeImportFromRemoteDesktopManager = new ToolStripMenuItem();
_cMenTreeImportActiveDirectory = new ToolStripMenuItem();
_cMenTreeImportPortScan = new ToolStripMenuItem();
_cMenInheritanceSubMenu = new ToolStripMenuItem();
@@ -115,9 +117,9 @@ namespace mRemoteNG.UI.Controls
_cMenTreeMoveDown = new ToolStripMenuItem();
//
//
// cMenTree
//
//
Font = new System.Drawing.Font("Segoe UI", 8.25F, System.Drawing.FontStyle.Regular,
System.Drawing.GraphicsUnit.Point, 0);
Items.AddRange(new ToolStripItem[]
@@ -148,17 +150,17 @@ namespace mRemoteNG.UI.Controls
Name = "cMenTree";
RenderMode = ToolStripRenderMode.Professional;
Size = new System.Drawing.Size(200, 364);
//
//
// cMenTreeConnect
//
//
_cMenTreeConnect.Image = Properties.Resources.Run_16x;
_cMenTreeConnect.Name = "_cMenTreeConnect";
_cMenTreeConnect.Size = new System.Drawing.Size(199, 22);
_cMenTreeConnect.Text = "Connect";
_cMenTreeConnect.Click += OnConnectClicked;
//
//
// cMenTreeConnectWithOptions
//
//
_cMenTreeConnectWithOptions.DropDownItems.AddRange(new ToolStripItem[]
{
_cMenTreeConnectWithOptionsConnectToConsoleSession,
@@ -171,195 +173,202 @@ namespace mRemoteNG.UI.Controls
_cMenTreeConnectWithOptions.Name = "_cMenTreeConnectWithOptions";
_cMenTreeConnectWithOptions.Size = new System.Drawing.Size(199, 22);
_cMenTreeConnectWithOptions.Text = "Connect (with options)";
//
//
// cMenTreeConnectWithOptionsConnectToConsoleSession
//
//
_cMenTreeConnectWithOptionsConnectToConsoleSession.Name =
"_cMenTreeConnectWithOptionsConnectToConsoleSession";
_cMenTreeConnectWithOptionsConnectToConsoleSession.Size = new System.Drawing.Size(245, 22);
_cMenTreeConnectWithOptionsConnectToConsoleSession.Text = "Connect to console session";
_cMenTreeConnectWithOptionsConnectToConsoleSession.Click += OnConnectToConsoleSessionClicked;
//
//
// cMenTreeConnectWithOptionsDontConnectToConsoleSession
//
//
_cMenTreeConnectWithOptionsDontConnectToConsoleSession.Name =
"_cMenTreeConnectWithOptionsDontConnectToConsoleSession";
_cMenTreeConnectWithOptionsDontConnectToConsoleSession.Size = new System.Drawing.Size(245, 22);
_cMenTreeConnectWithOptionsDontConnectToConsoleSession.Text = "Don\'t connect to console session";
_cMenTreeConnectWithOptionsDontConnectToConsoleSession.Visible = false;
_cMenTreeConnectWithOptionsDontConnectToConsoleSession.Click += OnDontConnectToConsoleSessionClicked;
//
//
// cMenTreeConnectWithOptionsConnectInFullscreen
//
//
_cMenTreeConnectWithOptionsConnectInFullscreen.Image = Properties.Resources.FullScreen_16x;
_cMenTreeConnectWithOptionsConnectInFullscreen.Name = "_cMenTreeConnectWithOptionsConnectInFullscreen";
_cMenTreeConnectWithOptionsConnectInFullscreen.Size = new System.Drawing.Size(245, 22);
_cMenTreeConnectWithOptionsConnectInFullscreen.Text = "Connect in fullscreen";
_cMenTreeConnectWithOptionsConnectInFullscreen.Click += OnConnectInFullscreenClicked;
//
//
// cMenTreeConnectWithOptionsNoCredentials
//
//
_cMenTreeConnectWithOptionsNoCredentials.Image = Properties.Resources.UniqueKeyError_16x;
_cMenTreeConnectWithOptionsNoCredentials.Name = "_cMenTreeConnectWithOptionsNoCredentials";
_cMenTreeConnectWithOptionsNoCredentials.Size = new System.Drawing.Size(245, 22);
_cMenTreeConnectWithOptionsNoCredentials.Text = "Connect without credentials";
_cMenTreeConnectWithOptionsNoCredentials.Click += OnConnectWithNoCredentialsClick;
//
//
// cMenTreeConnectWithOptionsChoosePanelBeforeConnecting
//
//
_cMenTreeConnectWithOptionsChoosePanelBeforeConnecting.Image = Properties.Resources.Panel_16x;
_cMenTreeConnectWithOptionsChoosePanelBeforeConnecting.Name =
"_cMenTreeConnectWithOptionsChoosePanelBeforeConnecting";
_cMenTreeConnectWithOptionsChoosePanelBeforeConnecting.Size = new System.Drawing.Size(245, 22);
_cMenTreeConnectWithOptionsChoosePanelBeforeConnecting.Text = "Choose panel before connecting";
_cMenTreeConnectWithOptionsChoosePanelBeforeConnecting.Click += OnChoosePanelBeforeConnectingClicked;
//
//
// cMenTreeConnectWithOptionsViewOnly
//
//
_cMenTreeConnectWithOptionsViewOnly.Image = Properties.Resources.Monitor_16x;
_cMenTreeConnectWithOptionsViewOnly.Name =
"_cMenTreeConnectWithOptionsViewOnly";
_cMenTreeConnectWithOptionsViewOnly.Size = new System.Drawing.Size(245, 22);
_cMenTreeConnectWithOptionsViewOnly.Text = Language.ConnectInViewOnlyMode;
_cMenTreeConnectWithOptionsViewOnly.Click += ConnectWithOptionsViewOnlyOnClick;
//
//
// cMenTreeDisconnect
//
//
_cMenTreeDisconnect.Image = Properties.Resources.Stop_16x;
_cMenTreeDisconnect.Name = "_cMenTreeDisconnect";
_cMenTreeDisconnect.Size = new System.Drawing.Size(199, 22);
_cMenTreeDisconnect.Text = "Disconnect";
_cMenTreeDisconnect.Click += OnDisconnectClicked;
//
//
// cMenTreeSep1
//
//
_cMenTreeSep1.Name = "_cMenTreeSep1";
_cMenTreeSep1.Size = new System.Drawing.Size(196, 6);
//
//
// cMenTreeToolsExternalApps
//
//
_cMenTreeToolsExternalApps.Image = Properties.Resources.Console_16x;
_cMenTreeToolsExternalApps.Name = "_cMenTreeToolsExternalApps";
_cMenTreeToolsExternalApps.Size = new System.Drawing.Size(199, 22);
_cMenTreeToolsExternalApps.Text = "External Applications";
//
//
// cMenTreeToolsTransferFile
//
//
_cMenTreeToolsTransferFile.Image = Properties.Resources.SyncArrow_16x;
_cMenTreeToolsTransferFile.Name = "_cMenTreeToolsTransferFile";
_cMenTreeToolsTransferFile.Size = new System.Drawing.Size(199, 22);
_cMenTreeToolsTransferFile.Text = "Transfer File (SSH)";
_cMenTreeToolsTransferFile.Click += OnTransferFileClicked;
//
//
// cMenTreeSep2
//
//
_cMenTreeSep2.Name = "_cMenTreeSep2";
_cMenTreeSep2.Size = new System.Drawing.Size(196, 6);
//
//
// cMenTreeDuplicate
//
//
_cMenTreeDuplicate.Image = Properties.Resources.Copy_16x;
_cMenTreeDuplicate.Name = "_cMenTreeDuplicate";
_cMenTreeDuplicate.Size = new System.Drawing.Size(199, 22);
_cMenTreeDuplicate.Text = "Duplicate";
_cMenTreeDuplicate.Click += OnDuplicateClicked;
//
//
// cMenTreeRename
//
//
_cMenTreeRename.Image = Properties.Resources.Rename_16x;
_cMenTreeRename.Name = "_cMenTreeRename";
_cMenTreeRename.Size = new System.Drawing.Size(199, 22);
_cMenTreeRename.Text = "Rename";
_cMenTreeRename.Click += OnRenameClicked;
//
//
// cMenTreeDelete
//
//
_cMenTreeDelete.Image = Properties.Resources.Close_16x;
_cMenTreeDelete.Name = "_cMenTreeDelete";
_cMenTreeDelete.Size = new System.Drawing.Size(199, 22);
_cMenTreeDelete.Text = "Delete";
_cMenTreeDelete.Click += OnDeleteClicked;
//
//
// cMenTreeCopyHostname
//
//
_cMenTreeCopyHostname.Name = "_cMenTreeCopyHostname";
_cMenTreeCopyHostname.Size = new System.Drawing.Size(199, 22);
_cMenTreeCopyHostname.Text = "Copy Hostname";
_cMenTreeCopyHostname.Click += OnCopyHostnameClicked;
//
//
// cMenTreeSep3
//
//
_cMenTreeSep3.Name = "_cMenTreeSep3";
_cMenTreeSep3.Size = new System.Drawing.Size(196, 6);
//
//
// cMenTreeImport
//
//
_cMenTreeImport.DropDownItems.AddRange(new ToolStripItem[]
{
_cMenTreeImportFile,
_cMenTreeImportFromRemoteDesktopManager,
_cMenTreeImportActiveDirectory,
_cMenTreeImportPortScan
});
_cMenTreeImport.Name = "_cMenTreeImport";
_cMenTreeImport.Size = new System.Drawing.Size(199, 22);
_cMenTreeImport.Text = "&Import";
//
//
// cMenTreeImportFile
//
//
_cMenTreeImportFile.Name = "_cMenTreeImportFile";
_cMenTreeImportFile.Size = new System.Drawing.Size(226, 22);
_cMenTreeImportFile.Text = "Import from &File...";
_cMenTreeImportFile.Click += OnImportFileClicked;
//
// cMenTreeImportFromRemoteDesktopManager
_cMenTreeImportFromRemoteDesktopManager.Name = "_cMenTreeImportFromRemoteDesktopManager";
_cMenTreeImportFromRemoteDesktopManager.Size = new System.Drawing.Size(226, 22);
_cMenTreeImportFromRemoteDesktopManager.Text = "Import from &Remote Desktop Manager";
_cMenTreeImportFromRemoteDesktopManager.Click += OnImportRemoteDesktopManagerClicked;
//
// cMenTreeImportActiveDirectory
//
//
_cMenTreeImportActiveDirectory.Name = "_cMenTreeImportActiveDirectory";
_cMenTreeImportActiveDirectory.Size = new System.Drawing.Size(226, 22);
_cMenTreeImportActiveDirectory.Text = "Import from &Active Directory...";
_cMenTreeImportActiveDirectory.Click += OnImportActiveDirectoryClicked;
//
//
// cMenTreeImportPortScan
//
//
_cMenTreeImportPortScan.Name = "_cMenTreeImportPortScan";
_cMenTreeImportPortScan.Size = new System.Drawing.Size(226, 22);
_cMenTreeImportPortScan.Text = "Import from &Port Scan...";
_cMenTreeImportPortScan.Click += OnImportPortScanClicked;
//
//
// cMenTreeExportFile
//
//
_cMenTreeExportFile.Name = "_cMenTreeExportFile";
_cMenTreeExportFile.Size = new System.Drawing.Size(199, 22);
_cMenTreeExportFile.Text = "&Export to File...";
_cMenTreeExportFile.Click += OnExportFileClicked;
//
//
// cMenTreeSep4
//
//
_cMenTreeSep4.Name = "_cMenTreeSep4";
_cMenTreeSep4.Size = new System.Drawing.Size(196, 6);
//
//
// cMenTreeAddConnection
//
//
_cMenTreeAddConnection.Image = Properties.Resources.AddItem_16x;
_cMenTreeAddConnection.Name = "_cMenTreeAddConnection";
_cMenTreeAddConnection.Size = new System.Drawing.Size(199, 22);
_cMenTreeAddConnection.Text = "New Connection";
_cMenTreeAddConnection.Click += OnAddConnectionClicked;
//
//
// cMenTreeAddFolder
//
//
_cMenTreeAddFolder.Image = Properties.Resources.AddFolder_16x;
_cMenTreeAddFolder.Name = "_cMenTreeAddFolder";
_cMenTreeAddFolder.Size = new System.Drawing.Size(199, 22);
_cMenTreeAddFolder.Text = "New Folder";
_cMenTreeAddFolder.Click += OnAddFolderClicked;
//
//
// ToolStripSeparator1
//
//
_toolStripSeparator1.Name = "_toolStripSeparator1";
_toolStripSeparator1.Size = new System.Drawing.Size(196, 6);
//
//
// cMenTreeToolsSort
//
//
_cMenTreeToolsSort.DropDownItems.AddRange(new ToolStripItem[]
{
_cMenTreeToolsSortAscending,
@@ -368,41 +377,41 @@ namespace mRemoteNG.UI.Controls
_cMenTreeToolsSort.Name = "_cMenTreeToolsSort";
_cMenTreeToolsSort.Size = new System.Drawing.Size(199, 22);
_cMenTreeToolsSort.Text = "Sort";
//
//
// cMenTreeToolsSortAscending
//
//
_cMenTreeToolsSortAscending.Image = Properties.Resources.SortAscending_16x;
_cMenTreeToolsSortAscending.Name = "_cMenTreeToolsSortAscending";
_cMenTreeToolsSortAscending.Size = new System.Drawing.Size(161, 22);
_cMenTreeToolsSortAscending.Text = "Ascending (A-Z)";
_cMenTreeToolsSortAscending.Click += OnSortAscendingClicked;
//
//
// cMenTreeToolsSortDescending
//
//
_cMenTreeToolsSortDescending.Image = Properties.Resources.SortDescending_16x;
_cMenTreeToolsSortDescending.Name = "_cMenTreeToolsSortDescending";
_cMenTreeToolsSortDescending.Size = new System.Drawing.Size(161, 22);
_cMenTreeToolsSortDescending.Text = "Descending (Z-A)";
_cMenTreeToolsSortDescending.Click += OnSortDescendingClicked;
//
//
// cMenTreeMoveUp
//
//
_cMenTreeMoveUp.Image = Properties.Resources.GlyphUp_16x;
_cMenTreeMoveUp.Name = "_cMenTreeMoveUp";
_cMenTreeMoveUp.Size = new System.Drawing.Size(199, 22);
_cMenTreeMoveUp.Text = "Move up";
_cMenTreeMoveUp.Click += OnMoveUpClicked;
//
//
// cMenTreeMoveDown
//
//
_cMenTreeMoveDown.Image = Properties.Resources.GlyphDown_16x;
_cMenTreeMoveDown.Name = "_cMenTreeMoveDown";
_cMenTreeMoveDown.Size = new System.Drawing.Size(199, 22);
_cMenTreeMoveDown.Text = "Move down";
_cMenTreeMoveDown.Click += OnMoveDownClicked;
//
//
// cMenEditSubMenu
//
//
_cMenInheritanceSubMenu.DropDownItems.AddRange(new ToolStripItem[]
{
_cMenTreeApplyInheritanceToChildren,
@@ -411,16 +420,16 @@ namespace mRemoteNG.UI.Controls
_cMenInheritanceSubMenu.Name = "_cMenInheritanceSubMenu";
_cMenInheritanceSubMenu.Size = new System.Drawing.Size(199, 22);
_cMenInheritanceSubMenu.Text = "Inheritance";
//
//
// _cMenTreeApplyInheritanceToChildren
//
//
_cMenTreeApplyInheritanceToChildren.Name = "_cMenTreeApplyInheritanceToChildren";
_cMenTreeApplyInheritanceToChildren.Size = new System.Drawing.Size(199, 22);
_cMenTreeApplyInheritanceToChildren.Text = "Apply inheritance to children";
_cMenTreeApplyInheritanceToChildren.Click += OnApplyInheritanceToChildrenClicked;
//
//
// _cMenTreeApplyDefaultInheritance
//
//
_cMenTreeApplyDefaultInheritance.Name = "_cMenTreeApplyDefaultInheritance";
_cMenTreeApplyDefaultInheritance.Size = new System.Drawing.Size(199, 22);
_cMenTreeApplyDefaultInheritance.Text = "Apply default inheritance";
@@ -853,6 +862,17 @@ namespace mRemoteNG.UI.Controls
Import.ImportFromFile(selectedNodeAsContainer);
}
private void OnImportRemoteDesktopManagerClicked(object sender, EventArgs e)
{
ContainerInfo selectedNodeAsContainer;
if (_connectionTree.SelectedNode == null)
selectedNodeAsContainer = Runtime.ConnectionsService.ConnectionTreeModel.RootNodes.First();
else
selectedNodeAsContainer =
_connectionTree.SelectedNode as ContainerInfo ?? _connectionTree.SelectedNode.Parent;
Import.ImportFromRemoteDesktopManagerCsv(selectedNodeAsContainer);
}
private void OnImportActiveDirectoryClicked(object sender, EventArgs e)
{
Windows.Show(WindowType.ActiveDirectoryImport);