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(); } }
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); }
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); }
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()); } }
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()); } }
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 { } }
public RobotUserSession(unattendedclient client) { this.client = client; BeginWork(); }