Пример #1
0
        public void Open(DbItemRemoteLink linkSettings, DbItemSetting itemSetting, bool jump)
        {
            _itemRemoteLink = linkSettings;
            if (linkSettings.Password == null)
            {
                linkSettings.Password = "";
            }

            Title = linkSettings.Name;
            Window mainWindow = Application.Current.MainWindow;

            Width  = linkSettings.ExternalWindowWidth > MinWidth ? linkSettings.ExternalWindowWidth : mainWindow.Width;
            Height = linkSettings.ExternalWindowHeight > MinHeight ? linkSettings.ExternalWindowHeight : mainWindow.Height;

            try
            {
                Show();
                FinalItemSetting finalItemSetting = null;
                if (linkSettings.Type == (int)RemoteType.rdp)
                {
                    _remoteControl   = new RemoteControl_rdp(this);
                    finalItemSetting = new FinalItemSetting_rdp((DbItemSetting_rdp)itemSetting);
                }
                if (linkSettings.Type == (int)RemoteType.ssh)
                {
                    _remoteControl   = new RemoteControl_ssh(this);
                    finalItemSetting = new FinalItemSetting_ssh((DbItemSetting_ssh)itemSetting);
                }
                if (linkSettings.Type == (int)RemoteType.telnet)
                {
                    _remoteControl   = new RemoteControl_telnet(this);
                    finalItemSetting = new FinalItemSetting_telnet((DbItemSetting_telnet)itemSetting);
                }
                if (_remoteControl == null)
                {
                    throw new Exception("可能是不支持的远程连接类型。");
                }
                _remoteControl.Visibility  = Visibility.Collapsed;
                Panel_Animation.Visibility = Visibility.Visible;
                Grid.Children.Add(_remoteControl);

                _remoteControl.OnConnected  = _remoteControl_OnConnected;
                _remoteControl.OnFatalError = OnFatalError;
                _remoteControl.OnNonfatal   = OnNonfatal;
                _remoteControl.Closed       = Remove;
                _remoteControl.FullScreen   = FullScreen;

                _remoteControl.Connect(linkSettings, finalItemSetting);
                _startFullScreen = finalItemSetting.FullScreen;
            }
            catch (Exception e)
            {
                OnFatalError("错误", $"远程桌面连接失败。\n原因:{e.Message}");
            }
        }
Пример #2
0
        public override void Loaded(DbItemRemoteLink itemRemoteLink)
        {
            var itemRdpSetting = DatabaseServices.GetRemoteSetting(itemRemoteLink) as DbItemSettingTelnet;

            if (itemRdpSetting != null)
            {
                _remoteName = itemRemoteLink.Name;
                DataContext = itemRdpSetting;
                ItemSetting = itemRdpSetting;
                itemRdpSetting.PropertyChanged += PropertyChanged;
                PART_Putty.Loaded(itemRemoteLink);
            }
        }
        public override void Connect(DbItemRemoteLink linkSettings, FinalItemSetting finalItemSetting)
        {
            string[] values = linkSettings.Server.Split(':');
            if (values.Length > 2)
            {
                throw new Exception($"服务器地址不正确。");                   //地址不正确
            }
            string server = values[0];
            string port   = values.Length == 2 ? $"-P {values[1]}" : "-P 23";

            FinalItemSetting_telnet finalSetting = (FinalItemSetting_telnet)finalItemSetting;

            IntPtr parentHwnd = FormsControl.Handle;
            Window windows    = Window.GetWindow(this);
            int    width      = (int)windows.Width - 4;
            int    height     = (int)windows.Height - 34;

            Task.Run(() =>
            {
                Putty.Settings settings = new Putty.Settings
                {
                    fontname          = finalSetting.FontName,
                    fontsize          = finalSetting.FontSize,
                    curtype           = finalSetting.Cursor - 1,
                    linecodepage      = Encoding.GetEncoding(finalSetting.Character).BodyName,
                    backspaceisdelete = finalSetting.Fallbackkeys - 1,
                    mouseisxterm      = finalSetting.MouseAction - 1,
                    puttycolor        = new Putty.PuttyColor(finalSetting.GetPuttyColor()),
                    rxvthomeend       = finalSetting.HomeAndEnd - 1,
                    functionkeys      = finalSetting.FnAndKeypad - 1,
                    cjkambigwide      = finalSetting.CJKAmbigWide.Value,
                    capslockcyr       = finalSetting.CapsLockCyr.Value,
                    crimplieslf       = finalSetting.CRImpliesLF.Value,
                    lfimpliescr       = finalSetting.LFImpliesCR.Value,
                };

                string user = string.IsNullOrEmpty(linkSettings.UserName) ? "" : $"-l {linkSettings.UserName}";
                string pw   = string.IsNullOrEmpty(linkSettings.Password) ? "" : $"-pw {linkSettings.Password}";

                if (!_putty.Create(parentHwnd, $"-telnet {port} {user} {pw} {server}", 0, 0, width, height, settings))
                {
                    string errorText = Marshal.PtrToStringAnsi(_putty.GetError());
                    Dispatcher.Invoke(() => { OnFatalError?.Invoke("错误", errorText); });
                }

                _putty.Dispose();
                _putty = null;
                GC.Collect();
                GC.SuppressFinalize(this);
            });
        }
