Example #1
0
        public unsafe static void Send(Keys[] keyCodes, ServerBase serverBase)
        {
            Server    serverNode = serverBase.ServerNode;
            RdpClient client     = serverNode.Client;
            IMsRdpClientNonScriptable msRdpClientNonScriptable = (IMsRdpClientNonScriptable)client.GetOcx();
            int num = keyCodes.Length;

            try
            {
                SendKeysData sendKeysData = default(SendKeysData);
                bool *       ptr          = (bool *)sendKeysData.keyUp;
                int *        ptr2         = sendKeysData.keyData;
                int          num2         = 0;
                for (int i = 0; i < num && i < 10; i++)
                {
                    int num3 = (int)Util.MapVirtualKey((uint)keyCodes[i], 0u);
                    sendKeysData.keyData[num2] = num3;
                    sendKeysData.keyUp[num2++] = 0;
                    if (!IsModifier(keyCodes[i]))
                    {
                        for (int num4 = num2 - 1; num4 >= 0; num4--)
                        {
                            sendKeysData.keyData[num2] = sendKeysData.keyData[num4];
                            sendKeysData.keyUp[num2++] = 1;
                        }
                        msRdpClientNonScriptable.SendKeys(num2, ref *ptr, ref *ptr2);
                        num2 = 0;
                    }
                }
            }
            catch
            {
            }
        }
Example #2
0
        private Server addRDPClient(String ip, int port, String username, String password, int timeout)
        {
            Server    server = new Server();
            RdpClient rdp    = null;

            try
            {
                server.ip         = ip;
                server.timeout    = timeout;
                server.serverName = "RDP";
                server.port       = port;
                server.username   = username;
                server.password   = password;
                rdp           = new RdpClient(server);
                server.client = rdp;
                this.rdp_panle.Controls.Add(rdp);
                rdp.OnResponse += rdpResult;
                rdp.Connect(ip, port, username, password);
            }
            catch (Exception e)
            {
                FileTool.log(ip + ":" + port + "-RDP操作异常-" + e.Message);
                LogWarning(ip + ":" + port + "-RDP操作异常-" + e.Message);
                server.isDisConnected = true;
                server.isEndMRE.Set();
            }
            return(server);
        }
Example #3
0
        private void KeepAliveTimer_Tick(object sender, EventArgs e)
        {
            //string data = ((CustomDerivedTimer)sender).Data;
            Debug.WriteLine("{0}|{1:x}|KeepAliveTimer_Tick", DateTime.Now.ToString("o"), GetCurrentThreadId());

            //https://stackoverflow.com/questions/59624421/rdp-activex-sendkeys-winl-to-lock-screen
            //https://stackoverflow.com/questions/1069990/keep-alive-code-fails-with-new-rdp-client
            var timer     = (Timer)sender;
            var rdcServer = (Server)timer.Tag;

            //const uint WM_ACTIVATE = 0x006;
            //const uint WA_ACTIVE = 1;
            //SendMessage(rdcServer.Handle, WM_ACTIVATE, WA_ACTIVE, 0);

            try
            {
                RdpClient rdpClient = Util.GetRdpClient(rdcServer);

                IsActiveWindow(rdpClient.Control);

                rdpClient.Control.WindowTarget.GetType();
                IntPtr hwnd = rdpClient.Control.Handle;
                Debug.WriteLine("{0}|KeepAliveTimer_Tick|rdpClient.Control.Handle={1:x}", DateTime.Now.ToString("o"), hwnd.ToInt64());
                var keyCodes = new Keys[] { Keys.Scroll };                 //Keys.ControlKey, Keys.ShiftKey, Keys.Escape
                Util.SendKeys(keyCodes, rdcServer);
            }
            catch (Exception ex)
            {
                timer.Stop();
                Debug.WriteLine("{0}|{1:x}|KeepAliveTimer_Tick|{2}", DateTime.Now.ToString("o"), GetCurrentThreadId(), ex);
            }

            //https://docs.microsoft.com/en-us/dotnet/api/system.windows.forms.sendkeys.send?view=netcore-3.1
            //SendKeys.Send("{HOME}"); //{SCROLLLOCK}
        }
Example #4
0
 public void rdpResult(ResponseType type, RdpClient rdp, ref Server server)
 {
     //接受事件通知,表示完成后,将当前阻塞线程放过继续执行。
     if (ResponseType.Finished.Equals(type))
     {
         server.isDisConnected = true;
         server.isEndMRE.Set();
     }
 }
Example #5
0
 private void ClearRDP(RdpClient rdp)
 {
     try
     {
         rdp.Dispose();
         this.rdp_panle.Controls.Remove(rdp);
     }
     catch (Exception e) {
         FileTool.log("RDP资源清理异常-" + e.Message);
         LogWarning("RDP资源清理异常-" + e.Message);
     }
 }
Example #6
0
 private void ClearRDP(RdpClient rdp)
 {
     try
     {
         this.rdp_panle.Controls.Remove(rdp);
         if (rdp.IsDisposed == false)
         {
             rdp.Dispose();
         }
     }
     catch (Exception e) {
         FileTool.log("RDP资源清理异常-" + e.Message);
     }
 }
Example #7
0
        public static RdpClient GetRdpClient(Server server)
        {
#if false
            //C# 4.0 (released alongside the .NET Framework 4.0 and Visual Studio 2010)
            dynamic rdcServer = obj.Server;             // private RdpClient _client;
            //'RDCMan.exe' (CLR v4.0.30319: RDCMan.exe): Loaded 'C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\System.Dynamic\v4.0_4.0.0.0__b03f5f7f11d50a3a\System.Dynamic.dll'. Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
            //'RDCMan.exe' (CLR v4.0.30319: RDCMan.exe): Loaded 'Anonymously Hosted DynamicMethods Assembly'.
            //Exception thrown: 'Microsoft.CSharp.RuntimeBinder.RuntimeBinderException' in System.Core.dll
            //An exception of type 'Microsoft.CSharp.RuntimeBinder.RuntimeBinderException' occurred in System.Core.dll but was not handled in user code
            //'RdcMan.Server._client' is inaccessible due to its protection level
            RdpClient rdpClient = rdcServer._client;             // Resolved at runtime, not compile-time
            return(rdpClient);
#else
            return(F_client.GetValue(server) as RdpClient);
#endif
        }
Example #8
0
 private void ClearRDP(Server server)
 {
     try
     {
         RdpClient rdp = server.client;
         if (rdp.Connected != 0)
         {
             rdp.RequestClose();
             rdp.Disconnect();
         }
         rdp.Dispose();
         this.rdp_panle.Controls.Remove(rdp);
     }
     catch (Exception e)
     {
         FileTool.log("RDP资源清理异常-" + e.Message);
         LogWarning("RDP资源清理异常-" + e.Message);
     }
 }
Example #9
0
        private Server addRDPClient(Server server)
        {
            try
            {
                RdpClient rdp = new RdpClient();
                server.client        = rdp;
                server.client.server = server;

                this.rdp_panle.Controls.Add(rdp);
                server.client.OnResponse += rdpResult;
                server.client.ConnectServer(server);
            }
            catch (Exception e)
            {
                FileTool.log(server.ip + ":" + server.port + "-RDP操作异常-" + e.Message);
                LogWarning(server.ip + ":" + server.port + "-RDP操作异常-" + e.Message);
                server.isDisConnected = true;
                server.isEndMRE.Set();
            }
            return(server);
        }
