|
16.02.2017, 15:52 | #1 |
Участник
|
Извлечение информации из ActiveDirectory
Недавно пришлось повозиться с ActiveDirectory в AX2012. Решил выложить на форум, может кому пригодится...
Задача стояла следующая. Есть SSRS-отчет, выводящий данные о пользователях. Решили прикрутить к нему информацию о том, к какому подразделению пользователь относится. По-хорошему было бы здорово создать дополнительное поле и при импорте из AD сразу его заполнять. Но приказано было особо не заморачиваться и решение вылилось в следующий код. Это обычный дисплейный метод на таблице SysUserInfo. Его легко вызвать в SSRS, если у нас обычный Query. X++: //BP Deviation Documented public display PPOADDepartment ppoADDepartment() { // .NET objects System.DirectoryServices.DirectorySearcher directorySearcher; System.DirectoryServices.DirectoryEntry directoryEntry; System.DirectoryServices.SearchResultCollection searchResults; System.DirectoryServices.SearchResult searchResult; // .NET properties System.DirectoryServices.PropertyCollection properties; System.DirectoryServices.PropertyValueCollection propertyValues; // MS Dynamics AX variables PPOADDepartment department; UserInfo userInfo; Counter total; Counter idx; select firstOnly networkDomain, networkAlias from userInfo where userInfo.Id == this.Id; try { new InteropPermission(InteropKind::ClrInterop).assert(); directoryEntry = new System.DirectoryServices.DirectoryEntry(strFmt('LDAP://%1', userInfo.networkDomain)); directorySearcher = new System.DirectoryServices.DirectorySearcher(directoryEntry, strfmt('(&(objectClass=user)(SamAccountName=%1))', userInfo.NetworkAlias)); searchResults = DirectorySearcher.FindAll(); total = SearchResults.get_Count(); for (idx=0; idx<total; idx++) { searchResult = searchResults.get_Item(idx); directoryEntry = SearchResult.GetDirectoryEntry(); if (!directoryEntry) continue; properties = directoryEntry.get_Properties(); if (properties && properties.Contains('department')) { propertyValues = properties.get_Item('department'); department = propertyValues.get_Value(); break; } } directorySearcher.Dispose(); searchResults.Dispose(); CodeAccessPermission::revertAssert(); } catch (Exception::CLRError) { // access to ActiveDirectory failed department = ''; } return department; }
__________________
// no comments |
|
|
За это сообщение автора поблагодарили: AlGol (2), trud (2), sukhanchik (2), Logger (1), gl00mie (2), Weez (2), Jorj (1). |