Пример #4
0
        public void Open(DbItemRemoteLink linkSettings, DbItemSetting itemSetting, bool jump)
        {
            _tabItem = MainWindow.AddTabItem(linkSettings.Name, this, jump);
            if (linkSettings.Password == null)
            {
                linkSettings.Password = "";
            }
            _tabItem.Closed = _tabItem_Closed;

            try
            {
                FinalItemSetting finalItemSetting = null;
                if (linkSettings.Type == (int)RemoteType.rdp)
                {
                    _remoteControl   = new RemoteControl_rdp(this);
                    finalItemSetting = new FinalItemSetting_rdp((DbItemSetting_rdp)itemSetting);
                }
                if (linkSettings.Type == (int)RemoteType.ssh)
                {
                    _remoteControl   = new RemoteControl_ssh(this);
                    finalItemSetting = new FinalItemSetting_ssh((DbItemSetting_ssh)itemSetting);
                }
                if (linkSettings.Type == (int)RemoteType.telnet)
                {
                    _remoteControl   = new RemoteControl_telnet(this);
                    finalItemSetting = new FinalItemSetting_telnet((DbItemSetting_telnet)itemSetting);
                }
                if (_remoteControl == null)
                {
                    throw new Exception("可能是不支持的远程连接类型。");
                }
                _remoteControl.Visibility  = Visibility.Collapsed;
                Panel_Animation.Visibility = Visibility.Visible;
                Grid.Children.Add(_remoteControl);

                _remoteControl.OnConnected  = _remoteControl_OnConnected;
                _remoteControl.OnFatalError = OnFatalError;
                _remoteControl.OnNonfatal   = OnNonfatal;
                _remoteControl.Closed       = Remove;
                _remoteControl.FullScreen   = FullScreen;

                _remoteControl.Connect(linkSettings, finalItemSetting);
                _startFullScreen = finalItemSetting.FullScreen;
            }
            catch (Exception e)
            {
                OnFatalError("错误", $"远程桌面连接失败。\n原因:{e.Message}");
            }
        }
Пример #5
0
 /// <summary>
 /// 获取远程桌面的设置信息,包含分辨率和音频重定向等.
 /// </summary>
 public static DbItemSetting GetRemoteSetting(DbItemRemoteLink itemRemoteLink)
 {
     if (itemRemoteLink.Type == (int)RemoteType.rdp)
     {
         return(_tableSetting_rdp.FindById(itemRemoteLink.Id));
     }
     if (itemRemoteLink.Type == (int)RemoteType.ssh)
     {
         return(_tableSetting_ssh.FindById(itemRemoteLink.Id));
     }
     if (itemRemoteLink.Type == (int)RemoteType.telnet)
     {
         return(_tableSetting_telnet.FindById(itemRemoteLink.Id));
     }
     return(null);
 }
