Пример #1
0
 /// <summary>
 /// Стоп мониторингу активности RDP пользователя
 /// </summary>
 /// <param name="sender"></param>
 /// <param name="e"></param>
 private void Stop_Click(object sender, RoutedEventArgs e)
 {
     Utils_.ActionWithGuiThreadInvoke(Log, () =>
     {
         Log.Text += "\r\n Stop monitoring";
     });
     Load.IsEnabled  = true;
     Save.IsEnabled  = true;
     Start.IsEnabled = true;
     Stop.IsEnabled  = false;
     rdpMonitor.MonitoringThreadStop();
 }
Пример #2
0
        public void MonitoringThreadStart(TextBox Log)
        {
            globalStopThread = false;
            //запуск в отдельном потоке отслеживание по таймауту активной сессии RDP
            Utils_.ActionInThread(() =>
            {
                try
                {
                    IntPtr pDll = kernel32.LoadLibraryW("sessionhelper.dll");
                    IntPtr pAddressOfFunctionToCall = kernel32.GetProcAddress(pDll, "IsUserSessionActive");
                    sessionhelper.IsUserSessionActive pIsUserSessionActive = (sessionhelper.IsUserSessionActive)Marshal.GetDelegateForFunctionPointer(pAddressOfFunctionToCall, typeof(sessionhelper.IsUserSessionActive));

                    IntPtr pDll2 = kernel32.LoadLibraryW("sessionhelper.dll");
                    IntPtr pAddressOfFunctionToCall2             = kernel32.GetProcAddress(pDll2, "DisconnectUser");
                    sessionhelper.DisconnectUser pDisconnectUser = (sessionhelper.DisconnectUser)Marshal.GetDelegateForFunctionPointer(pAddressOfFunctionToCall2, typeof(sessionhelper.DisconnectUser));

                    int timeout_second = Convert.ToInt32(Extract.Between(File.ReadAllText(Environment.CurrentDirectory + "\\settings.ini"), "#monitor_timeout_second=", ";"));
                    while (true)
                    {
                        if (globalStopThread == true)
                        {
                            break;
                        }
                        //вывод на форму из рабочего потока.
                        Utils_.ActionWithGuiThreadInvoke(Log, () =>
                        {
                            Log.Text += "\r\nStart monitoring....";
                        });
                        //проверка наступил ли период запрета на соединение по RDP
                        if (CheckTimetoDisconnect() == true)
                        {
                            //Узнаем имя пользователя которое нужно отследить
                            string UserName = GetUserName();
                            if (String.IsNullOrEmpty(UserName))
                            {
                                throw new Exception("Error UserName is Empty or invalid.");
                            }
                            //проверка подключен ли пользователь по RDP
                            if (pIsUserSessionActive(UserName) == true)
                            {
                                Utils_.ActionWithGuiThreadInvoke(Log, () =>
                                {
                                    Log.Text += "\r\nDisconnect time is NOW!";
                                    Log.Text += "\r\n" + UserName + " session is active!...start to disconnect";
                                });
                                //если подключен то дисконнектим его
                                if (pDisconnectUser(UserName) == true)
                                {
                                    Utils_.ActionWithGuiThreadInvoke(Log, () =>
                                    {
                                        Log.Text += "\r\n" + UserName + " Disconnected!";
                                    });
                                }
                            }
                        }
                        //считаем таймаут и снова в цикле.
                        globalStopEvent.WaitOne(timeout_second * 1000);
                    }
                }
                catch (Exception ec)
                {
                    Utils_.ActionWithGuiThreadInvoke(Log, () =>
                    {
                        Log.Text += "\r\nException from another thread :" + ec.Message;
                    });
                }
            });
        }