private void ValidateSessionsAsync()
        {
            ThreadPool.QueueUserWorkItem(async(object o) =>
            {
                ITerminalServicesManager manager = new TerminalServicesManager();
                using (ITerminalServer server = manager.GetLocalServer())
                {
                    server.Open();

                    var localSessions = server.GetSessions().Where(s => s.SessionId > 0 && (s.ConnectionState == Cassia.ConnectionState.Active));
                    var messages      = await _msgReader.GetAllMessages();

                    if (messages.Count(m => m.Command.Type == WinGuard.Domain.Enumaretions.ClientCommandType.LOGOUT) > 0 &&
                        localSessions.Any(s => messages.Any(m => m.Command.ClientIdentifier == s.SessionId.ToString())))
                    {
                        foreach (var session in localSessions.Where(s => messages.Any(m => m.Command.ClientIdentifier == s.SessionId.ToString())))
                        {
                            session.Logoff();
                        }
                        return;
                    }
                    foreach (ITerminalServicesSession session in localSessions)
                    {
                        await _authService.Login(_encryptService.EncryptMessage(session.SessionId.ToString()),
                                                 _encryptService.EncryptMessage(session.UserName));
                    }
                }
            });
        }
Exemplo n.º 2
0
        public Response Get()
        {
            var response = new Response();

            try
            {
                using (var server = new TerminalServicesManager().GetLocalServer())
                {
                    server.Open();
                    var sessions = server.GetSessions()
                                   .Where(s => !string.IsNullOrEmpty(s.UserName))
                                   .Select(s => new
                    {
                        Id        = s.SessionId,
                        User      = s.DomainName + @"\" + s.UserName,
                        LoginDate = s.LoginTime?.ToString("g"),
                        State     = s.ConnectionState.ToString()
                    });
                    response.Data = sessions;
                    return(response);
                }
            }
            catch (Exception ex)
            {
                Log.Error(ex.Message);
                response.AddErrorNotification(ex.Message, ex.StackTrace);
                return(response);
            }
        }
Exemplo n.º 3
0
        private void SearchActiveSessions(LogFileParser.foundElementInfo [] selectedUserPCs, string selectedUser)
        {
            ITerminalServicesManager manager = new TerminalServicesManager();

            for (int i = 0; i < selectedUserPCs.Length; i++)
            {
                try {
                    Ping        ping        = new Ping();
                    PingOptions pingOptions = new PingOptions();
                    pingOptions.DontFragment = true;
                    string    data   = "fff";
                    byte[]    buffer = Encoding.ASCII.GetBytes(data);
                    PingReply reply  = ping.Send(selectedUserPCs[i].name, 120, buffer, pingOptions);
                    if (reply.Status == IPStatus.Success)
                    {
                        using (ITerminalServer server = manager.GetRemoteServer(selectedUserPCs[i].name)) {
                            server.Open();
                            foreach (ITerminalServicesSession session in server.GetSessions())
                            {
                                if (session.UserName.ToLower() == selectedUser.ToLower() && session.ConnectionState == ConnectionState.Active)
                                {
                                    selectedUserPCs[i].name = "->" + selectedUserPCs[i].name + "<-";
                                }
                            }
                        }
                    }
                } catch { }
            }
        }
        public Response GetUserSesssions()
        {
            var response = new Response();

            try
            {
                var manager = new TerminalServicesManager();
                using (ITerminalServer server = manager.GetLocalServer())
                {
                    server.Open();
                    var sessions = server.GetSessions()
                                   .Where(s => !string.IsNullOrEmpty(s.UserName))
                                   .Select(s => new
                    {
                        User      = s.DomainName + @"\" + s.UserName,
                        LoginDate = s.LoginTime?.ToString("g"),
                        State     = s.ConnectionState.ToString()
                    });
                    response.Data = sessions;
                    return(response);
                }
            }
            catch (Exception ex)
            {
                Log.Error(ex.Message);
                response.Status = Status.Error;
                response.Notifications.Add(new Notification
                {
                    Message       = ex.Message,
                    MessageDetail = ex.StackTrace,
                    Status        = Status.Error
                });
                return(response);
            }
        }