Пример #6
0
 public void Load(DbItemRemoteLink itemRemoteLink)
 {
     //清除ComboBox_SelectionChanged的事件,避免更改DataContext后立即引发事件
     foreach (var item in Grid_ssh.GetChildObjects <ComboBox>())
     {
         item.SelectionChanged -= ComboBox_SelectionChanged;
     }
     _itemSshSetting = (DbItemSetting_ssh)Database.GetRemoteSetting(itemRemoteLink);
     DataContext     = _itemSshSetting;
     SSH_ComboBox_FontName.SelectedIndex  = Array.FindIndex(GlobalSetting.EqualWidthFonts, m => m == _itemSshSetting.FontName) + 1;
     SSH_ComboBox_Character.SelectedIndex = Array.FindIndex(GlobalSetting.Encodings, m => m.CodePage == _itemSshSetting.Character) + 1;
     SSH_ComboBox_Color.SelectedIndex     = Array.FindIndex(GlobalSetting.PuttyColorlNames, m => m == _itemSshSetting.ColorScheme) + 1;
     foreach (var item in Grid_ssh.GetChildObjects <ComboBox>())
     {
         item.SelectionChanged += ComboBox_SelectionChanged;
     }
 }
Пример #7
0
        /// <summary>打开远程桌面</summary>
        public static void OpenRemote(RemoteTreeViewItem treeTtem, int openMode)
        {
            IRemoteControl   remoteControl  = null;
            DbItemRemoteLink itemRemoteLink = Database.GetRemoteLink(treeTtem.uuid);

            if (string.IsNullOrEmpty(itemRemoteLink.Server))
            {
                throw new Exception("服务器地址不能为空。");
            }

            DbItemSetting itemSetting = Database.GetRemoteSetting(itemRemoteLink);

            if (openMode == DbItemSetting.OPEN_DEFAULT)
            {
                openMode = new FinalItemSetting(itemSetting).OpenMode;
            }

            //如果指定的远程桌面有在后台运行,则跳转
            if (_remoteRunTime.ContainsKey(treeTtem.uuid))
            {
                var value = _remoteRunTime[treeTtem.uuid];
                if (value.OpenMode == openMode)
                {
                    value.RemoteControl.Jump();
                    return;
                }
                value.RemoteControl.Remove();
                _remoteRunTime.Remove(treeTtem.uuid);
            }

            //开始连接远程桌面
            if (openMode == DbItemSetting.OPEN_WINDOW)
            {
                remoteControl = new RemoteWinControl();
            }
            else
            {
                remoteControl = new RemoteTabControl();
            }
            remoteControl.Open(itemRemoteLink, itemSetting, openMode == DbItemSetting.OPEN_TAB);
            _remoteRunTime.Add(treeTtem.uuid, new RemoteRunTime(openMode, remoteControl));
            remoteControl.OnRemove += (sender, e) => _remoteRunTime.Remove(treeTtem.uuid);
        }
Пример #8
0
        private void Home_Tree_EditHeaderClosing(object sender, CancelEditEventArgs e)
        {
            RemoteTreeViewItem treeItem = ((RemoteTreeViewItem)sender); if (treeItem == null)

            {
                return;
            }

            if (string.IsNullOrEmpty(e.NewValue))
            {
                MainWindow.ShowMessageDialog("提示", "名称不能为空");
                e.Cancel = true;
                return;
            }

            if (treeItem.RemoteType == RemoteType.dir)
            {
                DbItemDirectory itemDirectory = Database.GeyDirectory(treeItem.uuid);
                itemDirectory.Name = e.NewValue;
                Database.Update(itemDirectory.Id, itemDirectory);
            }
            else
            {
                if (_itemRemoteLink != null && _itemRemoteLink.Id == treeItem.uuid)
                {
                    _itemRemoteLink.Name = e.NewValue;
                    Database.Update(_itemRemoteLink.Id, _itemRemoteLink);
                    TextBox_Name.Text = e.NewValue;
                }
                else
                {
                    DbItemRemoteLink itemRemoteLink = Database.GetRemoteLink(treeItem.uuid);
                    itemRemoteLink.Name = e.NewValue;
                    Database.Update(itemRemoteLink.Id, itemRemoteLink);
                }
            }
        }
Пример #9
0
        public static string Insert(DbItemRemoteLink itemRemoteLink, DbItemSetting itemSetting)
        {
            itemRemoteLink.Id = ObjectId.NewObjectId().ToString();
            itemSetting.Id    = itemRemoteLink.Id;

            if (itemRemoteLink.Type == (int)RemoteType.rdp)
            {
                _tableSetting_rdp.Insert((DbItemSettingRdp)itemSetting);
            }
            else if (itemRemoteLink.Type == (int)RemoteType.ssh)
            {
                _tableSetting_ssh.Insert((DbItemSettingSsh)itemSetting);
            }
            else if (itemRemoteLink.Type == (int)RemoteType.telnet)
            {
                _tableSetting_telnet.Insert((DbItemSettingTelnet)itemSetting);
            }
            else
            {
                return(null);
            }

            return(_tableRemoteLink.Insert(itemRemoteLink));
        }
