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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 22.09.2008, 13:06   #1  
_scorp_ is offline
_scorp_
Участник
Аватар для _scorp_
MCBMSS
 
488 / 369 (13) ++++++
Регистрация: 25.07.2007
Адрес: Москва
Как то писал такую вещь на C#. Собирает всех пользователей в AD через LDAP. Вот используемые классы:
X++:
class Connection
    {
        public System.DirectoryServices.DirectoryEntry root;
        public Connection(String connectString)
        {
            this.root = new System.DirectoryServices.DirectoryEntry(connectString);
        }
    }
 
class MyComparator : System.Collections.IComparer
    {
        int System.Collections.IComparer.Compare(object a, object b)
        {
            User u1 = (User)a;
            User u2 = (User)b;
            int res = u1.city.CompareTo(u2.city);
            if (res == 0)
            {
                res = u1.department.CompareTo(u2.department);
                if (res == 0)
                    res = u1.fio.CompareTo(u2.fio);
            }
            return res;
        }
    }
 
class User
    {
        public String fio;
        public String city;
        public String department;
        public String position;
        public String internalNumber;
        public String externalNumber;
        public String email;
        public String icq;
        public String skype;
        public String birthday;
        public User() 
        {             
            this.fio = "";
            this.city = "";
            this.department = ""; 
            this.position = "";
            this.internalNumber = "";
            this.externalNumber = "";
            this.email = "";
            this.icq = "";
            this.skype = "";
            this.birthday = "";
        }
        public void fill(System.DirectoryServices.DirectoryEntry elem)
        {
            try
            {   this.fio = elem.Properties["displayName"].Value.ToString(); }
            catch
            {   this.fio = "";  }
            try
            {   this.city = elem.Properties["l"].Value.ToString(); }
            catch
            {   this.city = ""; }
            try
            {   this.department = elem.Properties["department"].Value.ToString(); }
            catch
            {   this.department = "";   }
            try
            {   this.position = elem.Properties["title"].Value.ToString();    }
            catch
            {   this.position = "";  }
            try
            {   this.internalNumber = elem.Properties["telephoneNumber"].Value.ToString();    }
            catch
            {   this.internalNumber = "";   }
            try
            {   this.externalNumber = elem.Properties["homePhone"].Value.ToString();    }
            catch
            {   this.externalNumber = "";   }
            try
            {   this.email = elem.Properties["mail"].Value.ToString();  }
            catch
            {   this.email = "";   }
            try
            {   this.icq = elem.Properties["pager"].Value.ToString();   }
            catch
            {   this.icq = "";  }
            try
            {   this.skype = elem.Properties["ipPhone"].Value.ToString();  }
            catch
            {   this.skype = "";    }
        }
    }
 
[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
    }
 
    class AllUsers
    {
        public System.Collections.ArrayList users;
        public AllUsers()
        {
            this.users = new System.Collections.ArrayList();
        }
        public void collectUsers(System.DirectoryServices.DirectoryEntry root)
        {
            foreach (System.DirectoryServices.DirectoryEntry elem in root.Children)
            {
                if (string.Compare(elem.SchemaClassName, "user") != 0)
                    this.collectUsers(elem);
                else
                {                    
                    AdsUserFlags userFlags = (AdsUserFlags)elem.Properties["userAccountControl"].Value;
                    if ((userFlags & AdsUserFlags.AccountDisabled) != AdsUserFlags.AccountDisabled)
                    {
                        User us = new User();
                        us.fill(elem);
                        this.users.Add(us);
                    }
                }
            }
        }
    }
А вот собственно использование:
X++:
class Program
    {
        static void Main(string[] args)
        {       
            Connection con = new Connection(@"LDAP://bla-bla-bla");
            AllUsers users = new AllUsers();
            users.collectUsers(con.root);
            users.users.Sort(new MyComparator());                               
        }
    }
В итоге класс users будет содержать всех пользователей из каталога который Вы укажите в строке подключения через LDAP.

Последний раз редактировалось _scorp_; 22.09.2008 в 13:14.
Старый 23.09.2008, 12:14   #2  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5803 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Цитата:
Сообщение от Eland Посмотреть сообщение
sukhanchik, ты абсолютно прав. Причина именно такая: стандартный импорт не позволяет добавлять пользователей, у которых нет в Member of данных. Наши админы их так создали. А добавить надо. Вот и маюсь.
Не торопитесь с выводами. Была некогда тема касаемо того, что мастер создания пользователей при импорте из AD видел далеко не всех пользователей. Дело было вовсе не в принадлежности к какой-либо группе, а в том, что, по-видимому, на некоторые объекты AD в доменах w2k и w2k3 устанавливаются различные права доступа для компьютеров домена (в предположении, что AOS работает под LocalSystem или NetworkService и к AD получает доступ по учетной записью компьютера). В результате AOS "видит" не всех пользователей, в то время как вы видите их полный список.
Цитата:
Сообщение от Eland Посмотреть сообщение
Через mmc получается получать список всех пользователей в домене, значит права на доступ есть..
Для чистоты эксперимента mmc надо запускать под тем же пользователем, что и AOS
Цитата:
Сообщение от Eland Посмотреть сообщение
скриптик запустить не удалось, отмазывается тем, что таблица не существует, код ошибки: 80040E37. Вылетает на попытке запустить запрос на строке:
X++:
set oRS                 = oCmd.execute
Очень странно - щас проверил на рабочем компе (обычный доменный комп, обычный доменный пользователь) - у меня работает. Попробуйте перед oCmd.execute вставить строку
X++:
wscript.echo strADOQuery
и посмотреть, какой запрос отправляется. Должно получиться что-то вроде
Код:
<LDAP://DC=workdomain,DC=ru>;(&(objectCategory=person)(objectClass=user));name,sAMAccountName,displayName,adspath;subtree
где workdomain.ru - ваш домен по умолчанию.
Цитата:
Сообщение от _scorp_ Посмотреть сообщение
Как то писал такую вещь на C#. Собирает всех пользователей в AD через LDAP.
Прелесть использования ADODB-провайдера доступа к AD в том, что можно не заморачиваться самому с рекурсией, просто указав параметр "subtree" в запросе К слову, если дело в том, что под учетной записью, под которой работает AOS, видны не все пользователи, то тут переписывание кода на C# не поможет - результат будет тот же, если только из кода C# не подключаться к AD явно под каким-то другим пользователем.

Последний раз редактировалось gl00mie; 23.09.2008 в 17:15. Причина: поправил ссылку
Теги
ax4.0

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Организация доступа внешних веб-пользователей к DAX 4.0 alex55 DAX: Администрирование 1 07.06.2009 17:48
Как сделать фильтр по группе пользователей? Zabr DAX: Программирование 12 08.04.2009 11:40
Периодически пропадает доступ к Системе у удаленных пользователей andy_555 DAX: Администрирование 4 04.03.2009 15:02
Закрыть доступ к компаниям без создания домена и группы пользователей Рустем Гизатуллин DAX: Администрирование 3 04.12.2007 09:38
Настройка форм для групп пользователей Роман Кошелев DAX: Функционал 14 05.08.2002 16:32
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра
Комбинированный вид Комбинированный вид

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

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

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