Example #1
0
 private static async void Pipe_ClientMessage(NamedPipeWrapper.NamedPipeConnection <RPAMessage, RPAMessage> connection, RPAMessage message)
 {
     if (message.command == "pong")
     {
         return;
     }
     if (message.command == "hello")
     {
         var windowsusername = message.windowsusername.ToLower();
         var session         = sessions.Where(x => x.client.windowsusername == windowsusername).FirstOrDefault();
         if (session == null)
         {
             //Log.Information("Adding new unattendedclient for " + windowsusername);
             string computername = NativeMethods.GetHostName().ToLower();
             string computerfqdn = NativeMethods.GetFQDN().ToLower();
             var    client       = new unattendedclient()
             {
                 computername = computername, computerfqdn = computerfqdn, windowsusername = windowsusername, name = computername + " " + windowsusername, openrpapath = message.openrpapath
             };
             // client = await global.webSocketClient.InsertOne("openrpa", 1, false, client);
             session = new RobotUserSession(client);
             sessions.Add(session);
         }
         if (session.client != null)
         {
             session.client.openrpapath = message.openrpapath;
             session.AddConnection(connection);
         }
     }
     if (message.command == "reloadconfig")
     {
         await ReloadConfig();
     }
 }
Example #2
0
 public RobotUserSession(unattendedclient client)
 {
     this.client = client;
     var t = Task.Factory.StartNew(() =>
     {
         while (!cancellationTokenSource.IsCancellationRequested)
         {
             try
             {
                 DoWork();
                 System.Threading.Thread.Sleep(1000);
             }
             catch (Exception ex)
             {
                 Log.Error(ex.ToString());
             }
         }
     }, cancellationTokenSource.Token).ContinueWith(task =>
     {
         try
         {
             if (!task.IsCompleted || task.IsFaulted)
             {
                 if (task.Exception != null)
                 {
                     Log.Error(task.Exception.ToString());
                 }
             }
         }
         catch (Exception ex)
         {
             Log.Error(ex.ToString());
         }
     }, cancellationTokenSource.Token);
 }
Example #3
0
        public static Process GetOwnerExplorer(unattendedclient client)
        {
            var procs = Process.GetProcessesByName("explorer");

            System.Diagnostics.Process ownerexplorer = null;
            foreach (var explorer in procs)
            {
                try
                {
                    var owner = NativeMethods.GetProcessUserName(explorer.Id).ToLower();
                    if (owner == client.windowsusername || owner == client.windowslogin)
                    {
                        Log.Verbose("Found explorer process for " + owner);
                        ownerexplorer = explorer;
                    }
                    else
                    {
                        Log.Verbose("skip explorer process for " + owner);
                    }
                }
                catch (Exception ex)
                {
                    Log.Error(ex.ToString());
                    return(null);
                }
            }
            return(ownerexplorer);
        }
Example #4
0
        private static async Task ReloadConfig()
        {
            try
            {
                string computername = NativeMethods.GetHostName().ToLower();
                string computerfqdn = NativeMethods.GetFQDN().ToLower();

                var servers = await global.webSocketClient.Query <unattendedserver>("openrpa", "{'_type':'unattendedserver', 'computername':'" + computername + "', 'computerfqdn':'" + computerfqdn + "'}");

                server = servers.FirstOrDefault();

                unattendedclient[] clients = new unattendedclient[] { };
                if (server != null && server.enabled)
                {
                    disabledmessageshown = false;
                    clients = await global.webSocketClient.Query <unattendedclient>("openrpa", "{'_type':'unattendedclient', 'computername':'" + computername + "', 'computerfqdn':'" + computerfqdn + "'}");
                }
                else if (disabledmessageshown == false)
                {
                    Log.Information("No server for " + computerfqdn + " found, or server is disabled");
                    disabledmessageshown = true;
                }
                var sessioncount = sessions.Count();
                foreach (var c in clients)
                {
                    RobotUserSession session = null;
                    if (sessions != null)
                    {
                        session = sessions.Where(x => x.client.windowsusername == c.windowsusername).FirstOrDefault();
                    }
                    if (session == null)
                    {
                        if (c.enabled)
                        {
                            UnattendedclientUpdated(c);
                        }
                    }
                    else
                    {
                        if (c._modified != session.client._modified || c._version != session.client._version)
                        {
                            UnattendedclientUpdated(c);
                        }
                    }
                }
                cleanup();
            }
            catch (Exception ex)
            {
                Log.Error(ex.ToString());
            }
        }