Пример #10
0
        public override void Connect(DbItemRemoteLink linkSettings, DbItemSetting lastSetting)
        {
            DbItemSettingRdp lastSettingRdp = lastSetting as DbItemSettingRdp;

            if (lastSettingRdp == null)
            {
                return;
            }

            //分离服务器地址和端口
            string[] addr = linkSettings.Server.Split(':');
            int      port = 3389;

            if (addr.Length > 1)
            {
                int.TryParse(addr[1], out port);
            }
            if (port <= 0)
            {
                port = 3389;
            }

            //初始化远程连接属性
            if (MsRdpClient7 != null) //win7及以下版本
            {
                MsRdpClient7.Server   = addr[0];
                MsRdpClient7.UserName = linkSettings.UserName;
                MsRdpClient7.AdvancedSettings2.ClearTextPassword = linkSettings.Password;
                MsRdpClient7.AdvancedSettings2.RDPPort           = port;
                MsRdpClientOcx = (IMsRdpClientNonScriptable5)MsRdpClient7.GetOcx();
                MsRdpClientOcx.PromptForCredentials         = false; //凭据提示对话框
                MsRdpClientOcx.AllowPromptingForCredentials = true;  //显示密码输入框
                MsRdpClientOcx.DisableConnectionBar         = true;  //禁用连接栏

                //将窗口句柄设置或检索为控件显示的任何对话框的父窗口
                var parentHwnd = CommonServices.HWNDtoRemotableHandle(new WindowInteropHelper(Window.GetWindow(this)).Handle);
                MsRdpClientOcx.set_UIParentWindowHandle(ref parentHwnd);

                MsRdpClient7.AdvancedSettings.BitmapPeristence           = 1;     //启用位图缓存
                MsRdpClient7.AdvancedSettings.Compress                   = 1;     //启用压缩
                MsRdpClient7.AdvancedSettings.ContainerHandledFullScreen = 1;     //启用容器处理的全屏模式。
                MsRdpClient7.AdvancedSettings2.BitmapPersistence         = 1;     //持久位图缓存
                MsRdpClient7.AdvancedSettings2.CachePersistenceActive    = 1;     //持久位图缓存
                MsRdpClient7.AdvancedSettings2.GrabFocusOnConnect        = false; //连接的时候获取焦点
                MsRdpClient7.AdvancedSettings7.EnableCredSspSupport      = true;  //指定是否为此连接启用凭据安全服务提供程序

                //分辨率
                if (lastSettingRdp.SizeIndex == DbItemSetting.DESKSIZE_AUTO)//自适应分辨率
                {
                    Window windows = Window.GetWindow(this);
                    MsRdpClient7.DesktopWidth  = (int)windows.Width - 4;
                    MsRdpClient7.DesktopHeight = (int)windows.Height - 34;
                }
                else
                {
                    var size = lastSettingRdp.GetDeskTopSize();
                    MsRdpClient7.DesktopWidth  = (int)size.Width;
                    MsRdpClient7.DesktopHeight = (int)size.Height;
                }

                //性能选项
                if (lastSettingRdp.Performance != DbItemSettingRdp.CONNECTION_TYPE_AUTO)
                {
                    MsRdpClient7.AdvancedSettings8.NetworkConnectionType = (uint)lastSettingRdp.Performance;
                }
                //颜色深度
                switch (lastSettingRdp.ColorDepthMode)
                {
                case DbItemSettingRdp.COLOR_15BPP: MsRdpClient7.ColorDepth = 15; break;

                case DbItemSettingRdp.COLOR_16BPP: MsRdpClient7.ColorDepth = 16; break;

                case DbItemSettingRdp.COLOR_24BPP: MsRdpClient7.ColorDepth = 24; break;

                case DbItemSettingRdp.COLOR_32BPP: MsRdpClient7.ColorDepth = 32; break;

                default: MsRdpClient7.ColorDepth = 32; break;
                }
                //音频
                MsRdpClient7.AdvancedSettings6.AudioRedirectionMode = (uint)lastSettingRdp.AudioRedirectionMode - 1;
                //组合键
                MsRdpClient7.SecuredSettings2.KeyboardHookMode = lastSettingRdp.KeyboardHookMode - 1;
                //本地资源
                MsRdpClient7.AdvancedSettings2.RedirectPrinters   = lastSettingRdp.RedirectionPrintf.Value ? true : false;    //打印机
                MsRdpClient7.AdvancedSettings6.RedirectClipboard  = lastSettingRdp.RedirectionClipboard.Value ? true : false; //剪贴板重定向
                MsRdpClient7.AdvancedSettings3.RedirectSmartCards = lastSettingRdp.RedirectionsMartcard.Value ? true : false; //智能卡重定向
                MsRdpClient7.AdvancedSettings3.RedirectPorts      = lastSettingRdp.RedirectionsPort.Value ? true : false;     //端口重定向
                MsRdpClient7.AdvancedSettings3.RedirectDrives     = lastSettingRdp.RedirectionsDriver.Value ? true : false;   //驱动器重定向


                MsRdpClient7.AdvancedSettings4.ConnectionBarShowMinimizeButton = false;//显示全部工具栏上的最小化按钮
                MsRdpClient7.AdvancedSettings7.ConnectToAdministerServer       = false;

                MsRdpClient7.Connect();
                User32.EnumChildWindows(MsRdpClient7.Handle, EnumWindowsProc, IntPtr.Zero);
            }
            else //win8 及以上版本
            {
                MsRdpClient9.Server   = addr[0];
                MsRdpClient9.UserName = linkSettings.UserName;
                MsRdpClient9.AdvancedSettings2.ClearTextPassword = linkSettings.Password;
                MsRdpClient9.AdvancedSettings2.RDPPort           = port;
                MsRdpClientOcx = (IMsRdpClientNonScriptable5)MsRdpClient9.GetOcx();
                MsRdpClientOcx.PromptForCredentials         = false; //凭据提示对话框
                MsRdpClientOcx.AllowPromptingForCredentials = true;  //显示密码输入框
                MsRdpClientOcx.DisableConnectionBar         = true;  //禁用连接栏

                //将窗口句柄设置或检索为控件显示的任何对话框的父窗口
                var parentHwnd = CommonServices.HWNDtoRemotableHandle(new WindowInteropHelper(Window.GetWindow(this)).Handle);
                MsRdpClientOcx.set_UIParentWindowHandle(ref parentHwnd);

                MsRdpClient9.AdvancedSettings.BitmapPeristence           = 1;     //启用位图缓存
                MsRdpClient9.AdvancedSettings.Compress                   = 1;     //启用压缩
                MsRdpClient9.AdvancedSettings.ContainerHandledFullScreen = 1;     //启用容器处理的全屏模式。
                MsRdpClient9.AdvancedSettings2.BitmapPersistence         = 1;     //持久位图缓存
                MsRdpClient9.AdvancedSettings2.CachePersistenceActive    = 1;     //持久位图缓存
                MsRdpClient9.AdvancedSettings2.GrabFocusOnConnect        = false; //连接的时候获取焦点
                MsRdpClient9.AdvancedSettings7.EnableCredSspSupport      = true;  //指定是否为此连接启用凭据安全服务提供程序

                //分辨率
                if (lastSettingRdp.SizeIndex == DbItemSetting.DESKSIZE_AUTO)//自适应分辨率
                {
                    Window windows = Window.GetWindow(this);
                    MsRdpClient9.DesktopWidth  = (int)windows.Width - 4;
                    MsRdpClient9.DesktopHeight = (int)windows.Height - 34;
                }
                else
                {
                    var size = lastSettingRdp.GetDeskTopSize();
                    MsRdpClient9.DesktopWidth  = (int)size.Width;
                    MsRdpClient9.DesktopHeight = (int)size.Height;
                }
                //性能选项
                if (lastSettingRdp.Performance == DbItemSettingRdp.CONNECTION_TYPE_AUTO)
                {
                    MsRdpClient9.AdvancedSettings9.BandwidthDetection = true;                                                                     //自动检查带宽
                }
                else
                {
                    MsRdpClient9.AdvancedSettings8.NetworkConnectionType = (uint)lastSettingRdp.Performance;
                }
                //颜色深度
                switch (lastSettingRdp.ColorDepthMode)
                {
                case DbItemSettingRdp.COLOR_15BPP: MsRdpClient9.ColorDepth = 15; break;

                case DbItemSettingRdp.COLOR_16BPP: MsRdpClient9.ColorDepth = 16; break;

                case DbItemSettingRdp.COLOR_24BPP: MsRdpClient9.ColorDepth = 24; break;

                case DbItemSettingRdp.COLOR_32BPP: MsRdpClient9.ColorDepth = 32; break;

                default: MsRdpClient9.ColorDepth = 32; break;
                }
                //音频
                MsRdpClient9.AdvancedSettings6.AudioRedirectionMode = (uint)lastSettingRdp.AudioRedirectionMode - 1;
                //录音设备
                MsRdpClient9.AdvancedSettings8.AudioCaptureRedirectionMode = lastSettingRdp.AudioCaptureRedirectionMode == DbItemSettingRdp.AAUDIOCAPTURE_TRUE;
                //组合键
                MsRdpClient9.SecuredSettings2.KeyboardHookMode = lastSettingRdp.KeyboardHookMode - 1;
                //重定向
                MsRdpClient9.AdvancedSettings2.RedirectPrinters   = lastSettingRdp.RedirectionPrintf.Value ? true : false;    //打印机
                MsRdpClient9.AdvancedSettings6.RedirectClipboard  = lastSettingRdp.RedirectionClipboard.Value ? true : false; //剪贴板重定向
                MsRdpClient9.AdvancedSettings3.RedirectSmartCards = lastSettingRdp.RedirectionsMartcard.Value ? true : false; //智能卡重定向
                MsRdpClient9.AdvancedSettings3.RedirectPorts      = lastSettingRdp.RedirectionsPort.Value ? true : false;     //端口重定向
                MsRdpClient9.AdvancedSettings3.RedirectDrives     = lastSettingRdp.RedirectionsDriver.Value ? true : false;   //驱动器重定向
                MsRdpClient9.AdvancedSettings4.ConnectionBarShowMinimizeButton = false;                                       //显示全部工具栏上的最小化按钮

                MsRdpClient9.Connect();
                User32.EnumChildWindows(MsRdpClient9.Handle, EnumWindowsProc, IntPtr.Zero);
            }
        }