Exemplo n.º 5
0
 private static int GetUserSessionId(string username)
 {
     try
     {
         ITerminalServicesManager manager = new TerminalServicesManager();
         using (ITerminalServer server = manager.GetLocalServer())
         {
             server.Open();
             foreach (ITerminalServicesSession session in server.GetSessions())
             {
                 NTAccount account = session.UserAccount;
                 if (account == null)
                 {
                     continue;
                 }
                 var userName = account.Value.Split('\\')[1];
                 if (userName.ToLower().Equals(username.ToLower()))
                 {
                     return(session.SessionId);
                 }
             }
         }
         return(-1);
     }
     catch (Exception)
     {
         return(-1);
     }
 }
Exemplo n.º 6
0
        public static List <ITerminalServicesSession> GetList()
        {
            List <ITerminalServicesSession> session_list = new List <ITerminalServicesSession>();

            ITerminalServicesManager manager = new TerminalServicesManager();

            using (ITerminalServer server = manager.GetLocalServer())
            {
                server.Open();
                foreach (ITerminalServicesSession session in server.GetSessions())
                {
                    // skip the SYSTEM session
                    if (session.SessionId == 0)
                    {
                        continue;
                    }

                    // if there is no username the session is special accounts
                    if (session.UserName == String.Empty)
                    {
                        continue;
                    }

                    session_list.Add(session);
                }
            }

            return(session_list);
        }
Exemplo n.º 7
0
 public static void killProcess(string computerName, int PID)
 {
     if (ping(computerName))
     {
         ITerminalServer server = new TerminalServicesManager().GetRemoteServer(computerName);
         server.Open();
         server.GetProcess(PID).Kill();
     }
 }
Exemplo n.º 8
0
        public static void LogSessionData(Guid currentServiceRunGuid, int sessionId, SessionTrackingEvents sessionTrackingEvent, string reason, bool logAllExistingSessions = false)
        {
            using (ITerminalServer server = new TerminalServicesManager().GetLocalServer())
            {
                SessionTracking sessionTracking = null;
                if (!File.Exists(GlobalSettings.DataFilePath))
                {
                    sessionTracking = new SessionTracking();
                    sessionTracking.SessionTrackingParamsList = new List <SessionTrackingParams>();
                    File.Create(GlobalSettings.DataFilePath).Close();
                    Utility.SerializeObjectToFile <SessionTracking>(sessionTracking, GlobalSettings.DataFilePath);
                }

                server.Open();
                foreach (ITerminalServicesSession session in server.GetSessions().Where(o => o.LoginTime.HasValue))
                {
                    if (logAllExistingSessions || session.SessionId == sessionId)
                    {
                        SessionTrackingParams sessionTrackingParams = new SessionTrackingParams()
                        {
                            ServiceRunGuid = currentServiceRunGuid,
                            SessionId      = session.SessionId,
                            LogonDT        = session.LoginTime.HasValue ? session.LoginTime.Value : DateTime.MinValue,
                            EventDT        = DateTime.Now,
                            UserAccount    = (session.UserAccount != null && session.UserAccount.Value != null ? session.UserAccount.Value : String.Empty),
                            Event          = Enum.GetName(typeof(SessionTrackingEvents), sessionTrackingEvent),
                            Reason         = reason
                        };
                        string sessionTrackingParamsSerialized = Utility.SerializeObject <SessionTrackingParams>(sessionTrackingParams);

                        // Faster and not-so-clean way to write XML node to the end of the serialized List<SessionTrackingParams>,
                        // cleaner way would be to deserialize, add node and serialize whole list which might contain hundreds of records, but it would
                        // possibly be much slower in case of large file.
                        string text = File.ReadAllText(GlobalSettings.DataFilePath);
                        if (text.Contains("</SessionTrackingParamsList>"))
                        {
                            text = text.Replace(
                                "</SessionTrackingParamsList>",
                                sessionTrackingParamsSerialized + Environment.NewLine + "</SessionTrackingParamsList>");
                        }
                        else
                        {
                            text = text.Replace(
                                "<SessionTrackingParamsList />",
                                "<SessionTrackingParamsList>" + Environment.NewLine + sessionTrackingParamsSerialized + Environment.NewLine + "</SessionTrackingParamsList>");
                        }
                        File.WriteAllText(GlobalSettings.DataFilePath, text);

                        if (!logAllExistingSessions)
                        {
                            break;
                        }
                    }
                }
                server.Close();
            }
        }
