Интеграция 1С и Active Directory на сервере
Получить информацию Active Directory на управляемых формах со стороны сервера, под любым пользователем домена.
- Описание
- Подробнее
Описание
Предлагаю вам рассмотреть возможность получения информации из Active Directory на стороне сервера.
&НаСервере
Функция ПолучитьИнформациюActiveDirectoryНаСервере(пИмяДомена, пПользователь, пПароль, пУсловияОтбора)
Перем Пользователь,Пароль,Домен,Стр,Контроллер,Отбор,Подразделение,Группа;
//ADsPath,Name,Mail,telephoneNumber,displayName,sAMAccountName,department
СтрКолонок = Новый Структура("ADsPath,sn,givenName,Name,Mail,telephoneNumber,displayName,sAMAccountName,department,userPrincipalName");
ТаблицаРезультат = Новый ТаблицаЗначений;
Для Каждого СтрКол Из СтрКолонок Цикл
ТаблицаРезультат.Колонки.Добавить(СтрКол.Ключ, Новый ОписаниеТипов("Строка"));
КонецЦикла;
ТаблицаРезультат.Колонки.Добавить("Наименование", Новый ОписаниеТипов("Строка"));
ТаблицаРезультат.Колонки.Добавить("АутентификацияОС", Новый ОписаниеТипов("Строка"));
ТаблицаРезультат.Колонки.Добавить("Фамилия", Новый ОписаниеТипов("Строка"));
ТаблицаРезультат.Колонки.Добавить("Имя", Новый ОписаниеТипов("Строка"));
ТаблицаРезультат.Колонки.Добавить("Отчество", Новый ОписаниеТипов("Строка"));
ТаблицаРезультат.Колонки.Добавить("Служебный", Новый ОписаниеТипов("Булево"));
ТаблицаРезультат.Колонки.Добавить("ДоменWINS", Новый ОписаниеТипов("Строка"));
ТаблицаРезультат.Колонки.Добавить("ДоменDNS", Новый ОписаниеТипов("Строка"));
AD_Domain_DC = пИмяДомена; //Имя домена - Перед (Windows 2000), Имя WINS
//Домен="...................."; //Каноническое имя домена, Имя DNS
Пользователь = пПользователь;
Пароль = пПароль;
АДСИ = Новый COMОбъект("ADSystemInfo");
Домен = АДСИ.DomainDNSName; //Каноническое имя домена, Имя DNS
//Но на самом деле хватит и обычного пользователя домена
//Пользователь="администратор@" + Домен;
//Пароль="СуперпарольАдминистратора";
ДСО = ПолучитьCOMОбъект("GC:");
Корень = ДСО.OpenDSObject("GC://RootDSE", ""+Пользователь+"@"+Домен, Пароль,1);
НашДомен = Корень.Get("defaultNamingContext");
ЗаписьАДО = Новый COMОбъект("ADODB.recordset");
СоединениеАДО = Новый COMОбъект("ADODB.Connection");
СоединениеАДО.Provider = "ADsDSOObject";
ADS_SECURE_AUTHENTICATION = 1; // Позволяет читать данные, когда не разрешен анонимный доступ
СоединениеАДО.Properties("User ID" ).Value = AD_Domain_DC+"\"+Пользователь;
СоединениеАДО.Properties("Password" ).Value = Пароль;
СоединениеАДО.Properties("ADSI Flag").Value = ADS_SECURE_AUTHENTICATION;
СоединениеАДО.Open("ADs Provider");
Если пУсловияОтбора = 1 Тогда
//Все пользователи, кроме отключенных
ТектсУсловияОтбора = "(!useraccountcontrol:1.2.840.113556.1.4.803:=2)";
ИначеЕсли пУсловияОтбора = 2 Тогда
//Только отключенные пользователи
ТектсУсловияОтбора = "(useraccountcontrol:1.2.840.113556.1.4.803:=2)";
Иначе
//Все пользователи...
ТектсУсловияОтбора = "";
КонецЕсли;
ПоляЗапроса = "ADsPath,sn,givenName,Name,Mail,telephoneNumber,displayName,sAMAccountName,department,userPrincipalName";
ЗаписьАДО.Open("<GC://" + СокрЛП(НашДомен) + ">;(&(objectCategory=person)(objectClass=user)"+ТектсУсловияОтбора+"); "+ПоляЗапроса+" ;subtree", СоединениеАДО, 0, 1);
//ADsPath,Name,Mail,telephoneNumber,displayName,sAMAccountName,department
//Сообщить("ИмяПользователя " + СокрЛП(ВыборкаАДО.Fields("displayName").Value));
//Сообщить("ИмяАккаунта " + СокрЛП(ВыборкаАДО.Fields("sAMAccountName").Value));
//Сообщить("Подразделение " + СокрЛП(ВыборкаАДО.Fields("department").Value));
//Сообщить("Почта " + СокрЛП(ВыборкаАДО.Fields("mail").Value));
//Сообщить("Телефон " + СокрЛП(ВыборкаАДО.Fields("telephoneNumber").Value));
Если ЗаписьАДО.RecordCount > 0 Тогда
Пока Не ЗаписьАДО.EOF Цикл
Для Каждого СтрКол Из СтрКолонок Цикл
СтрКолонок[СтрКол.Ключ] = ЗаписьАДО.Fields(СтрКол.Ключ).Value;
КонецЦикла;
НоваяСтрока = ТаблицаРезультат.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтрока,СтрКолонок);
Если НЕ ПустаяСтрока(НоваяСтрока.userPrincipalName) Тогда
НоваяСтрока.АутентификацияОС = "\\"+AD_Domain_DC+"\"+НоваяСтрока.sAMAccountName;
КонецЕсли;
//Наименование
НоваяСтрока.Наименование = СокрЛП(НоваяСтрока.displayName);
Если ПустаяСтрока(НоваяСтрока.Наименование) Тогда
НоваяСтрока.Наименование = СокрЛП(НоваяСтрока.Name);
КонецЕсли;
//Отчество
НоваяСтрока.Фамилия = СокрЛП(НоваяСтрока.sn);
НоваяСтрока.Имя = СокрЛП(НоваяСтрока.givenName);
НовоеИмя = "";
НоваяСтрока.Отчество = ПолучитьОтчествоИзАД(НоваяСтрока.sn, НоваяСтрока.givenName, НоваяСтрока.Name, НовоеИмя);
Если НЕ ПустаяСтрока(НовоеИмя) Тогда
НоваяСтрока.Имя = НовоеИмя;
КонецЕсли;
НоваяСтрока.Служебный = ПустаяСтрока(НоваяСтрока.userPrincipalName);
НоваяСтрока.ДоменWINS = AD_Domain_DC;
НоваяСтрока.ДоменDNS = Домен;
Попытка
ЗаписьАДО.MoveNext();
Исключение
Прервать;
КонецПопытки;
КонецЦикла;
КонецЕсли;
ЗаписьАДО.Close();
ЗаписьАДО = Неопределено;
СоединениеАДО.Close();
СоединениеАДО = Неопределено;
Возврат ТаблицаРезультат;
КонецФункции

