AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 16.02.2017, 15:52   #1  
dech is offline
dech
Участник
Аватар для dech
Самостоятельные клиенты AX
 
647 / 350 (13) ++++++
Регистрация: 25.06.2009
Адрес: Омск
Записей в блоге: 3
Извлечение информации из 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).
Теги
active directory, законченный пример

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Загрузка информации с сайта http://torgi.gov.ru/lotSearch1.html?bidKindId=13 alexudin DAX: Программирование 7 17.04.2013 14:16
Отображение информации QQmore DAX: Программирование 10 06.02.2013 12:32
Axapta и ActiveDirectory Nikolaich DAX: Программирование 16 24.05.2012 14:31
Выверка информации в модулях и ГК Мирослав DAX: Функционал 5 07.07.2011 11:34
Чего не хватает из аналитической информации? ollu DAX: Функционал 38 13.03.2009 16:00

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 16:22.