Example #10
0
        private static void Main(string[] args)
        {
            SetupDebug();
            if (args.Length != 3 && args.Length != 4)
            {
                Logit("usage: TestRDPClient hostname remotePort localPort <run-incoming-thread>");
                Trace.Flush();
            }

            remoteHostname = args[0];
            remotePort     = int.Parse(args[1]);
            localPort      = int.Parse(args[2]);

            for (int i = 0; i < 1; i++)
            {
                rdpClient = new RdpClient(localPort + i, 100, 1000, true);
                IPHostEntry IPHost = Dns.GetHostEntry(remoteHostname);
                IPAddress[] addr   = IPHost.AddressList;
                IPEndPoint  sendpt = new IPEndPoint(addr[0], remotePort);
                Logit("Connecting to host " + remoteHostname + ", remotePort " + remotePort + ", localPort " + localPort);
                rdpConnection = rdpClient.Connect(sendpt);
                rdpConnection.WaitForState(ConnectionState.Open);
                Logit("Connection successful");
                Thread outgoingThread = new Thread(RunOutgoing);
                outgoingThread.Start();
                if (args.Length == 4)
                {
                    Thread incomingThread = new Thread(RunIncoming);
                    incomingThread.Start();
                }
                while (outgoingThread.IsAlive)
                {
                    Thread.Sleep(500);
                }
            }
            Trace.Flush();
        }
        public TestClass()
        {
            SetupDebug();

            // const int ServerPort = 200;
            const int ServerPort = 5001;
            const int ClientPort = 6666;

            IPHostEntry IPHost = Dns.GetHostEntry("cedeno-dxp.corp.multiverse.net");

            IPAddress[] addr   = IPHost.AddressList;
            IPEndPoint  sendpt = new IPEndPoint(addr[0], ServerPort);


            RdpClient rdpClient  = new RdpClient(ClientPort, 100, 1000, true);
            RdpClient rdpClient2 = new RdpClient(ClientPort + 1, 100, 1000, false);
            //RdpServer rdpServer = new RdpServer(ServerPort, 100, 1000, true);

            RdpConnection rdpClientConn  = rdpClient.Connect(sendpt);
            RdpConnection rdpClientConn2 = rdpClient2.Connect(sendpt);

            // RdpConnection rdpServerConn = rdpServer.Accept();

            rdpClientConn.WaitForState(ConnectionState.Open);
            rdpClientConn2.WaitForState(ConnectionState.Open);

//            Console.WriteLine("Server State = " + rdpServerConn.ConnectionState);
            Console.WriteLine("Client State = " + rdpClientConn.ConnectionState);

            OutgoingMessage outMessage = new OutgoingMessage();

            outMessage.Write("Good morning");
            outMessage.Send(rdpClientConn);

            outMessage.Send(rdpClientConn2);

            // byte[] msg = Encoding.ASCII.GetBytes("Test");

            // rdpClientConn.Send(msg);
            // rdpClientConn.Send(msg);
            // rdpClientConn.Send(msg);

            IPEndPoint      remoteEP = new IPEndPoint(IPAddress.Any, 0);
            IncomingMessage inMessage;

            inMessage = new IncomingMessage(rdpClientConn);
            Console.WriteLine("Got message: {0}", inMessage.ReadString());

            inMessage = new IncomingMessage(rdpClientConn2);
            Console.WriteLine("Got message2: {0}", inMessage.ReadString());

            //            for (int i = 0; i < 3; ++i) {
//                byte[] rcvdMessage = rdpServerConn.Receive(ref remoteEP);
//                Console.WriteLine("Server got message from {1}: '{0}'",
//                                  Encoding.ASCII.GetString(rcvdMessage), remoteEP);
//                rdpServerConn.Send(msg);
//            }
//
//            for (int i = 0; i < 3; ++i) {
//                byte[] rcvdMessage = rdpClientConn.Receive(ref remoteEP);
//                Console.WriteLine("Client got message from {1}: '{0}'",
//                                  Encoding.ASCII.GetString(rcvdMessage), remoteEP);
//            }
//
//            rdpServerConn.Close();

            Thread.Sleep(100);

//            Console.WriteLine("Server State = " + rdpServerConn.ConnectionState);
            Console.WriteLine("Client State = " + rdpClientConn.ConnectionState);

            Thread.Sleep(31000);

//            Console.WriteLine("Server State = " + rdpServerConn.ConnectionState);
            Console.WriteLine("Client State = " + rdpClientConn.ConnectionState);

            FinishDebug();

            //rdpConn.Open(false, 1, 2, 3, 4, true);
            //rdpConn.Send(new Multiverse.Network.Rdp.RdpPacket(50));
            //this.Hide();
            //this.WindowState = FormWindowState.Minimized;
        }
