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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 01.07.2009, 14:07   #1  
Poleax is offline
Poleax
Модератор
Аватар для Poleax
MCP
MCBMSS
Злыдни
 
1,353 / 595 (22) +++++++
Регистрация: 17.02.2005
Адрес: msk
Записей в блоге: 34
? Как в 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  
online
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,322 / 3547 (125) ++++++++++
Регистрация: 13.06.2004
Адрес: Москва
Есть пример (вторая ссылка в гугле "список пользователей 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  
_scorp_ is offline
_scorp_
Участник
Аватар для _scorp_
MCBMSS
 
488 / 369 (13) ++++++
Регистрация: 25.07.2007
Адрес: Москва
Цитата:
Сообщение от Poleax Посмотреть сообщение
Кто нибудь пробовал переносить класс AxaptaUserManager с аксапты 4.0 в 3.0?
Если Вас не смущает использование .NET в Ax 3.0 (подробности тут), то все очень просто. Вот пример, который выведет Вам всех пользователей в AD, причем можно по параметром отсекать тех, которые Вам не нужны(отключенных или например из определенной папки).
Код:
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  
_scorp_ is offline
_scorp_
Участник
Аватар для _scorp_
MCBMSS
 
488 / 369 (13) ++++++
Регистрация: 25.07.2007
Адрес: Москва
Цитата:
Сообщение от Poleax Посмотреть сообщение
Список полей: логин, полное имя, e-mail
Вот список всех атрибутов пользователя в 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  
Poleax is offline
Poleax
Модератор
Аватар для Poleax
MCP
MCBMSS
Злыдни
 
1,353 / 595 (22) +++++++
Регистрация: 17.02.2005
Адрес: msk
Записей в блоге: 34
Post
Я сделал немного по другому, с использованием SQL Server

1) Создал связанный сервер
PHP код:
EXEC sp_addlinkedserver 'ADSI''Active Directory Services 2.5''ADSDSOObject''adsdatasource' 
Настроил сопоставление пользователей локального и доменного на вкладке Безопасность в свойствах 'ADSI'.
Локальный - это sql пользователь под которым Аксапта 3.0 подключается БД.
Удаленный - это доменный пользователь, кто может читать AD.
Нажмите на изображение для увеличения
Название: 01.07.png
Просмотров: 502
Размер:	39.2 Кб
ID:	4828 Нажмите на изображение для увеличения
Название: 02.07.png
Просмотров: 523
Размер:	43.9 Кб
ID:	4829

2) Создал хранимую процедуру в БД. Параметр DOMAIN - это полное имя домена в нашей сети.
PHP код:
CREATE PROCEDURE dbo.sp_GetListUserAD
AS
BEGIN
    SET NOCOUNT ON
;

    
SELECT samaccountnamegivennamesndisplayNamemail
    FROM openquery
(ADSI
    
'SELECT samaccountname, givenname,sn, displayName, mail
      FROM ''LDAP://DOMAIN'' WHERE objectCategory=''person'' AND objectClass=''user'' '
)
    
WHERE samaccountname IS NOT NULL AND mail IS NOT NULL 
    ORDER BY samaccountname
;

END
GO 
3) В Аксапте сделал пример Job:
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)));
    }
}
Источники: Проблема с SQL запросом
http://www.sql.ru/forum/actualthread...y+adsi#7194114

Последний раз редактировалось Poleax; 01.07.2009 в 17:58.
За это сообщение автора поблагодарили: sukhanchik (3).
Старый 01.07.2009, 18:52   #6  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
Можно воспользоваться 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  
Poleax is offline
Poleax
Модератор
Аватар для Poleax
MCP
MCBMSS
Злыдни
 
1,353 / 595 (22) +++++++
Регистрация: 17.02.2005
Адрес: msk
Записей в блоге: 34
Сколько оказывается способов решения.
Всем спасибо.
Старый 02.07.2009, 19:58   #8  
Poleax is offline
Poleax
Модератор
Аватар для Poleax
MCP
MCBMSS
Злыдни
 
1,353 / 595 (22) +++++++
Регистрация: 17.02.2005
Адрес: msk
Записей в блоге: 34
Забавно, но профайлер кода показывает, что вариант с вызовом процедуры на SQL Server отрабатывает в среднем в 5 раз быстрее чем аналогичный запрос с использованием ADO
Берутся только поля
X++:
"userAccountControl,sAMAccountName,displayName,Mail"
Оба метода переписывают одну и туже таблицу.
Теги
active directory, ado, ax3.0, sql, доменный пользователь, хранимые процедуры

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
gatesasbait: Dynamics AX 2009 SSRS and SSAS Integration Tips Blog bot DAX Blogs 3 09.07.2009 13:07
Dynamics AX: Managing Your Supply Chain Using Microsoft Dynamics AX 2009 - Book Review Blog bot DAX Blogs 0 31.03.2009 23:06
axStart: Microsoft Dynamics AX 2009 Hot Topics Web Seminar Series Blog bot DAX Blogs 0 06.08.2008 12:05
Arijit Basu: AX 2009 - Quick Overview Blog bot DAX Blogs 4 19.05.2008 14:47
Arijit Basu: Reporting & BI in AX: An Overview [Level 100] Blog bot DAX Blogs 0 07.01.2008 16:01

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

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

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