/// <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(); }
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; }); } }); }