Example #5
0
        private static async Task ReloadConfig()
        {
            try
            {
                string computername = NativeMethods.GetHostName().ToLower();
                string computerfqdn = NativeMethods.GetFQDN().ToLower();

                var servers = await global.webSocketClient.Query <unattendedserver>("openrpa", "{'_type':'unattendedserver', 'computername':'" + computername + "', 'computerfqdn':'" + computerfqdn + "'}");

                unattendedserver server = servers.FirstOrDefault();

                unattendedclient[] clients = new unattendedclient[] { };
                if (server != null && server.enabled)
                {
                    clients = await global.webSocketClient.Query <unattendedclient>("openrpa", "{'_type':'unattendedclient', 'computername':'" + computername + "', 'computerfqdn':'" + computerfqdn + "'}");
                }
                var sessioncount = sessions.Count();
                foreach (var c in clients)
                {
                    var session = sessions.Where(x => x.client.windowsusername == c.windowsusername).FirstOrDefault();
                    if (session == null)
                    {
                        if (c.enabled)
                        {
                            Log.Information("Adding session for " + c.windowsusername);
                            sessions.Add(new RobotUserSession(c));
                        }
                    }
                    else
                    {
                        if (c._modified != session.client._modified)
                        {
                            Log.Information("Removing:1 session for " + session.client.windowsusername);
                            if (c.enabled)
                            {
                                sessions.Remove(session);
                                session.Dispose();
                                session = null;
                                Log.Information("Adding session for " + c.windowsusername);
                                sessions.Add(new RobotUserSession(c));
                            }
                            else
                            {
                                if (session.rdp != null || session.freerdp != null)
                                {
                                    session.disconnectrdp();
                                }
                                session.client = c;
                            }
                        }
                    }
                }
                foreach (var session in sessions.ToList())
                {
                    var c = clients.Where(x => x.windowsusername == session.client.windowsusername).FirstOrDefault();
                    if (c == null)
                    {
                        if (session.connection == null)
                        {
                            Log.Information("Removing:2 session for " + session.client.windowsusername);
                            sessions.Remove(session);
                            session.Dispose();
                        }
                    }
                }
                if (sessioncount != sessions.Count())
                {
                    Log.Information("Currently have " + sessions.Count() + " sessions");
                }

                // Log.Information("Loaded " + sessions.Count + " sessions");
            }
            catch (Exception ex)
            {
                Log.Error(ex.ToString());
            }
        }
Example #6
0
        private static void UnattendedclientUpdated(unattendedclient unattendedclient)
        {
            if (unattendedclient == null)
            {
                return;
            }
            try
            {
                RobotUserSession session = null;
                if (sessions != null)
                {
                    session = sessions.Where(x => x.client._id == unattendedclient._id).FirstOrDefault();
                }
                if (!unattendedclient.enabled)
                {
                    if (session != null)
                    {
                        session.client = unattendedclient;
                        if (session.rdp != null || session.freerdp != null)
                        {
                            Log.Information("disconnecting session for " + session.client.windowsusername);
                            try
                            {
                                session.disconnectrdp();
                            }
                            catch (Exception ex)
                            {
                                Log.Error(ex.ToString());
                            }
                        }
                    }
                    Log.Information("GetOwnerExplorer");
                    System.Diagnostics.Process ownerexplorer = RobotUserSession.GetOwnerExplorer(unattendedclient);
                    if (ownerexplorer != null)
                    {
                        if (server.logoff || session.client.autosignout)
                        {
                            Log.Information("WTSLogoffSession " + ownerexplorer.SessionId);
                            NativeMethods.WTSLogoffSession(IntPtr.Zero, (int)ownerexplorer.SessionId, true);
                        }
                        else
                        {
                            Log.Information("WTSDisconnectSession " + ownerexplorer.SessionId);
                            NativeMethods.WTSDisconnectSession(IntPtr.Zero, (int)ownerexplorer.SessionId, true);
                        }
                    }
                }
                if (unattendedclient.enabled)
                {
                    if (server != null && server.singleuser)
                    {
                        Log.Information("GetOwnerExplorer");
                        System.Diagnostics.Process ownerexplorer = RobotUserSession.GetOwnerExplorer(unattendedclient);
                        int sessionid = -1;
                        if (ownerexplorer != null)
                        {
                            sessionid = ownerexplorer.SessionId;
                        }
                        var procs = System.Diagnostics.Process.GetProcessesByName("explorer");
                        foreach (var explorer in procs)
                        {
                            if (explorer.SessionId != sessionid)
                            {
                                if (server.logoff || session.client.autosignout)
                                {
                                    Log.Information("WTSLogoffSession " + explorer.SessionId);
                                    NativeMethods.WTSLogoffSession(IntPtr.Zero, (int)explorer.SessionId, true);
                                }
                                else
                                {
                                    Log.Information("WTSDisconnectSession " + explorer.SessionId);
                                    NativeMethods.WTSDisconnectSession(IntPtr.Zero, (int)explorer.SessionId, true);
                                }
                            }
                        }
                    }
                    else if (server == null)
                    {
                        Log.Information("server is null!!!");
                    }

                    if (session != null)
                    {
                        Log.Information("Updating session for " + unattendedclient.windowsusername);
                        session.client = unattendedclient;
                        if (session.rdp == null && session.freerdp == null)
                        {
                            session.BeginWork();
                        }
                    }
                    else
                    {
                        Log.Information("Adding session for " + unattendedclient.windowsusername);
                        sessions.Add(new RobotUserSession(unattendedclient));
                    }
                }
                cleanup();
            }
            catch (Exception ex)
            {
                Log.Error(ex.ToString());
            }
            finally
            {
            }
        }
Example #7
0
 public RobotUserSession(unattendedclient client)
 {
     this.client = client;
     BeginWork();
 }