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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 19.09.2008, 19:26   #1  
Eland is offline
Eland
Участник
 
31 / 12 (1) ++
Регистрация: 10.07.2006
Адрес: Москва
Получить пользователей домена в четвёрке
Приветствую.

Нужна помощь.

Задача: получить список всех пользователей домена вне зависимости от того, является ли пользователь членом (member of) чего-нибудь.

Что уже есть, но выдаёт не то, что хотелось бы (может пригодится):

X++:
static void Job2(Args _args)
{
    AxaptaUserManager  userMgr;
    xAxaptaUserDetails axUserDetails;
    Counter            counter;
    ;
    userMgr       = new AxaptaUserManager();
    axUserDetails = userMgr.enumerateDomainUsers("mydomain");

    for(counter = 0; counter < axUserDetails.getUserCount(); counter++)
    {
        info(strfmt("%1", axUserDetails.getUserLogin(counter)));
    }
}
Выдаёт список пользователей, у которых в поле Member of не пусто.

Мне нужны все.

Есть мысль поковыряться в Microsoft.Dynamics.IntegrationFramework.dll, копчиком чувствую есть там кой-чего полезного. Вот только не знаю, где найти хотя бы список методов библиотеки.
Хелп..
Старый 19.09.2008, 21:27   #2  
sukhanchik is offline
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,325 / 3548 (125) ++++++++++
Регистрация: 13.06.2004
Адрес: Москва
Не готов ответить на вопрос - однако просто интересно - а разве можно в AD создать пользователя, который не является членом группы Domain Users ? (т.е. фактически - поле Member of - не пустое)
__________________
Возможно сделать все. Вопрос времени
Старый 19.09.2008, 23:05   #3  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от Eland Посмотреть сообщение
Есть мысль поковыряться в Microsoft.Dynamics.IntegrationFramework.dll, копчиком чувствую есть там кой-чего полезного. Вот только не знаю, где найти хотя бы список методов библиотеки.
Хелп..
В 4ке в списке пользователей есть кнопка Импорт.
Эта кнопка запускает мастер Импорта из Active Directory.
Может там стоит порыться?
__________________
полезное на axForum, github, vk, coub.
Старый 19.09.2008, 23:16   #4  
sukhanchik is offline
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,325 / 3548 (125) ++++++++++
Регистрация: 13.06.2004
Адрес: Москва
Цитата:
Сообщение от mazzy Посмотреть сообщение
В 4ке в списке пользователей есть кнопка Импорт.
Эта кнопка запускает мастер Импорта из Active Directory.
Может там стоит порыться?
Есть ощущение - что этот функционал отработал не так, как этого хотелось изначально автору - вот и возникла такая задача. Было выяснено - какие пользователи не попали - и захотелось сделать свой "правильный" импорт.

Хотя ... пусть автор сам ответит... Чего я буду строить догадки
__________________
Возможно сделать все. Вопрос времени
Старый 20.09.2008, 18:53   #5  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5798 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Цитата:
Сообщение от Eland Посмотреть сообщение
Задача: получить список всех пользователей домена вне зависимости от того, является ли пользователь членом (member of) чего-нибудь.
Есть пример на VBScript получения всех пользователей текущего домена с помощью ADODB-адаптера. Думаю, перевести его на Х++ не должно составить труда.
Код:
' какие атрибуты объектов будут возвращены запросом
const strAttributes     = "name,sAMAccountName,displayName,adspath"
const strAdsiFilter     = "(&(objectCategory=person)(objectClass=user))"

' построение запроса
strNamingContext        = GetObject("LDAP://rootDSE").get("defaultNamingContext")
strADOQuery             = "<LDAP://" & strNamingContext & ">;" & strAdsiFilter & ";" & strAttributes & ";subtree"

' настройка соединения
set oConn               = CreateObject("ADODB.Connection")
oConn.Provider          = "ADsDSOObject"
oConn.open                "ADs Provider"
set oCmd                = CreateObject("ADODB.Command")
oCmd.ActiveConnection   = oConn
oCmd.CommandText        = strADOQuery
oCmd.Properties("Page Size")        = 4000
oCmd.Properties("Timeout")          = 1000
oCmd.Properties("Cache Results")    = True

' выполнение запроса
set oRS                 = oCmd.execute
wscript.echo oRS.RecordCount & " objects found. Processing..."
while not oRS.EOF
    wscript.echo    oRS.Fields("name")              & ", " & _
                    oRS.Fields("sAMAccountName")    & ", " & _
                    oRS.Fields("displayName")       & ", " & _
                    oRS.Fields("adspath")
    oRS.MoveNext
wend
Важные моменты тут: strNamingContext, который будет указывать на текущий домен (типа DC=mydomain,DC=ru), соотв., если нужен другой домен, надо прописать что-то свое; strAttributes, где перечислены возвращаемые атрибуты, - если нужны другие, соотв., надо их указать.
Цитата:
Сообщение от Eland Посмотреть сообщение
Есть мысль поковыряться в Microsoft.Dynamics.IntegrationFramework.dll, копчиком чувствую есть там кой-чего полезного.
Нету там ничего, связанного с указанной задачей. Там живут такие классы, как RosourceMgr, AIFBase с наследниками-адаптерами (FileSystem, MessageQueue, WebService, ServiceGeneration) да классец Util с одним-единственным методом, возвращающим SID пользователя по указанному домену/логину.
Старый 22.09.2008, 12:42   #6  
Eland is offline
Eland
Участник
 
31 / 12 (1) ++
Регистрация: 10.07.2006
Адрес: Москва
sukhanchik, ты абсолютно прав. Причина именно такая: стандартный импорт не позволяет добавлять пользователей, у которых нет в Member of данных. Наши админы их так создали.
А добавить надо. Вот и маюсь.

2 gl00mie: скриптик запустить не удалось, отмазывается тем, что таблица не существует, код ошибки: 80040E37.
Вылетает на попытке запустить запрос на строке:
X++:
set oRS                 = oCmd.execute
Не силён в vbs_е =(

Через mmc получается получать список всех пользователей в домене, значит права на доступ есть..
Старый 22.09.2008, 13:06   #7  
_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   #8  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5798 (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, время: 20:24.