По запросу службы тех. поддержки, написал обработку для решения описанной выше задачи (в конфигурациях УТ10.3 и БП 2.0).
На Инфостарте уже есть обработки, работающие с информацией Active Directory, так что добавлю к ним и свою.
Для тех, кто решит ею воспользоваться, приведу краткое описание действий для работы с ней:
1. Перед формированием отчета, нужно указать/определить имя домена в структуре которого находятся искомые учетные записи. Если, при автоматическом определении имени домена, выскочит ошибка, то скорее всего у Вас недостаточно прав.
Обычно имя домена указывается через "\" перед Вашим логином при подключения к серверу терминалов по протоколу Remote Desktop Protocol (RDP).
2. Выводим информацию в отчет
3. Получаем нужную выборку данных, используя отборы.
Представленная на рис. комбинация оставит выборку пользователей:
- с отключенной учетной записью Windows
- имеющих доступ в текущую базу данных
- включенную аутентификацию операционной системы для входа в 1С).
4. Выбираем действие над полученной выборкой пользователей
5. Тут включается режим "паранойя")) .. поэтому еще раз укажем нужных пользователей или отметим всех
6. Готово. Для того чтобы получить новый набор данных нужно снять галочку "Уже рассчитаный набор данных".
Теперь немного кода с комментариями. При выполнении команды "Сформировать" происходит следующее:
1. Получаем по запросу LDAP список отключенных учетных записей.
Протокол LDAP (Lightweight Directory Access Protocol, упрощённый протокол для доступа к каталогу) служит для доступа к службам каталогов, в том числе Active Directory в Windows 2000/2003. Служба каталогов Active Directory является LDAP-совместимой реализацией службы каталогов Microsoft для операционных систем семейства Windows и хранит информацию о сетевых ресурсах - пользователях, компьютерах, файлах, папках и принтерах, а также информацию безопасности, касающуюся этих ресурсов.
Специальный объект RootDSE (Root Directory Service Entry) автоматически вернёт имя того домена, к которому принадлежит данный компьютер:
# получение имени домена, к которому принадлежит данный компьютер:
adsi = win32com.client.GetObject("LDAP://RootDSE")
domain = adsi.Get("defaultNamingContext")
Для начала, создадим подключение в Active Directory
Функция СоздатьПодключениеКAD(ОписаниеОшибок = "")
ПодключениеКAD = Неопределено;
Попытка
ПодключениеКAD = Новый COMОбъект("ADODB.Connection");
ПодключениеКAD.Provider = "ADSDSOObject";
ПодключениеКAD.cursorLocation = 3; //adUseClient
ПодключениеКAD.Open("ADs Provider");
Исключение
ПодключениеКAD = Неопределено;
ОписаниеОшибок = "Не удалось создать подключение к Active Directory!";
КонецПопытки;
Возврат ПодключениеКAD;
КонецФункции
затем получаем список учетных записей Windows. В массив Результат собираем значения ОписаниеОбъекта. Это структура со описанием свойств записи пользователя.
Функция ПолучитьМассивСотрудниковAD() Экспорт
Результат = Новый Массив;
ИмяГруппыAD = "DC="+ДоменActiveDirectory;
ПоляЗапроса = ПолучитьСоответствиеПолей();
СтрокаПодключения = СтроковыеФункцииКлиентСервер_ПодставитьПараметрыВСтроку("<LDAP://%1>;(&(objectCategory=person)(objectClass=user));%2;subtree", ИмяГруппыAD, ПолучитьИменаПолей(ПоляЗапроса));
rs = ПолучитьВыборкуLDAP(СтрокаПодключения);
Сч = 0;
Если ИСТИНА
И НЕ rs = Неопределено
И rs.RecordCount > 0
Тогда
Пока Не rs.EOF Цикл
Если rs.Fields("givenName").Value = null Тогда
Попытка
rs.MoveNext();
Сч = Сч + 1;
Исключение
СтатусВыполнения = "Данные получены не полностью (" + Сч + " записей). Ограничьте размер выборки.";
Прервать;
КонецПопытки;
Продолжить;
КонецЕсли;
ОписаниеОбъекта = Новый Структура("Идентификатор, Значения", "", Новый Структура());
Результат.Добавить(ОписаниеОбъекта);
ОписаниеОбъекта.Идентификатор = ПривестиМассивИДКСтроке(rs.Fields("objectGUID").Value);
Для каждого ТекКлючЗначение Из ПоляЗапроса Цикл
ОписаниеОбъекта.Значения.Вставить(ТекКлючЗначение.Значение, rs.Fields(ТекКлючЗначение.Ключ).Value);
КонецЦикла;
Попытка
rs.MoveNext();
Сч = Сч + 1;
Исключение
СтатусВыполнения = "Данные получены не полностью (" + Сч + " записей). Ограничьте размер выборки.";
Прервать;
КонецПопытки;
КонецЦикла;
КонецЕсли;
rs.Close();
rs = Неопределено;
Возврат Результат;
КонецФункции
Описание свойств записи пользователя задается набором полей в этой функции:
Функция ПолучитьСоответствиеПолей()
Результат = Новый Соответствие;
Результат.Вставить("ADsPath", "ПолноеИмя");
Результат.Вставить("Name", "Наименование");
Результат.Вставить("DisplayName", "ОтображаемоеИмя");
Результат.Вставить("Mail", "АдресЭлектроннойПочты");
Результат.Вставить("sAMAccountName", "ИмяАккаунта");
Результат.Вставить("userAccountControl", "ПараметрДоступа");
Результат.Вставить("memberOf", "СостоитВГруппах");
Результат.Вставить("objectClass", "КлассыОбъекта");
Результат.Вставить("title", "Должность");
Результат.Вставить("department", "Департамент");
Результат.Вставить("msExchShadowGivenName", "Фамилия");
Результат.Вставить("msExchShadowSn", "ИмяОтчество");
Результат.Вставить("givenName", "Имя");
Результат.Вставить("sAMAccountName", "Логин");
Результат.Вставить("objectGUID", "Идентификатор");
Возврат Результат;
КонецФункции
По значению в поле "ПараметрДоступа" будет определяться текущий статус учетной записи пользователя, который будет выводится в колонке "Отключенная учетная запись ОС". Расшифровка значений параметра задается в этой функции:
Функция ПолучитьПараметрыДоступа()
Результат = Новый Соответствие;
Результат.Вставить(512, Истина); //Enabled Account
Результат.Вставить(514, Ложь); //Disabled Account
Результат.Вставить(544, Истина); //Enabled, Password Not Required
Результат.Вставить(546, Ложь); //Disabled, Password Not Required
Результат.Вставить(66048, Истина); //Enabled, Password Doesn't Expire
Результат.Вставить(66050, Ложь); //Disabled, Password Doesn't Expire
Результат.Вставить(66080, Истина); //Enabled, Password Doesn't Expire & Not Required
Результат.Вставить(66082, Ложь); //Disabled, Password Doesn't Expire & Not Required
Результат.Вставить(262656, Истина); //Enabled, Smartcard Required
Результат.Вставить(262658, Ложь); //Disabled, Smartcard Required
Результат.Вставить(262688, Истина); //Enabled, Smartcard Required, Password Not Required
Результат.Вставить(262690, Ложь); //Disabled, Smartcard Required, Password Not Required
Результат.Вставить(328192, Истина); //Enabled, Smartcard Required, Password Doesn't Expire
Результат.Вставить(328194, Ложь); //Disabled, Smartcard Required, Password Doesn't Expire
Результат.Вставить(328224, Истина); //Enabled, SmРезультат.Вставить(artcard Required, Password Doesn't Expire & Not Required
Результат.Вставить(328226, Ложь); //Disabled, Smartcard Required, Password Doesn't Expire & Not Required
Возврат Результат;
КонецФункции
2. Получаем всех пользователей 1С.
3. Сопоставляем два списка. Для того, чтобы связать персону из 1С и персону из Active Directory, необходимо иметь некий идентификатор, связывающий эти две записи. В моем случае будем связывать по логину учетной записи Windows.
4. Выводим информацию в отчет. Полученная таблица значений служит источником для набора данных СКД.
5. Далее уже работаем с данными через отчет. Реализованы следующие операции:
- перемещение элемента справочника "Пользователи" в указанную группу
- снятие/установка галочки "Аутентификация операционной системы" в карточке пользователя.
добавлена возможность сформировать отчет по справочнику "Пользователи" и пользователям информационной базы: