mirror of
https://github.com/mRemoteNG/mRemoteNG.git
synced 2026-02-17 22:11:48 +08:00
Merge pull request #2208 from Pwnoz0r/MR-887_rdm_import
Add Remote Desktop Manager (Devolutions) Importer
This commit is contained in:
@@ -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)
|
||||
{
|
||||
|
||||
45
mRemoteNG/Config/Import/RemoteDesktopManagerImporter.cs
Normal file
45
mRemoteNG/Config/Import/RemoteDesktopManagerImporter.cs
Normal 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);
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
@@ -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; }
|
||||
}
|
||||
1405
mRemoteNG/Language/Language.Designer.cs
generated
1405
mRemoteNG/Language/Language.Designer.cs
generated
File diff suppressed because it is too large
Load Diff
@@ -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 & 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>
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user