Exemplo n.º 9
0
 static void CheckBackupTime(object sender, System.Timers.ElapsedEventArgs e)
 {
     if ((int)DateTime.Now.DayOfWeek != Settings.Default.backupday)
     {
         return;
     }
     backupTime = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, (int)Settings.Default.backuphour, (int)Settings.Default.backupminute, 0);
     if (backupTime > DateTime.Now)
     {
         if ((int)(backupTime - DateTime.Now).TotalMinutes <= Settings.Default.startcheck)
         {
             foreach (var session in activeusers)
             {
                 if (!Notifications.ContainsKey(session.SessionId))
                 {
                     SendMessage(session.SessionId, Settings.Default.alert1box.Replace("{time}", backupTime.ToString("HH:mm")));
                     Notifications.Add(session.SessionId, DateTime.Now);
                 }
                 else
                 {
                     if ((DateTime.Now - Notifications[session.SessionId]).TotalMinutes >= (int)Settings.Default.alert_interval)
                     {
                         SendMessage(session.SessionId, Settings.Default.alert1box.Replace("{time}", backupTime.ToString("HH:mm")));
                         Notifications[session.SessionId] = DateTime.Now;
                     }
                 }
             }
         }
     }
     else
     {
         if (backupTime < startuptime)
         {
             FinishedBackups.Add(backupTime);
             return;
         }
         if (!FinishedBackups.Contains(backupTime))
         {
             ITerminalServicesManager manager = new TerminalServicesManager();
             using (ITerminalServer server = manager.GetLocalServer())
             {
                 server.Open();
                 foreach (ITerminalServicesSession session in server.GetSessions())
                 {
                     KillParusWithNotifiction(session);
                 }
             }
             if (Settings.Default.backupauto && Application.OpenForms.OfType <BackupWindow>().Count() == 0)
             {
                 bwindow = new BackupWindow();
                 bwindow.ShowDialog();
             }
         }
     }
 }
Exemplo n.º 10
0
 public static void killProcess(string computerName, string processName)
 {
     try {
         if (ping(computerName))
         {
             ITerminalServer server = new TerminalServicesManager().GetRemoteServer(computerName);
             server.Open();
             server.GetProcesses().First(p => p.ProcessName == processName).Kill();
         }
     } catch { }
 }
Exemplo n.º 11
0
 private void initServer()
 {
     try
     {
         ITerminalServicesManager manager = new TerminalServicesManager();
         server = manager.GetLocalServer();
         server.Open();
     }
     catch (Exception)
     {
         Console.WriteLine("[Error] no se ha podido identificar el terminal server.");
     }
 }
Exemplo n.º 12
0
 public static List <ITerminalServicesProcess> getComputerProcess(string computerName)
 {
     if (ping(computerName))
     {
         ITerminalServer server = new TerminalServicesManager().GetRemoteServer(computerName);
         server.Open();
         List <ITerminalServicesProcess> processes = server.GetProcesses().ToList();
         return(processes);
     }
     else
     {
         return(new List <ITerminalServicesProcess>());
     }
 }
        private ITerminalServer GetServer()
        {
            var mgr = new TerminalServicesManager();

            if (string.IsNullOrWhiteSpace(ComputerName))
            {
                // Local Machine
                return(mgr.GetLocalServer());
            }
            else
            {
                // Remote Machine
                return(mgr.GetRemoteServer(ComputerName));
            }
        }
Exemplo n.º 14
0
        public static void killAnotherCopyOfProgram()
        {
            ITerminalServer server = new TerminalServicesManager().GetLocalServer();

            server.Open();
            var procs = server.GetProcesses().Where(
                el => el.ProcessName.Equals("rPCSMT.exe") &&
                Process.GetCurrentProcess().Id != el.ProcessId
                );

            foreach (var proc in procs)
            {
                proc.Kill();
            }
        }
Exemplo n.º 15
0
        static void Main(string[] args)
        {
            var manager = new TerminalServicesManager();

            using (var server = manager.GetRemoteServer("server"))
            {
                server.Open();
                foreach (var session in server.GetSessions())
                {
                    if (session.ConnectionState == ConnectionState.Active)
                    {
                        Console.WriteLine(session.ClientName);
                    }
                }
            }
        }