Пример #11
0
 /// <summary>
 /// 更新指定的条目连接信息.
 /// </summary>
 public static bool Update(string id, DbItemRemoteLink document)
 {
     return(_tableRemoteLink.Update(id, document));
 }
Пример #12
0
 public void Load(DbItemRemoteLink itemRemoteLink)
 {
     _itemRdpSetting = (DbItemSetting_rdp)Database.GetRemoteSetting(itemRemoteLink);
     DataContext     = _itemRdpSetting;
 }
Пример #13
0
 public new virtual void Loaded(DbItemRemoteLink itemRemoteLink)
 {
 }
Пример #14
0
        private void TreeView_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs <object> e)
        {
            if (e.NewValue != null)
            {
                if (_itemRemoteLink != null)
                {
                    Database.Update(_itemRemoteLink.Id, _itemRemoteLink);
                }
                RemoteTreeViewItem selectItem = (RemoteTreeViewItem)e.NewValue;

                if (selectItem.RemoteType != RemoteType.dir)
                {
                    ScrollViewer.Visibility   = Visibility.Visible;
                    _itemRemoteLink           = Database.GetRemoteLink(selectItem.uuid);
                    ScrollViewer.DataContext  = _itemRemoteLink;
                    TextBox_Password.Password = _itemRemoteLink.Password;
                    TextBox_Name.Text         = _itemRemoteLink.Name;

                    switch (selectItem.RemoteType)
                    {
                    case RemoteType.rdp:
                        Expander_Setting.Content = _home_Remote_rdp;
                        _home_Remote_rdp.Load(_itemRemoteLink);
                        Grid_PrivateKey.Visibility = Visibility.Collapsed;
                        break;

                    case RemoteType.ssh:
                        //加载私钥
                        if (_itemRemoteLink.PrivateKey == null)
                        {
                            CheckBox_PrivateKey.IsChecked = false;
                        }
                        else
                        {
                            CheckBox_PrivateKey.IsChecked = true;
                        }
                        CheckBox_PrivateKey_Click(null, null);

                        Expander_Setting.Content = _home_Remote_ssh;
                        _home_Remote_ssh.Load(_itemRemoteLink);
                        Grid_PrivateKey.Visibility = Visibility.Visible;
                        break;

                    case RemoteType.telnet:
                        Expander_Setting.Content = _home_Remote_telnet;
                        _home_Remote_telnet.Load(_itemRemoteLink);
                        TextBox_Password.IsEnabled = true;
                        Grid_PrivateKey.Visibility = Visibility.Collapsed;
                        break;

                    default:
                        Expander_Setting.Content = null;
                        break;
                    }
                }
                else
                {
                    ScrollViewer.Visibility = Visibility.Collapsed;
                }
            }
        }
