Большинство статей данного рода создаются мной в собственных интересах с целью сохранения информации, которая впоследствии может оказаться полезной. Возможно, эти материалы будут полезны не только мне…
Да, да, да, метод будет не самый изящный, но рабочий 🙂
Настройки LDAP каталоги
Переходим в Настройки > Аутентификация >LDAP каталоги , выбирай свой каталог и переходим на вкладку “Пользователи”.
В моем случае я задействовал поле “Комментарий” и прописал следующее:
[%{lastlogon}] - [%{lastlogontimestamp}]
Сохраняем.
Синхронизируем пользователя
Далее переходим в любого пользователя, вкладка “Синхронизация” и нажимаем “Принудительная синхронизация”.
Проверяем данные
Обратно переходим на вкладку “Пользователь” и смотрим поле “Комментарий” приходят ли данные.
Данные о дате/времени отображаются в “странном” формате.
Это 64-разрядное значение, представляющее количество 100-наносекундных интервалов, прошедших с 12:00 1 января 1601 г. в формате UTC.
Преобразование даты/времени в удобочитаемый формат
Для преобразования значения формата UTC в более удобочитаемый формат мы добавим свой скрипт.
В процессе написания скрипта была сложность с получением текстовой области:
<textarea class="form-control" id="comment" name="comment">[133385719246785393] - [133516024444364894]</textarea>
Дело в том что данные выводятся так же скриптами. Поэтому важно, чтобы наш скрипт загружался в конце, плюс установлен интервал, который будет периодически проверять наличие текстовой области.
Код скрипта будет следующий:
document.addEventListener("DOMContentLoaded", function() { // Устанавливаем интервал проверки каждые 500 миллисекунд var checkTextareaInterval = setInterval(checkTextarea, 500); function checkTextarea() { // Получаем текстовую область var textarea = document.getElementById('comment'); // Проверяем существование текстовой области if (textarea) { // Отменяем интервал, так как текстовая область найдена clearInterval(checkTextareaInterval); // Вызываем функцию обработки дат в текстовой области handleDateDisplay(textarea); } } function handleDateDisplay(textarea) { // Получаем значение из текстовой области var commentValue = textarea.value; // Используем регулярное выражение для извлечения двух дат из строки var dateMatches = commentValue.match(/\[(.*?)\]/g); // Проверяем, что есть хотя бы два совпадения if (dateMatches && dateMatches.length >= 2) { // Преобразуем значения в числа var filetime1 = parseInt(dateMatches[0].replace(/\[|\]/g, '')); var filetime2 = parseInt(dateMatches[1].replace(/\[|\]/g, '')); // Обработка первой даты var formattedDateTime1 = formatDateTime(filetime1); // Обработка второй даты var formattedDateTime2 = formatDateTime(filetime2); // Заменяем значение в текстовой области на отформатированные даты textarea.value = "[" + formattedDateTime1 + "] - [" + formattedDateTime2 + "]"; } } function formatDateTime(filetime) { // Разница в 100-наносекундных интервалах между 1601 годом и 1970 годом (началом эпохи Unix) var epochDiff = 116444736000000000; // Преобразование в секунды с учетом разницы в эпохах var timestamp = Math.floor((filetime - epochDiff) / 10000000); // Создаем объект Date var dateObject = new Date(timestamp * 1000); // Получаем отформатированную строку даты и времени return dateObject.toLocaleString(); } });
Доработки кода
В процессе написания статьи, возникла мысль. Что если потребуется выводить только одно значение… Да, в таком случае код не будет работать.
Доработанный код скрипта будет следующим:
document.addEventListener("DOMContentLoaded", function() { // Устанавливаем интервал проверки каждые 500 миллисекунд var checkTextareaInterval = setInterval(checkTextarea, 500); function checkTextarea() { // Получаем текстовую область var textarea = document.getElementById('comment'); // Проверяем существование текстовой области if (textarea) { // Отменяем интервал, так как текстовая область найдена clearInterval(checkTextareaInterval); // Вызываем функцию обработки дат в текстовой области handleDateDisplay(textarea); } } function handleDateDisplay(textarea) { // Получаем значение из текстовой области var commentValue = textarea.value; // Используем регулярное выражение для извлечения всех дат из строки var dateMatches = commentValue.match(/\[(.*?)\]/g); // Проверяем, есть ли хотя бы одна дата if (dateMatches) { // Преобразуем значения в числа и обрабатываем каждую дату var formattedDates = dateMatches.map(function(match) { var filetime = parseInt(match.replace(/\[|\]/g, '')); return formatDateTime(filetime); }); // Заменяем значение в текстовой области на отформатированные даты textarea.value = "[" + formattedDates.join("] - [") + "]"; } } function formatDateTime(filetime) { // Разница в 100-наносекундных интервалах между 1601 годом и 1970 годом (началом эпохи Unix) var epochDiff = 116444736000000000; // Преобразование в секунды с учетом разницы в эпохах var timestamp = Math.floor((filetime - epochDiff) / 10000000); // Создаем объект Date var dateObject = new Date(timestamp * 1000); // Получаем отформатированную строку даты и времени return dateObject.toLocaleString(); } });
! Примечание
Если требуется вывести одно значение, то необходимо в настройках аутентификации (LDAP каталоги) указать:
[%{lastlogon}]
или
[%{lastlogontimestamp}]
Итог
Проверяем, данные должны быть следующего вида:
или
На этом все.
0 Комментариев