Обработка предназначена для работы в клиент-серверных базах и тестировалась на платформе 8.3.14.1854.
Работает в режиме внешней обработки.
Перейдем к рассмотрению программного кода.
Обработка небольшая и состоит из нескольких функций и одной процедуры, коды которых я коротко опишу.
1. Процедура запуска , она последовательно запускает на выполнение функции и процедуры обработки.
Код процедуры:
&НаКлиенте
Процедура ПолучитьПользователейИБ(Команда)
МассивЛогинов=Новый Массив;
МассивДоменов=Новый Массив;
МассивЛогинов=ПолучитьПользователейИБ1();
МассивДоменов=ПолучитьДоменыИБ1();
ПолучитьПользователяИзАД1(МассивЛогинов,МассивДоменов);
ЗаполнениеОтличиеИБотАД();
КонецПроцедуры
2. Процедура ИнструкцияПоЭксплуатации при нажатии соответствующей кнопки выводит текст инструкции.
Код процедуры:
&НаКлиенте
Процедура ИнструкцияПоЭксплуатации(Команда)
//Процедура выводит текстовый файл Инструкция по эксплуатации
Инструкция=" Инструкция на обработку ПользователиИБвАД ."+Символы.ПС+"
|Обработка проверяет наличие всех пользователей Информационной Базы в Актив Директории."+Символы.ПС+"
|1. Закладка ""ПользователиИБ"" отобпажает всех пользователей ИБ."+Символы.ПС+"
|2. Закладка ""ПользователиАД"" отображает пользователей ИБ найденных в АД"+Символы.ПС+"
|3. Закладка ""Отличие ИБ от АД"" отображает пользователей ИБ которых нет в АД и отличие пользователей ИБ и АД.";
Предупреждение(Инструкция);
КонецПроцедуры
3. Функция ПолучитьПользователейИБ1 выбирает всех пользователей Информационной Базы, заполняет таблицу Пользователи и
Возвращаемый массив МассивЛогинов1. Данные таблицы используются на закладке формы ПользователиИБ.
Код Функции:
&НаСервере
Функция ПолучитьПользователейИБ1()
//Выбираем всех пользователей ИБ, заполняем таблицу Пользователи и Возвращаемый массив МассивЛогинов1************************************************
МассивЛогинов1=Новый Массив;
ИмяДоменаАД="";
ЛогинАД="" ;
ПолноеИмяПользователяАД="";
Буква="";
ЛогинИБ="";
Домен="";
НомерПользователя=1;
ПредидущийДомен="";
СчетчикБукв=3;
СчетчикДоменов=1;
МассивПользователей= ПользователиИнформационнойБазы.ПолучитьПользователей(); //Встроенной функцией получаем массив пользователей Выборка
Для Каждого ЭлементМассива Из МассивПользователей Цикл //Через цикл просматриваем массив Выборка по ключевому параметру Логин
СчетчикБукв=3;
ФлагДоменЛогин="Домен";
ДоменЛогин=ЭлементМассива.ПользовательОС; //Выбираем из массива пользователей значение ПользовательОС это ДоменЛогин
ПолноеИмяПользователя=ЭлементМассива.ПолноеИмя; //Выбираем из массива пользователей значение ПолноеИмя
ПользовательУникльныйИдентификатор=ЭлементМассива.УникальныйИдентификатор; //Выбираем из массива пользователей значение УникальныйИдентификатор
Запрос = Новый Запрос; //Определяем текущего пользователя в справочнике Пользователи
Запрос.Текст =
"ВЫБРАТЬ
| Пользователи.Наименование КАК Наименование,
| Пользователи.ПометкаУдаления КАК ПометкаУдаления
|ИЗ
| Справочник.Пользователи КАК Пользователи
|ГДЕ
| Пользователи.ИдентификаторПользователяИБ = &ПользовательУникльныйИдентификатор"
;
Запрос.УстановитьПараметр("ПользовательУникльныйИдентификатор",ПользовательУникльныйИдентификатор);
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
Пока Выборка.Следующий() Цикл
НаименованиеВСправочнике=Выборка.Наименование;
Если Выборка.ПометкаУдаления=Ложь Тогда
ПометкаУдаленияПользователя = "Действует"; //Записываем результат ПометкаУдаления
Иначе
ПометкаУдаленияПользователя = "Удален";
КонецЕсли;
КонецЦикла;
Буква=Сред(ДоменЛогин,СчетчикБукв,1);
Пока НЕ Буква="" Цикл //В цикле преобразуем в необходимый вид Домен, ЛогинИБ, ПолноеИмяПользователя
Если НЕ Буква="\" Тогда
Если ФлагДоменЛогин="Домен" Тогда
Домен=Домен+Буква;
КонецЕсли;
Если ФлагДоменЛогин="Логин" Тогда
ЛогинИБ=ЛогинИБ+Буква;
КонецЕсли;
Иначе
ФлагДоменЛогин="Логин";
КонецЕсли;
СчетчикБукв=СчетчикБукв+1;
Буква=Сред(ДоменЛогин,СчетчикБукв,1);
КонецЦикла;
Строка=Пользователи.Добавить(); //Добавляем в таблицу Пользователи строку с параметрами пользователя
Строка.Номер=НомерПользователя;
Строка.Домен=Домен;
Строка.Логин =ЛогинИБ ;
Строка.ФИО=ПолноеИмяПользователя;
Строка.ПометкаУдаления=ПометкаУдаленияПользователя;
Строка.НаименованиеВСправочникеПользователи=НаименованиеВСправочнике;
МассивЛогинов1.Добавить(ЛогинИБ); //Добавляем в возвращаемый массив логин пользователя в Информационной базе
НомерПользователя=НомерПользователя+1;
ПредидущийДомен=Домен;
ФлагДоменЛогин="Домен";
ЛогинИБ="";
Домен="";
КонецЦикла;
Возврат МассивЛогинов1;
КонецФункции
4. Функция ПолучитьДоменыИБ1 получает список доменов в МассивДоменов1, это необходимо для просмотра пользователей
в Актив Директории.
Код Функции:
&НаСервере
Функция ПолучитьДоменыИБ1()
//Заполняем возвращаемый массив МассивДоменов********************************************************************************************************
МассивДоменов1=Новый Массив;
ПустойДомен="";
СчетчикДоменов=1;
Запрос = Новый Запрос;
ПИБ = РеквизитФормыВЗначение("Пользователи",Тип("ТаблицаЗначений")); //Выгружаем Табличный реквизит формы в переменную
МВТ=Новый МенеджерВременныхТаблиц; //Создаем МенеджерВременныхТаблиц
Запрос.МенеджерВременныхТаблиц=МВТ;
Запрос.Текст =
"ВЫБРАТЬ
| ПИБ1.Домен КАК Домен
|ПОМЕСТИТЬ ВТДанные
|ИЗ
| &ПИБ1 КАК ПИБ1
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ВТДанные.Домен КАК Домен
|ИЗ
| ВТДанные КАК ВТДанные
|ГДЕ
| ВТДанные.Домен <> &ПустойДомен
|
|СГРУППИРОВАТЬ ПО
| ВТДанные.Домен"
;
Запрос.УстановитьПараметр("ПустойДомен",ПустойДомен);
Запрос.УстановитьПараметр("ПИБ1",ПИБ);
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
Пока Выборка.Следующий() Цикл //Выбираем результат запроса в возвращаемый массив МассивДоменов1
МассивДоменов1.Добавить(Выборка.Домен);
КонецЦикла;
Возврат МассивДоменов1;
КонецФункции
5. Процедура ПолучитьПользователяИзАД1 получает пользователей в Актив Директории и помещает их в таблицу ПользователиАД .
Данные таблицы используются на закладке формы ПользователиАД.
Код процедуры:
&НаКлиенте
Процедура ПолучитьПользователяИзАД1(МассивЛогинов,МассивДоменов)
//Процедура заполняет таблицу ПользователиАД, из АД заносим ФИО, Логин*******************************************************************************
//Достаем значение Логина
НомерПользователя=0;
Для Каждого ЭлементМассива из МассивЛогинов Цикл
ЛогинИБ=ЭлементМассива;
Если НЕ ЛогинИБ="" Тогда
ЛогинПользователя=СокрЛП(ЛогинИБ);
//Комутирум Active Directory для извлечения данных о пользователе
КомандаАДО = Новый COMОбъект("ADODB.Command");
СоединениеАДО = Новый COMОбъект("ADODB.Connection");
СоединениеАДО.Provider = "ADSDSOObject";
Попытка
СоединениеАДО.Open("Active Directory Provider");
Исключение
Сообщить("Ошибка при открытии Active Directory Provider: " + ОписаниеОшибки());
Возврат;
КонецПопытки;
КомандаАДО.ActiveConnection = СоединениеАДО;
//Получаем имя домена к которому принадлежит данный компьютер
Попытка
RootDSE = ПолучитьCOMОбъект("LDAP://RootDSE");
Исключение
Сообщить("Ошибка ПолучитьCOMОбъект(LDAP://RootDSE): " + ОписаниеОшибки());
Возврат;
КонецПопытки;
СчетчикДоменов=0;
ПолноеИмяПользователя="";
ИндексДомена=0;
ФлагЦиклаДомена=0;
ФлагПользователя=0;
Для Каждого ЭлементМассива из МассивДоменов Цикл
ТекущийДомен=ЭлементМассива;
// Если ВРег(ТекущийДомен)="KRG" Тогда
// ТекущийДомен="DC=krg,DC=mrg,DC=ru";
// Иначе
ТекущийДомен=ТекущийДомен+".local";
// КонецЕсли;
CommandText = "
|SELECT
| AdsPath
|FROM 'LDAP://" +ТекущийДомен + "'
|WHERE
| objectCategory = 'user'
| and objectClass = 'person'
| and SAMAccountName = '" + ЛогинПользователя + "'
|";
Попытка
ВыборкаАДО = СоединениеАДО.Execute( CommandText);
ПутьОбъекта = ВыборкаАДО.Fields("AdsPath").Value;
ОбъектАД = ПолучитьCOMОбъект(ПутьОбъекта);
ЛогинАД= ОбъектАД.sAMAccountName;
ПолноеИмяПользователя=ОбъектАД.cn;
Если ЛогинАД="" Тогда //Проверяем выборку на пустое значение , если ЛогинАД пуст пропускаем эту строку
ФлагЦиклаДомена=1;
КонецЕсли;
Исключение
ФлагЦиклаДомена=1;
КонецПопытки;
Если ФлагЦиклаДомена=0 Тогда //Проверяем был ли найден пользователь в домене
НомерПользователя=НомерПользователя+1;
Строка=ПользователиАД.Добавить();
Строка.ЛогинИБ =ЛогинИБ ;
Строка.Номер=НомерПользователя;
Строка.Домен=ТекущийДомен;
Строка.Логин =ЛогинАД ;
Строка.ФИО=ПолноеИмяПользователя;
Сообщить("Пользователь"+ПолноеИмяПользователя+" найден в АД.");
ИмяДомена="";
ЛогинАД="";
ПолноеИмяПользователя="";
ВыборкаАДО.Close();
Прервать;
КонецЕсли;
ФлагЦиклаДомена=0;
ИндексДомена=ИндексДомена+1;
КонецЦикла;
ФлагПользователя=0;
СоединениеАДО.Close();
КонецЕсли;
КонецЦикла;
КонецПроцедуры
6. Процедура ЗаполнениеОтличиеИБотАД заполняет таблицу ОтличиеИБотАД, которая используются на закладке формы ОтличиеИБотАД.
Код процедуры:
&НаКлиенте
Процедура ПолучитьПользователяИзАД1(МассивЛогинов,МассивДоменов)
//Процедура заполняет таблицу ПользователиАД, из АД заносим ФИО, Логин*******************************************************************************
//Достаем значение Логина
НомерПользователя=0;
Для Каждого ЭлементМассива из МассивЛогинов Цикл
ЛогинИБ=ЭлементМассива;
Если НЕ ЛогинИБ="" Тогда
ЛогинПользователя=СокрЛП(ЛогинИБ);
//Комутирум Active Directory для извлечения данных о пользователе
КомандаАДО = Новый COMОбъект("ADODB.Command");
СоединениеАДО = Новый COMОбъект("ADODB.Connection");
СоединениеАДО.Provider = "ADSDSOObject";
Попытка
СоединениеАДО.Open("Active Directory Provider");
Исключение
Сообщить("Ошибка при открытии Active Directory Provider: " + ОписаниеОшибки());
Возврат;
КонецПопытки;
КомандаАДО.ActiveConnection = СоединениеАДО;
//Получаем имя домена к которому принадлежит данный компьютер
Попытка
RootDSE = ПолучитьCOMОбъект("LDAP://RootDSE");
Исключение
Сообщить("Ошибка ПолучитьCOMОбъект(LDAP://RootDSE): " + ОписаниеОшибки());
Возврат;
КонецПопытки;
СчетчикДоменов=0;
ПолноеИмяПользователя="";
ИндексДомена=0;
ФлагЦиклаДомена=0;
ФлагПользователя=0;
Для Каждого ЭлементМассива из МассивДоменов Цикл
ТекущийДомен=ЭлементМассива;
// Если ВРег(ТекущийДомен)="KRG" Тогда
// ТекущийДомен="DC=krg,DC=mrg,DC=ru";
// Иначе
ТекущийДомен=ТекущийДомен+".local";
// КонецЕсли;
CommandText = "
|SELECT
| AdsPath
|FROM 'LDAP://" +ТекущийДомен + "'
|WHERE
| objectCategory = 'user'
| and objectClass = 'person'
| and SAMAccountName = '" + ЛогинПользователя + "'
|";
Попытка
ВыборкаАДО = СоединениеАДО.Execute( CommandText);
ПутьОбъекта = ВыборкаАДО.Fields("AdsPath").Value;
ОбъектАД = ПолучитьCOMОбъект(ПутьОбъекта);
ЛогинАД= ОбъектАД.sAMAccountName;
ПолноеИмяПользователя=ОбъектАД.cn;
Если ЛогинАД="" Тогда //Проверяем выборку на пустое значение , если ЛогинАД пуст пропускаем эту строку
ФлагЦиклаДомена=1;
КонецЕсли;
Исключение
ФлагЦиклаДомена=1;
КонецПопытки;
Если ФлагЦиклаДомена=0 Тогда //Проверяем был ли найден пользователь в домене
НомерПользователя=НомерПользователя+1;
Строка=ПользователиАД.Добавить();
Строка.ЛогинИБ =ЛогинИБ ;
Строка.Номер=НомерПользователя;
Строка.Домен=ТекущийДомен;
Строка.Логин =ЛогинАД ;
Строка.ФИО=ПолноеИмяПользователя;
Сообщить("Пользователь"+ПолноеИмяПользователя+" найден в АД.");
ИмяДомена="";
ЛогинАД="";
ПолноеИмяПользователя="";
ВыборкаАДО.Close();
Прервать;
КонецЕсли;
ФлагЦиклаДомена=0;
ИндексДомена=ИндексДомена+1;
КонецЦикла;
ФлагПользователя=0;
СоединениеАДО.Close();
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Обработка особенно актуальна для случая когда пользователи имеют аутентификацию операционной системы и работают через консоль.