01.07.2009, 14:07 | #1 |
Модератор
|
Как в Ax 3.0 с AD загрузить список пользователей ?
Кто может поведать как из Axapta 3.0 SP3 с Active directory запросить список активных пользователей?
Список полей: логин, полное имя, e-mail Кто нибудь пробовал переносить класс AxaptaUserManager с аксапты 4.0 в 3.0? P.S. изучаю тему Axapta и ActiveDirectory Последний раз редактировалось Poleax; 01.07.2009 в 14:11. Причина: Axapta и ActiveDirectory |
|
01.07.2009, 14:35 | #2 |
Administrator
|
Есть пример (вторая ссылка в гугле "список пользователей AD") http://www.willasrari.com/blog/query...-c/000133.aspx на C#
Есть пример (первая ссылка в гугле "список пользователей AD vbscript") http://forum.script-coding.info/viewtopic.php?id=1467 на VBScript. Если прицепить .NET к 3-шке не получится, то уж VBScript должен прицепиться на ура через new COM("WinNT://" & strDomain & "/" & strGroup & ",group") вместо GetObject. Хотя было бы интересно получить информацию о результате (не)успешного опыта выполнении Вашей задачи
__________________
Возможно сделать все. Вопрос времени |
|
|
За это сообщение автора поблагодарили: Poleax (1). |
01.07.2009, 15:58 | #3 |
Участник
|
Цитата:
Код: using System; using System.DirectoryServices; namespace testAD { class Program { static void Main(string[] args) { String ldapPath = @"LDAP://bla-bla-bla"; DirectoryEntry root = new DirectoryEntry(ldapPath); PrintUsers(root); } [Flags] public enum AdsUserFlags { Script = 1, // 0x1 AccountDisabled = 2, // 0x2 HomeDirectoryRequired = 8, // 0x8 AccountLockedOut = 16, // 0x10 PasswordNotRequired = 32, // 0x20 PasswordCannotChange = 64, // 0x40 EncryptedTextPasswordAllowed = 128, // 0x80 TempDuplicateAccount = 256, // 0x100 NormalAccount = 512, // 0x200 InterDomainTrustAccount = 2048, // 0x800 WorkstationTrustAccount = 4096, // 0x1000 ServerTrustAccount = 8192, // 0x2000 PasswordDoesNotExpire = 65536, // 0x10000 MnsLogonAccount = 131072, // 0x20000 SmartCardRequired = 262144, // 0x40000 TrustedForDelegation = 524288, // 0x80000 AccountNotDelegated = 1048576, // 0x100000 UseDesKeyOnly = 2097152, // 0x200000 DontRequirePreauth = 4194304, // 0x400000 PasswordExpired = 8388608, // 0x800000 TrustedToAuthenticateForDelegation = 16777216, // 0x1000000 NoAuthDataRequired = 33554432 // 0x2000000 } private static void PrintUsers(DirectoryEntry de) { foreach (DirectoryEntry elem in de.Children) { if (string.Compare(elem.SchemaClassName, "user") != 0) PrintUsers(elem); else { AdsUserFlags userFlags = (AdsUserFlags)elem.Properties["userAccountControl"].Value; //На случай если поле null try { Console.WriteLine("User: {0}", elem.Properties["displayName"].Value.ToString()); } catch { Console.WriteLine("User:"); } Console.WriteLine("Path: {0}", elem.Path); Console.WriteLine("Parameters: {0}", userFlags); } } } } } |
|
01.07.2009, 16:29 | #4 |
Участник
|
Вот список всех атрибутов пользователя в AD. Используя пример выше, до них можно добраться так
Код: Console.WriteLine("Логин: {0}", elem.Properties["sAMAccountName"].Value.ToString()); Console.WriteLine("Почта: {0}", elem.Properties["mail"].Value.ToString()); Console.WriteLine("Полное имя: {0}", elem.Properties["displayName"].Value.ToString()); |
|
01.07.2009, 17:55 | #5 |
Модератор
|
Я сделал немного по другому, с использованием SQL Server
1) Создал связанный сервер PHP код:
Локальный - это sql пользователь под которым Аксапта 3.0 подключается БД. Удаленный - это доменный пользователь, кто может читать AD. 2) Создал хранимую процедуру в БД. Параметр DOMAIN - это полное имя домена в нашей сети. PHP код:
X++: static void Job_ViewUsers() { Connection con = new Connection(); Statement stmt = con.createStatement(); ResultSet resultSet; str sqlExpression = "EXEC sp_GetListUserAD"; ; resultSet = stmt.executeQuery(sqlExpression); while (resultSet.next()) { //SELECT samaccountname, givenname, sn, displayName, mail info(strfmt('Login = %1, Имя = %2, Фамилия = %3, ФИО = %4, E-mail = %5' ,resultSet.getString(1), resultSet.getString(2), resultSet.getString(3), resultSet.getString(4), resultSet.getString(5))); } } http://www.sql.ru/forum/actualthread...y+adsi#7194114 Последний раз редактировалось Poleax; 01.07.2009 в 17:58. |
|
|
За это сообщение автора поблагодарили: sukhanchik (3). |
01.07.2009, 18:52 | #6 |
Участник
|
Можно воспользоваться ADO
X++: static void GetUserList(Args _args) { Com oConnect = new Com("ADODB.Connection"); Com property; Com Properties; Com rs; Com Fields; Com Field; ComVariant var; Array array; str s; int i; boolean f; str address; #define.UF_ACCOUNTDISABLE(0x02) ; oConnect.Provider("ADsDSOObject"); Properties = oConnect.Properties(); /* property = Properties.Item("User ID"); property.Value("пользователь"); property = Properties.Item("Password"); property.Value("пароль");*/ // Если для доступа надо подключаться под другим пользователем, то раскомментировать и указать правильный аккаунт property = Properties.Item("Encrypt Password"); property.Value(True); oConnect.Open("DS Query"); // OU добавляются вначале запроса LDAP <LDAP://OU=Организация,DC=Axapta,DC=ru> rs = oConnect.Execute(ComVariant::createFromStr( "<LDAP://DC=Axapta,DC=ru>;(&((objectClass=user)(objectCategory=person)));" + "userAccountControl,userPrincipalName,Name,proxyAddresses,sAMAccountName,Mail;subTree")); //;onelevel SetPrefix("Пользователи домена"); While (!rs.EOF()) { Fields = rs.Fields(); Field = Fields.Item("userAccountControl"); var = Field.Value(); if ((var.int() & #UF_ACCOUNTDISABLE) == 0) // Только активные пользователи { Field = Fields.Item("sAMAccountName"); // имя аккаунта var = Field.Value(); s = var.bStr(); Field = Fields.Item("userPrincipalName"); // имя в формате имя@домен var = Field.Value(); s += ";" + var.bStr(); Field = Fields.Item("Name"); // полное имя var = Field.Value(); s += ";" + var.bStr(); Field = Fields.Item("proxyAddresses"); // почтовый адрес на сервере Exchange var = Field.Value(); address = ""; if (var.variantType() != ComVariantType::VT_NULL) { array = var.safeArray(); for (i=1;i<=array.lastIndex();i++) { var = array.value(i); if (var.variantType() == ComVariantType::VT_BSTR) { if (match("<SMTP", var.bStr())) address += (address ? "," : "") + substr(var.bStr(), strLen("SMTP:")+1, strLen(var.bStr())); } } if (address) s += ";" + address; else { Field = Fields.Item("Mail"); // поле адреса в данных пользователя var = Field.Value(); s += ";" + var.bStr(); } } info(s); } rs.MoveNext(); } }
__________________
Axapta v.3.0 sp5 kr2 Последний раз редактировалось AndyD; 01.07.2009 в 18:57. |
|
|
За это сообщение автора поблагодарили: sukhanchik (3), Poleax (1), Fizik (1), oip (5). |
02.07.2009, 11:44 | #7 |
Модератор
|
Сколько оказывается способов решения.
Всем спасибо. |
|
02.07.2009, 19:58 | #8 |
Модератор
|
Забавно, но профайлер кода показывает, что вариант с вызовом процедуры на SQL Server отрабатывает в среднем в 5 раз быстрее чем аналогичный запрос с использованием ADO
Берутся только поля X++: "userAccountControl,sAMAccountName,displayName,Mail" |
|
Теги |
active directory, ado, ax3.0, sql, доменный пользователь, хранимые процедуры |
|
|