Большинство статей данного рода создаются мной в собственных интересах с целью сохранения информации, которая впоследствии может оказаться полезной. Возможно, эти материалы будут полезны не только мне…
Да, да, да, метод будет не самый изящный, но рабочий 🙂
Настройки 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 Комментариев