Недавно пришлось повозиться с 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;
}