«Приложение» состоит из клиента (приложение для Windows) и WEB части.
Реализация Web части:
Язык: PHP 7.*
Фреймворк: Laravel 5.7
База данных: MySQL
Реализация клиента:
Язык: c#
Фреймворк: .NET 2.0
База данных: SqLite
В настоящее время доступ к серверу выдать не могу, так как он содержит данные пользователей за полтора года. В дальнейшем заведу тестовый бесплатный сервер, чтобы можно было попробовать на приложение практике.
Клиент собран с использованием .NET 2.0 ради возможности запуска и на старых компьютерах. Принцип работы прост: программа при запуске прописывает себя в автозагрузке, запускается на фоне, скрывает себя из списка задач и начинает свою фоновую деятельность по сбору активности пользователя. События активности записываются в локальную базу данных на SQLite, при накоплении определенного количества событий (задается в конфиг файле клиента) и при доступности сервера, клиент передает все накопленные события на сервер. При недоступности сервера, все сохраняется локально и при первой возможности передается на сервер.
Взаимодействие клиента с сервером происходит в JSON:
{ "version" : "0.2", "id" : "\u041F\u041A\u041F\u041A", "cid" : "-", "gid" : null, "PC" : "\u041F\u041A\u041F\u041A-\u041F\u041A", "userName" : "\u041F\u041A\u041F\u041A", "Method" : "events", "Events" : [ { "Start" : "2019-02-11T15:51:43", "End" : "2019-02-11T15:51:48", "idleTime" : 0, "title" : "", "fileName" : "C:&%slWindows&%slExplorer.EXE", "lStart" : 1549900304, "lEnd" : 1549900309, "processName" : "explorer", "keyPress" : 0, "mouseClicks" : 0 }, }
Таким образом клиент шлет на сервер информацию о:
- дате начала и окончания события
- времени простоя (задается в конфиге, какой промежуток бездействия считать простоем)
- заголовок активного окна
- путь к исполняемому файлу текущего процесса
- имя процесса
- количество нажатий на клавиши клавиатуры и щелчков мыши
.
Перечень основных используемых функций WinAPI:
IntPtr SetWindowsHookEx(int idHook, LowLevelProc lpfn, IntPtr hMod, uint dwThreadId); bool UnhookWindowsHookEx(IntPtr hhk); IntPtr CallNextHookEx(IntPtr hhk, int nCode, IntPtr wParam, IntPtr lParam); IntPtr GetModuleHandle(string lpModuleName); IntPtr SetWinEventHook(uint eventMin, uint eventMax, IntPtr hmodWinEventProc, WinEventDelegate lpfnWinEventProc, uint idProcess, uint idThread, uint dwFlags); IntPtr GetForegroundWindow(); int GetWindowText(IntPtr hWnd, StringBuilder text, int count); int GetWindowTextLength(IntPtr hWnd); bool GetLastInputInfo(ref LASTINPUTINFO plii); uint GetLastError(); bool IsWindowVisible(IntPtr hWnd); UInt32 GetWindowThreadProcessId(IntPtr hwnd, ref Int32 pid);
В WEb части реализована:
- Авторизация;
- Добавление, удаление, редактирование пользователей;
- Настройка процессов, заголовков окон — разбитие их по группам;
- Статистика использования программ;
- Статистика использования рабочего времени;
- Отчеты по сотрудникам и другое
Несколько скриншотов Web части: