Мне часто приходится сталкиваться с обработкой информации из Active Directory. Поскольку данная система распространена во многих местах, я решил поделиться своим опытом работы с ней.
Все началось с того, что я раздавал доступ к MS Sharepoint. По заявкам от сотрудников в лучшем случае получали счета; в худшем случае они могли написать что-то вроде «Я и мой босс».
Это поначалу раздражало, и я, чувствуя себя настоящим админом, отправлял подобные запросы обратно нерадивым пользователям, чтобы они все переделали.
Это обернулось кучей гневных писем и звонков.
Я даже начал задаваться вопросом, случайно ли аббревиатура Active Directory — AD — совпала с русским словом «Ад».
В итоге, поняв, что нам необходимо менять мир к лучшему, я решил детально разобраться, что на самом деле хранится в Active Directory и как с его помощью можно автоматически раздавать доступ и другие полезные вещи.
Компания хранит информацию о сотрудниках в 2-х местах:
- Активный каталог
- база данных Oracle
у одного сотрудника может быть несколько учетных записей.
Возникла необходимость однозначно идентифицировать сотрудника по его аккаунту.
Решение этой проблемы было найдено и тиражировано во многих утилитах и программных продуктах, которые активно используются внутри компании.
Одной из наиболее часто используемых утилит является программа поиска информации о сотрудниках.
Он ищет сотрудника или сотрудников по различным критериям и предоставляет о них максимально полную информацию, объединяя данные из Active Directory и Oracle. Особой популярностью пользуются фотографии сотрудников, которые хранятся в базе данных.
Также стоит отметить интеграцию Active Directory не только с Oracle, но и с MS Sharepoint. Благодаря найденному решению появилось приложение, способное быстро предоставить доступ группе пользователей из Active Directory к страницам портала Sharepoint, а также удалить с него пользователей, по разным причинам покинувших его.
Проблема решилась 2 способами:
- Для получения информации по одному сотруднику — DBMS_LDAP в Oracle
- Чтобы скачать все доступные записи и посмотреть, что находится в Active Directory, мы использовали код C#.
- Свойство DirectorySearcher.PageSize должно быть отличным от 0, если вы хотите, чтобы функция FindAll() возвращала все записи.
- Вы должны вызвать Dispose() в экземпляре DirectorySearcher.
По умолчанию это 0, что означает получение этого значения с сервера.
На сервере обычно установлено значение 1000. Вы можете поиграть со свойством SizeLimit и посмотреть, как изменится результат работы функции ( связь ).
По ссылке выше есть пример кода, использующего yiled, что более правильно с точки зрения работы .
NET, но в примере ниже я его не использовал для ясности алгоритма.
Примеры кода:
- DBMS_LDAP Oracle
function GetDataByUser(userAccount VARCHAR2) return VARCHAR2 is l_ldap_host VARCHAR2(256) := 'host'; l_ldap_port VARCHAR2(256) := 'port'; l_ldap_user VARCHAR2(256) := 'user'; l_ldap_passwd VARCHAR2(256) := 'password'; l_ldap_base VARCHAR2(256) := 'ldap_path'; l_retval PLS_INTEGER; l_session DBMS_LDAP.session; l_attrs DBMS_LDAP.string_collection; l_message DBMS_LDAP.message; l_entry DBMS_LDAP.message; l_attr_name VARCHAR2(256); l_ber_element DBMS_LDAP.ber_element; l_vals DBMS_LDAP.string_collection; ret VARCHAR2(256); begin DBMS_LDAP.USE_EXCEPTION := TRUE; l_session := DBMS_LDAP.init(hostname => l_ldap_host,portnum => l_ldap_port); l_retval := DBMS_LDAP.simple_bind_s(ld => l_session,dn => l_ldap_user,passwd => l_ldap_passwd); l_attrs(1) := 'postalcode'; l_retval := DBMS_LDAP.search_s(ld => l_session,base => l_ldap_base,scope => DBMS_LDAP.SCOPE_SUBTREE,filter => '(&(objectClass=user)(cn=' ||userAccount || ')(mail=*))',attrs => l_attrs,attronly => 0,res => l_message); IF DBMS_LDAP.count_entries(ld => l_session, msg => l_message) > 0 THEN l_entry := DBMS_LDAP.first_entry(ld => l_session,msg => l_message); l_attr_name := DBMS_LDAP.first_attribute(ld => l_session, ldapentry => l_entry, ber_elem => l_ber_element); l_vals := DBMS_LDAP.get_values (ld => l_session, ldapentry => l_entry, attr => l_attr_name); ret := l_vals(0); END IF; l_retval := DBMS_LDAP.unbind_s(ld => l_session); return ret; end GetDataByUser;
- С#
static void Main(string[] args) { var listDict = ActiveDirectoryTraversal(); var d = listDict[0]; } private static List<Dictionary<string, object>> ActiveDirectoryTraversal() { List<Dictionary<string, object>> ret = null; var dep = new DirectoryEntry(); dep.AuthenticationType = AuthenticationTypes.FastBind; dep.Path = " LDAP://yourpath "; using(DirectorySearcher ds = new DirectorySearcher(dep)) { ds.Filter = "(&(objectClass=user))"; //ds.SizeLimit = 5; ds.PageSize = 100; using (SearchResultCollection results = ds.FindAll()) { var e = results.Count; if (results != null && results.Count > 0) { ret = SaveData(results); } } } dep.Close(); return ret; } private static List<Dictionary<string, object>> SaveData(SearchResultCollection results) { var ret = new List<Dictionary<string, object>>(); for (int i = 0; i < results.Count; i++) { var res = results[i]; var dict = new Dictionary<string, object>(); foreach (var e in res.Properties.PropertyNames) { if (!dict.ContainsKey(e.ToString())) dict.Add(e.ToString(), res.Properties[e.ToString()][0]); } ret.Add(dict); } return ret; }
Заключение:
Возможность работы с Active Directory и доступ к ней напрямую из базы данных Oracle существенно упростили работу программистов в отделе, где я работаю.Изначально ради эксперимента я загрузил содержимое Active Directory в таблицу базы данных.
Затем, к своему удивлению, я обнаружил ряд хранимых процедур, которые работали с этой таблицей.
Оказалось, что разработчики обратились к нему потому, что им было лень разбираться в пакете DBMS_LDAP. Этот прецедент побудил меня захотеть рассказать и привести примеры того, как можно работать с Active Directory. Теги: #active каталог #Active Directory #oracle #C++ #.
NET #dbms_ldap #oracle #.
NET #C++
-
Бисбрук, Джордж Ван
19 Oct, 24 -
Вконтакте Блокирует Нерадивых Пользователей
19 Oct, 24 -
Личный Транспорт Будущего
19 Oct, 24 -
Программирование Stm3220G Для Ecos
19 Oct, 24