C# Active Directory:在驻留在具有多个根的林中的域中获取RootDSE?

C# Active Directory:在驻留在具有多个根的林中的域中获取RootDSE?,c#,active-directory,C#,Active Directory,我有一个客户端正在使用我编写的windows服务,该服务轮询指定的active directory LDAP服务器,查找该LDAP服务器中指定组中的用户 一旦找到用户,它将填写用户信息(即用户名、电子邮件等),并尝试在LDAP服务器中检索用户的域 当我尝试检索此特定客户端的用户域时,我遇到了DirectoryServicesCOMException:登录失败:未知用户名或错误密码。 尝试引用我实例化的RootDSE DirectoryEntry对象上的属性时引发此异常 此客户端有一个具有两个根的

我有一个客户端正在使用我编写的windows服务,该服务轮询指定的active directory LDAP服务器,查找该LDAP服务器中指定组中的用户

一旦找到用户,它将填写用户信息(即用户名、电子邮件等),并尝试在LDAP服务器中检索用户的域

当我尝试检索此特定客户端的用户域时,我遇到了DirectoryServicesCOMException:登录失败:未知用户名或错误密码。 尝试引用我实例化的RootDSE DirectoryEntry对象上的属性时引发此异常

此客户端有一个具有两个根的林,设置如下

Active Directory域和信任

  • KTV.com

我想这就是问题所在。 这有什么办法吗?有没有办法在不发生此异常的情况下仍然检索特定域对象的netbiosname

以下是一些示例代码,指向前面记录的测试AD服务器设置:

        string domainNameLdap = "dc=tempe,dc=ktregression,dc=com";

        DirectoryEntry RootDSE = new DirectoryEntry (@"LDAP://10.32.16.6/RootDSE");
        DirectoryEntry servers2 = new DirectoryEntry (@"LDAP://cn=Partitions," + RootDSE.Properties["configurationNamingContext"].Value ); //*****THIS IS WHERE THE EXCEPTION IS THROWN********

        //Iterate through the cross references collection in the Partitions container
        DirectorySearcher clsDS = new DirectorySearcher(servers2);
        clsDS.Filter = "(&(objectCategory=crossRef)(ncName=" + domainNameLdap + "))";
        clsDS.SearchScope = SearchScope.Subtree;
        clsDS.PropertiesToLoad.Add("nETBIOSName");

        List<string> bnames = new List<string>();

        foreach (SearchResult result in clsDS.FindAll() )
            bnames.Add(result.Properties["nETBIOSName"][0].ToString());
string domainNameLdap=“dc=tempe,dc=kt,dc=com”;
DirectoryEntry RootDSE=新的DirectoryEntry(@“LDAP://10.32.16.6/RootDSE”);
DirectoryEntry servers2=new DirectoryEntry(@“LDAP://cn=Partitions,”+RootDSE.Properties[“configurationNamingContext”].Value)//*****这就是引发异常的地方********
//遍历分区容器中的交叉引用集合
DirectorySearcher clsDS=新的DirectorySearcher(服务器2);
clsDS.Filter=“(&(objectCategory=crossRef)(ncName=“+domainNameLdap+”)”;
clsDS.SearchScope=SearchScope.Subtree;
clsDS.PropertiesToLoad.Add(“nETBIOSName”);
List bnames=新列表();
foreach(clsDS.FindAll()中的搜索结果)
bnames.Add(result.Properties[“nETBIOSName”][0].ToString());

我相信DirectoryEntry有属性可指定给可以执行LDAP查询或更新的AD帐户,您也可以从父域向下委托该控制权。

Active Directory尝试使用的用户帐户验证“您”不存在,因为您的
DirectoryServicesCOMException
报告了它

DirectoryServicesCOMException:登录失败:用户名未知或密码错误。

看看您的代码示例,您似乎没有使用模拟,因此Active Directory的安全协议考虑了当前经过身份验证的用户。自己创建这个用户,然后如果您碰巧没有在两个域根上定义,其中一个不认识您,这会引发这种异常

另一方面,使用模拟可能会解决这里的问题,因为您说您的Windows服务帐户有权查询同一林下的两个根,那么您必须确保经过身份验证的用户是您的Windows服务

显然,这意味着如果没有模拟,您无法保证经过身份验证的用户是您的Windows服务。为了确保这一点,模拟是必须使用的

现在,关于两个根

  • kt.com
  • 这是两个不同且独立的根。因此,我想您应该使用
    DirectoryEntry
    类的两个实例,每个根对应一个实例

    在实例化根之后,您需要搜索要查找的用户,该用户应该是与模拟用户不同的另一个用户名

    我们现在必须声明是否可以在两个根上定义用户。如果是这样的话,你需要知道什么时候选择一个比另一个更好。这是另一个问题

    注意
    为了简单起见,我认为这两个根的名称都是您提到的完整/完整的

    使用它:

    string userDomain = (GetUserDomain(_dotComRoot, "searchedLogin") 
                            ?? GetUserDomain(_dotRootRoot, "searchedLogin")) 
                        ?? "Unknown user";
    
    您的异常仅在第二次
    DirectoryEntry
    初始化时抛出,这表明您的默认当前用户没有在此根目录上定义帐户

    编辑#1

    请参阅下面我对其他NetBIOS名称相关问题的回答:

    在这里,我为您的问题提供了一个新的、可能更简单的解决方案


    如果您还有任何问题,请告诉我。=)

    您是否确保
    RootDSE.Properties[“configurationNamingContext”].Value
    返回一个实际不为空的值,或者遵守
    LDAP://CN=Partitions,DC=kt的LDAP术语,DC=com
    或类似的问题?你注意到我昨天为你的另一个类似问题提供的代码示例了吗?@Will,是的,我看了一下并尝试了一下。实际上,我用另一个问题回答了这个问题。我想我实际上有两个不同的问题,这就是为什么我也开始这个问题。我在一个林中有两个根的实例的问题。只要确保RootDSE.Properties[“configurationNamingContext”].Value返回一个值且不为null,我就无法进行该检查,因为在我第二次尝试检索它是否有值时,会引发异常。@Micheal:我明白你的意思。请你清楚地解释一下你的目标是什么,忘记代码和其他一切,告诉我你需要完成什么,这样我才能下定决心做点什么。在过去的几周里,我已经做了很多工作,现在仍然在使用Active Directory。我希望我能进一步帮助你。再想一想,既然您有两个不同的根,为什么不简单地创建两个独立的
    DirectoryEntry
    类实例来表示您的每个根,并使用它们呢?
    string userDomain = (GetUserDomain(_dotComRoot, "searchedLogin") 
                            ?? GetUserDomain(_dotRootRoot, "searchedLogin")) 
                        ?? "Unknown user";