Пример #15
0
 public override void Loaded(DbItemRemoteLink itemRemoteLink)
 {
     PART_Utility.Loaded(itemRemoteLink);
 }
Пример #16
0
        public override void Connect(DbItemRemoteLink linkSettings, DbItemSetting lastSetting)
        {
            DbItemSettingSsh lastSettingSsh = lastSetting as DbItemSettingSsh;

            if (lastSettingSsh == null)
            {
                return;
            }

            string[] values = linkSettings.Server.Split(':');
            if (values.Length > 2)
            {
                throw new Exception($"服务器地址不正确。");                   //地址不正确
            }
            string server = values[0];
            string port   = values.Length == 2 ? $"-P {values[1]}" : "-P 22";

            IntPtr parentHwnd = FormsControl.Handle;
            Window windows    = Window.GetWindow(this);
            int    width      = (int)windows.Width - 4;
            int    height     = (int)windows.Height - 34;
            Thread thread     = new Thread(() =>
            {
                Putty.Settings settings = new Putty.Settings
                {
                    fontname          = lastSettingSsh.FontName,
                    fontsize          = lastSettingSsh.FontSize,
                    curtype           = lastSettingSsh.Cursor - 1,
                    linecodepage      = Encoding.GetEncoding(lastSettingSsh.Character).BodyName,
                    backspaceisdelete = lastSettingSsh.Fallbackkeys - 1,
                    mouseisxterm      = lastSettingSsh.MouseAction - 1,
                    puttycolor        = new Putty.PuttyColor(lastSettingSsh.GetPuttyColor()),
                    rxvthomeend       = lastSettingSsh.HomeAndEnd - 1,
                    functionkeys      = lastSettingSsh.FnAndKeypad - 1,
                    cjkambigwide      = lastSettingSsh.CJKAmbigWide.Value,
                    capslockcyr       = lastSettingSsh.CapsLockCyr.Value,
                    crimplieslf       = lastSettingSsh.CRImpliesLF.Value,
                    lfimpliescr       = lastSettingSsh.LFImpliesCR.Value,
                };

                string user = string.IsNullOrEmpty(linkSettings.UserName) ? "" : $"-l {linkSettings.UserName}";
                string pw   = null;
                if (string.IsNullOrWhiteSpace(linkSettings.PrivateKey))
                {
                    pw = string.IsNullOrEmpty(linkSettings.Password) ? "" : $"-pw {linkSettings.Password}";
                }
                else
                {
                    _privateKey = Path.GetTempPath() + linkSettings.Id;
                    using (StreamWriter streamWriter = new StreamWriter(_privateKey, false, Encoding.ASCII))
                    {
                        streamWriter.Write(linkSettings.PrivateKey);
                        streamWriter.Flush();
                    }
                    pw = $"-i \"{_privateKey}\"";
                }

                if (!_putty.Create(parentHwnd, $"-ssh {port} {user} {pw} {server}", 0, 0, width, height, settings))
                {
                    string errorText = Marshal.PtrToStringAnsi(_putty.GetError());
                    Dispatcher.Invoke(() => { OnFatalError?.Invoke("错误", errorText); });
                }

                _putty.Dispose();
                _putty = null;
                if (_privateKey != null)
                {
                    File.Delete(_privateKey);
                }
                GC.Collect();
                GC.SuppressFinalize(this);
            });

            thread.Start();
        }