|  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, доменный пользователь, хранимые процедуры | 
|  | 
| 
 |