Exemplo n.º 16
0
        private void LoadTSUsers()
        {
            try
            {
                listTSUser.Clear();
                TerminalServicesManager tsManager = new TerminalServicesManager();
                string[] massHosts = new string[] { "TS1", "TS2", "TS3", "TS4", "TS5", "TS6", "TS7" };

                foreach (var host in massHosts)
                {
                    using (ITerminalServer server = tsManager.GetRemoteServer(host))
                    {
                        server.Open();
                        foreach (ITerminalServicesSession session in server.GetSessions())
                        {
                            NTAccount account = session.UserAccount;
                            if (account != null)
                            {
                                TSUser user = new TSUser()
                                {
                                    DomainName        = session.DomainName,
                                    PCName            = session.ClientName,
                                    TSName            = host,
                                    UserName          = session.UserName,
                                    ConnectionState   = session.ConnectionState.ToString(),
                                    WindowStationName = session.WindowStationName,
                                    UserAccount       = account.ToString(),
                                };
                                Dispatcher.Invoke((Action)(() =>
                                {
                                    listTSUser.Add(user);
                                }));
                            }
                        }
                    }
                }

                foreach (var user in listTSUser)
                {
                    user.ClientIPAddress = (from i in listPcIPAndPcName where i.PcName.ToLower() == user.PCName.ToLower() select i.PcIP).FirstOrDefault();
                }
            }
            catch (Exception ex)
            {
                Bindings.StatusBarText = ex.Message;
            }
        }
Exemplo n.º 17
0
        public static void Main(string[] args)
        {
            ITerminalServicesManager manager = new TerminalServicesManager();

            using (ITerminalServer server = manager.GetRemoteServer("your-server-name"))
            {
                server.Open();
                foreach (ITerminalServicesSession session in server.GetSessions())
                {
                    NTAccount account = session.UserAccount;
                    if (account != null)
                    {
                        Console.WriteLine(account);
                    }
                }
            }
        }
        public static bool SendMessage(string message)
        {
            ITerminalServicesManager manager = new TerminalServicesManager();

            using (ITerminalServer server = manager.GetRemoteServer(ServerIPAddress))
            {
                server.Open();
                var session = server.GetSessions().Where(x => x.UserName == UserNameOnServer).FirstOrDefault();
                if (session != null)
                {
                    var response = session.MessageBox(message, "Message for user", RemoteMessageBoxButtons.YesNo,
                                                      RemoteMessageBoxIcon.Question, RemoteMessageBoxDefaultButton.Button2, RemoteMessageBoxOptions.None, TimeSpan.Zero, true);
                    return(response == RemoteMessageBoxResult.Yes);
                }
            }
            return(false);
        }
Exemplo n.º 19
0
        ITerminalServicesSession TryGetSession(int sessionID)
        {
            try
            {
                var manager = new TerminalServicesManager();

                using (var server = manager.GetLocalServer())
                {
                    return(server.GetSession(sessionID));
                }
            }
            catch (Exception exception)
            {
                Program.Trace($"Unable to get terminalServicesSession: { exception.Message }");
            }

            return(null);
        }
Exemplo n.º 20
0
        public static void SendMessage(int sessionid, string message)
        {
            ITerminalServicesManager manager = new TerminalServicesManager();

            using (ITerminalServer server = manager.GetLocalServer())
            {
                server.Open();
                try
                {
                    var session = server.GetSession(sessionid);
                    session.MessageBox(message, "Сообщение");
                }
                catch (Exception ex)
                {
                    MessageBox.Show("Ошибка отправки сообщения: " + ex.Message);
                }
            }
        }
Exemplo n.º 21
0
        private static ITerminalServicesSession GetSession()
        {
            ITerminalServicesManager manager = new TerminalServicesManager();
            ITerminalServicesSession session;

            using (ITerminalServer server = manager.GetRemoteServer("192.168.0.10"))
            {
                server.Open();
                int i = 0;

                IList <ITerminalServicesSession> sessionsList = server.GetSessions();
                do
                {
                    session = sessionsList[i];
                    i++;
                } while (i < sessionsList.Count && session.UserName.ToUpper() != "MEDIA SERVER");
            }
            return(session.UserName.ToUpper() == "MEDIA SERVER" && session != null ? session : null);
        }
Exemplo n.º 22
0
        private void TryEnumerateSessions()
        {
            try
            {
                Program.Trace("Enumerating sessions");

                var manager = new TerminalServicesManager();

                using (var server = manager.GetLocalServer())
                {
                    foreach (var session in server.GetSessions())
                    {
                        if (session == null)
                        {
                            continue;                  // Doubt this ever happens, but just to be sure
                        }
                        // For debug purposes
                        string userID = "";

                        if (!string.IsNullOrWhiteSpace(session.UserName) || !string.IsNullOrEmpty(session.UserAccount?.ToString()))
                        {
                            userID = $" (UserName: { session.UserName }, NTAccount: { session.UserAccount })";
                        }

                        Program.Trace($"Session { session.SessionId }{ userID }: { session.ConnectionState }");


                        // Start a logger in that session
                        Task startLogger;

                        if (!UnqualifiedConnectionStates.Contains(session.ConnectionState))
                        {
                            startLogger = TryRunLoggerInSessionAsync(session);
                        }
                    }
                }
            }
            catch (Exception exception)
            {
                Program.Trace($"Error when enumerating sessions: { exception.Message }");
            }
        }
