使用特定域控制器从 Dynamics AX 读取 Active Directory 中的用户信息

Reading user's information in Active Directory from Dynamics AX using specific domain controller

我们有几个域控制器可以用来读取AD用户信息。

当域名 "mydomain.co.uk" 被用作 AD 域时,将选择这几个域控制器中的任何一个来达到目的。

但是,如果 AD 中的更改尚未传播到所有域控制器,则不会返回任何结果。

为了解决这个问题,我决定始终指向一个特定的域控制器,即 "dc1.mydomain.co.uk"

在 C# 中,使用类似这样的东西很容易完成:

new PrincipalContext(ContextType.Domain, 
                    "dc1.mydomain.co.uk:389", 
                    "OU=Groups,DC=mydomain,DC=co,DC=uk", 
                    domainUsername, 
                    domainPassword)

但是在 X++ 中只有 "mydomain.co.uk" 有效:

static void validateDomain(Args _args)
{
    xAxaptaUserManager          Axmanage;
    NetworkDomain               networkDomain = "";

    // Works
    networkDomain = "mydomain.co.uk";

    // Does not work
    networkDomain = "dc1";
    networkDomain = "dc1.mydomain.co.uk";
    networkDomain = "dc1.mydomain.co.uk:389";
    networkDomain = "LDAP://dc1.mydomain.co.uk:389/";

    Axmanage = new xAxaptaUserManager();

    info(strFmt("%1", Axmanage.validateDomain(networkDomain)));
}

如果可能,如何在 MS Dynamics AX 2012 R3 中使用 xAxaptaUserManager 实现相同的功能?

我们不在你的网络上,所以我们不能真正测试所有的东西,但是如果 xAxaptaUserManager,内核 class 不工作,但你可以它在 C#...只需创建一个您从 AX 调用的程序集 "helper"。

查看以下链接:

https://docs.microsoft.com/en-us/dynamicsax-2012/developer/how-to-add-a-reference-to-a-net-assembly

https://docs.microsoft.com/en-us/dynamicsax-2012/developer/net-interop-from-x

我早该说了,您可能更喜欢这个作为解决方案。

AX中,直接调用.NET代码即可。我认为如果它不能立即工作,您可能必须将它放在 classtableserver 方法中。

System.DirectoryServices.AccountManagement.PrincipalContext     principalContext =
        new System.DirectoryServices.AccountManagement.PrincipalContext(System.DirectoryServices.AccountManagement.ContextType::Domain,
                                                                        "dc1.mydomain.co.uk:389",
                                                                        "OU=Groups,DC=mydomain,DC=co,DC=uk",
                                                                        "username",
                                                                        "password");