Example #12
0
        public RdpHost()
        {
            Rdp = RdpClient.Create();

            InitializeComponent();
        }
Example #13
0
        private void Server_ConnectionStateChanged(ConnectionStateChangedEventArgs obj)
        {
            Debug.WriteLine("{0}|{1:x}|Server_ConnectionStateChanged|{2}:{3}", DateTime.Now.ToString("o"), GetCurrentThreadId(), obj.Server.Text, obj.State.ToString());
            RdpClient rdpClient = Util.GetRdpClient(obj.Server);

            if (ConnectionState.Connected == obj.State)
            {
                if (rdpClient.Control.InvokeRequired)
                {
                    Debug.WriteLine("in non-UI Thread");
                    rdpClient.Control.Invoke(new MethodInvoker(() => StartKeepTimer(obj.Server)));
                }
                else
                {
                    StartKeepTimer(obj.Server);
                }
                if (Dispatcher.CurrentDispatcher.Thread == Thread.CurrentThread)
                {
                    Debug.WriteLine("Do something on current dispatcher");
                }
                Dispatcher dispatcher = Dispatcher.FromThread(Thread.CurrentThread);
                if (null != dispatcher)
                {
                    Debug.WriteLine("We know the thread have a dispatcher that we can use");
                }
            }
            else
            {
                if (serverTimers.TryGetValue(obj.Server, out Timer timer))
                {
                    timer.Stop();
                    serverTimers.Remove(obj.Server);
                }
            }
            //if Server#ConnectionStateChanged is Disconnected, rdpClient is null.
            if (null != rdpClient)
            {
                Debug.WriteLine(rdpClient.DesktopSize.ToFormattedString(), "Server_ConnectionStateChanged");
                //IMsRdpClientNonScriptable ocx = (IMsRdpClientNonScriptable)rdpClient.MsRdpClient8.GetOcx();
                ////https://docs.microsoft.com/zh-cn/windows/win32/termserv/imsrdpclientadvancedsettings-keepaliveinterval
                //rdpClient.MsRdpClient8.AdvancedSettings8.keepAliveInterval = 1;
                //rdpClient.MsRdpClient.AdvancedSettings.allowBackgroundInput = 1;
                ////https://docs.microsoft.com/zh-cn/windows/win32/termserv/imsrdpclientadvancedsettings-minutestoidletimeout
                //rdpClient.MsRdpClient8.AdvancedSettings2.MinutesToIdleTimeout = 1;

                //https://docs.microsoft.com/zh-cn/windows/win32/termserv/imsrdpclientnonscriptable-sendkeys
                //Now reference the dll and you can use it with bool[] and int[] parameters. For CTRL+ALT+DEL:
                //0x1d: CONTROL, 0x38: MENU/ALT, 0x53: DEL
                bool[] bools = { false, false, false, true, true, true, };
                int[]  ints  = { 0x1d, 0x38, 0x53, 0x53, 0x38, 0x1d };
                //Focus helps to avoid most E_FAIL exceptions
                //rdp.Focus();

                //unsafe void SendKeys(int numKeys, int* pbArrayKeyUp, int* plKeyData);
                //fixed (bool* pKeyReleased = bools)
                //fixed (int* pScanCodes = ints)
                //{
                //    m_ComInterface.SendKeys(keyScanCodes.Length, pKeyReleased, pScanCodes);
                //}
#if false
                bool bArrayKeyUp = true;             //Key Released
                int  lKeyData    = 0x1d;             //Scan Codes
                try
                {
                    rdpClient.ClientNonScriptable3.SendKeys(1, ref bArrayKeyUp, ref lKeyData);
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
#endif
            }
        }