Exemplo n.º 23
0
        //Возвращает список сеансов с сервера(имя сервера в качестве параметра)
        public void getSessionList()
        {
            IList <ITerminalServicesSession> serverSession;
            int countSession = 0;

            serverSessionList.Clear();

            //Далее идет код для подключения к серверу
            ITerminalServicesManager manager = new TerminalServicesManager();

            using (ITerminalServer server = manager.GetRemoteServer(serverName))
            {
                server.Open();

                // Перебираем все сеансы на сервере.
                try
                {
                    serverSession = server.GetSessions();
                }
                catch (Exception ex)
                {
                    serverStatus  = ex.Message;
                    serverSession = null;
                    log.appendLog(MethodBase.GetCurrentMethod().ReflectedType.Name + "\n" + MethodBase.GetCurrentMethod().Name + "\n" + ex + "\n" + Application.UserAppDataPath);
                }
                server.Close();
                if (serverSession != null)
                {
                    foreach (ITerminalServicesSession session in serverSession)
                    {
                        //Фильтруем системный сеанс с Id 0. Отбираем сеансы в статусе Active или в статусе Disconnected, но не с пустым именем
                        if (session.SessionId != 0 && ((session.ConnectionState == ConnectionState.Active) || (session.ConnectionState == ConnectionState.Disconnected && session.UserName != "")))
                        {
                            serverSessionList.Add(session);
                            countSession++;
                        }
                    }
                }
            }
            sessionCount = countSession;
            lastCheck    = DateTime.Now.ToString();
        }
Exemplo n.º 24
0
        private static int CountUsers()
        {
            int NbrUsers = 0;
            ITerminalServicesManager manager = new TerminalServicesManager();

            using (ITerminalServer server = manager.GetRemoteServer(Settings.Ip))
            {
                server.Open();
                foreach (ITerminalServicesSession session in server.GetSessions())
                {
                    NTAccount account = session.UserAccount;

                    if (account != null)
                    {
                        NbrUsers++;
                    }
                }
            }
            return(NbrUsers);
        }
Exemplo n.º 25
0
        public WmsServiceClient(ClientTypeCode clientType, string serviceEndpoint)
        {
            // по умолчанию sessionId берем по номеру процесса
            // TODO: переделать на уникальный номер (лучше Guid); Как вариант можно завязаться на железные параметры и построить на этом одну из проверок лицензионности
            Session = System.Diagnostics.Process.GetCurrentProcess().Id;

            // вычитываем идентификатор сервиса (по умолчанию DCL)
            // решили пока использовать Guid
            ServiceId  = Guid.NewGuid().ToString();
            ClientName = string.Format("{0}_{1}", ServiceId, Session);

            ClientType = clientType;
            EndPoint   = serviceEndpoint;

            var manager    = new TerminalServicesManager();
            var rdpsession = manager.CurrentSession;

            HostName   = rdpsession.ClientName;
            IpAddress  = rdpsession.ClientIPAddress.To <string>();
            MacAddress = GetMacAdressByIp(rdpsession.ClientIPAddress);

            if (string.IsNullOrEmpty(HostName)) //HACK: Если не удалось получить данные удаленной сессии, определяем по-умолчанию
            {
                SetDefaultClientSystemProperty();
            }

            _switchEndpoint   = true;
            _retryPolicyCount = Properties.Settings.Default.RetryPolicyCount > 0
                ? Properties.Settings.Default.RetryPolicyCount
                : DefaultRetryPolicyCount;

            _retryPolicyTime = Properties.Settings.Default.RetryPolicyTime > 0
                ? Properties.Settings.Default.RetryPolicyTime
                : DefaultRetryPolicyTime;

            IsConnected = false;

            _authenticationProvider = IoC.Instance.Resolve <IAuthenticationProvider>();
            _authenticationProvider.AuthenticatedUserChanging += OnAuthenticatedUserChanging;
            _authenticationProvider.AuthenticatedUserChanged  += OnAuthenticatedUserChanged;
        }
Exemplo n.º 26
0
 public static bool checkUserLogedIn(string username, string computerName)
 {
     try {
         if (ping(computerName))
         {
             ITerminalServer server = new TerminalServicesManager().GetRemoteServer(computerName);
             server.Open();
             //ITerminalServicesSession session = server.GetSessions().First(_session => _session.UserAccount.Value.ToLower() == username.ToLower());
             foreach (ITerminalServicesSession session in server.GetSessions())
             {
                 if (session.UserAccount != null && session.UserName.ToLower() == username.ToLower()
                     & session.ConnectionState == Cassia.ConnectionState.Active)
                 {
                     return(true);
                 }
             }
         }                 //else MessageBox.Show($"{computerName} don't ping");
     } catch {
         //MessageBox.Show(e.Message);
     }
     return(false);
 }
Exemplo n.º 27
0
        /// <summary>
        ///     Overrides the <see cref="Execute"/> method exposed by the <see cref="SwedishCodeActivity{T}"/> class.
        /// </summary>
        /// <param name="context">The execution context passed when invoked.</param>
        /// <returns>A string back to the caller.</returns>
        /// <inheritdoc cref="SwedishCodeActivity{T}"/>
        protected override object Execute(CodeActivityContext context)
        {
            ITerminalServicesManager iTerminalServicesManager = new TerminalServicesManager();
            StringBuilder            newStringBuilder         = new StringBuilder();

            using (ITerminalServer server = iTerminalServicesManager.GetRemoteServer(Environment.MachineName))
            {
                server.Open();
                IList <ITerminalServicesSession> newSessionsList = server.GetSessions();
                Parallel.ForEach(
                    newSessionsList,
                    s =>
                {
                    if (!string.IsNullOrWhiteSpace(s.UserName))
                    {
                        newStringBuilder.AppendLine($"Session: {s.SessionId} UserName: {s.UserName} LogonTime: {s.LoginTime} IdleTime: {s.IdleTime}");
                    }
                });
            }

            return(newStringBuilder.ToString());
        }
Exemplo n.º 28
0
        static void UpdateUsers(object sender, System.Timers.ElapsedEventArgs e)
        {
            activeusers.Clear();
            ITerminalServicesManager manager = new TerminalServicesManager();

            using (ITerminalServer server = manager.GetLocalServer())
            {
                server.Open();
                foreach (ITerminalServicesSession session in server.GetSessions())
                {
                    if (ParusRunned(session.GetProcesses()))
                    {
                        activeusers.Add(session);
                    }
                }
            }
            if (uwindow != null)
            {
                try { uwindow.UpdateList(); }
                catch { }
            }
        }
        public PluginOutputCollection Output()
        {
            ITerminalServicesManager  manager = new TerminalServicesManager();
            List <SimplePluginOutput> listSPO = new List <SimplePluginOutput>();

            _pluginOutputs.PluginOutputList.Clear();
            using (ITerminalServer server = manager.GetRemoteServer(Environment.MachineName.ToString()))
            {
                server.Open();
                foreach (ITerminalServicesSession session in server.GetSessions())
                {
                    NTAccount account = session.UserAccount;
                    if (account != null)
                    {
                        listSPO.Add(new SimplePluginOutput(account.ToString(), false));

                        _pluginOutputs.PluginOutputList.Add(new PluginOutput("User", listSPO));
                    }
                }
            }
            return(_pluginOutputs);
        }
        public Response DropUserSession([FromBody] string username)
        {
            var response = new Response();

            try
            {
                Log.Debug($"DropUserSession called for user {username}.");

                var manager = new TerminalServicesManager();
                using (ITerminalServer server = manager.GetLocalServer())
                {
                    server.Open();
                    var userSession = server.GetSessions()
                                      .FirstOrDefault(s => string.Equals($@"{s.DomainName}\{s.UserName}", username, StringComparison.InvariantCultureIgnoreCase));

                    if (userSession == null)
                    {
                        response.Status = Status.Error;
                        response.AddErrorNotification($"User session for {username} not found.");
                        return(response);
                    }

                    userSession.Logoff(true);
                }

                var message = $"Successfully closed session for user {username}.";
                Log.Debug(message);
                response.AddSuccessNotification(message);
                return(response);
            }
            catch (Exception ex)
            {
                Log.Error(ex.Message);
                response.Status = Status.Error;
                response.AddErrorNotification(ex.Message, ex.StackTrace);
                return(response);
            }
        }