C# &引用;已从服务器返回一个引用";从C访问AD时出现异常#

C# &引用;已从服务器返回一个引用";从C访问AD时出现异常#,c#,active-directory,C#,Active Directory,在SearchResultCollection results=ds.FindAll()上行我得到一个异常: 已从服务器返回一个引用 为什么会出现这种异常?它是什么意思?可能是您提供的路径不正确。检查一下 我将推荐这篇文章,这篇文章在过去确实帮助了我处理广告。您可能还需要在DirectorySearcher-上启用ReferralChasing 当广告服务器本身没有请求的信息,但知道另一个服务器有该信息时,它会发送一个推荐。它通常出现在信任环境中,其中DC可以引用受信任域中的DC 在您的情况下,

SearchResultCollection results=ds.FindAll()上行我得到一个异常:


已从服务器返回一个引用


为什么会出现这种异常?它是什么意思?

可能是您提供的路径不正确。检查一下


我将推荐这篇文章,这篇文章在过去确实帮助了我处理广告。

您可能还需要在DirectorySearcher-上启用ReferralChasing

当广告服务器本身没有请求的信息,但知道另一个服务器有该信息时,它会发送一个推荐。它通常出现在信任环境中,其中DC可以引用受信任域中的DC

在您的情况下,您只是指定一个域,依赖于自动查找要使用的域控制器。我认为您应该尝试找出用于查询的域控制器,并查看该域控制器是否真的包含请求的信息


如果您提供有关AD设置的更多信息,包括任何信任/子域、全局目录和域控制器的DNS资源记录,将更容易为您提供帮助。

这是问题的答案。原因是我的LDAP字符串错误。

DirectoryEntry oDE = new DirectoryEntry("LDAP://DC=Test1,DC=Test2,DC=gov,DC=lk");

using (DirectorySearcher ds = new DirectorySearcher(oDE))
{
    ds.PropertiesToLoad.Add("name");
    ds.PropertiesToLoad.Add("userPrincipalName");

    ds.Filter = "(&(objectClass=user))";

    SearchResultCollection results = ds.FindAll();

    foreach (SearchResult result in results)
    {
        Console.WriteLine("{0} - {1}",
            result.Properties["name"][0].ToString(),
            result.Properties["userPrincipalName"][0].ToString());
    }
}

从服务器错误返回的引用通常意味着IP地址不由连接字符串上提供的域承载。有关更多详细信息,请参见此链接:

为了说明这个问题,我们定义了两个托管在不同域上的IP地址:

IP地址DC名称注释

172.1.1.10 ozkary.com生产域

172.1.30.50 ozkaryDev.com开发域

如果我们使用以下格式定义LDAP连接字符串:

LDAP://172.1.1.10:389/OU=USERS,DC=OZKARYDEV,DC=COM


这将产生错误,因为IP实际上位于OZKARY DC上,而不是OZKARYDEV DC上。要更正此问题,我们需要使用与域关联的IP地址。

也有相同的问题,并设法解决了它

在我的例子中,我在当前登录域中有一个广告组,成员(用户)来自子域。我运行代码的服务器无法访问子域的域控制器(服务器以前从未需要访问子域)

我挣扎了一段时间,因为我的台式电脑可以访问该域,所以MMC插件(Active Directory用户和计算机)中的一切看起来都正常


希望这对其他人有所帮助。

我知道这听起来可能很傻,但我最近自己也遇到了这个问题,请确保域控制器不是只读的。

在我的例子中,当我使用可信域中的帐户通过SSO访问AD时,我看到了推荐。当我使用本地域中的显式凭据连接时,问题就消失了

i、 e.我更换了

    try
    {
        string adServer = ConfigurationManager.AppSettings["Server"];
        string adDomain = ConfigurationManager.AppSettings["Domain"];
        string adUsername = ConfigurationManager.AppSettings["AdiminUsername"];
        string password = ConfigurationManager.AppSettings["Password"];
        string[] dc = adDomain.Split('.');
        string dcAdDomain = string.Empty;

        foreach (string item in dc)
        {
            if (dc[dc.Length - 1].Equals(item))
                dcAdDomain = dcAdDomain + "DC=" + item;
            else
                dcAdDomain = dcAdDomain + "DC=" + item + ",";
        }

        DirectoryEntry de = new DirectoryEntry("LDAP://" + adServer + "/CN=Users," + dcAdDomain, adUsername, password);

        DirectorySearcher ds = new DirectorySearcher(de);

        ds.SearchScope = SearchScope.Subtree;

        ds.Filter = "(&(objectClass=User)(sAMAccountName=" + username + "))";

        if (ds.FindOne() != null)
            return true;
    }
    catch (Exception ex)
    {
        ExLog(ex);
    }
    return false;


问题消失了。

你知道我为什么会得到这个例外吗?你知道为什么会返回转诊吗?我认为当不指定DC时,它将自动绑定到具有该信息的查询。@Brian-即使我使用了您的建议,我仍然会收到相同的异常。我不知道为什么会返回引用。当前链接:引用通过分别返回每个子OU将查询拆分为单独的较小部分,并且可以在服务器之间共享负载。并非所有客户端或介入的负载平衡器等都能应付。Ldap请求可以禁用引用,以便在一个事务中返回整个查询结果。客户端应用程序需要某种方式来指定此项。您的意思是我需要在创建DirectoryEntry时使用可以访问广告的帐户凭据吗?有人建议我需要使用授权访问广告的帐户。是吗?我正在尝试访问外部方的广告,但我不知道他们的服务器配置的详细信息。如果您建议需要哪些特定的详细信息,那么我可以请求他们我需要这些详细信息来访问您的广告并查询特定用户的存在。我们已经授予了访问他们的广告的完全权利,我不能仅仅因为我缺乏广告方面的技术知识。-1因为没有迹象表明是什么解决了这个问题。LDAP字符串可能不够直观。在我们的例子中,我们有一个类似LDAP://DC=primary、DC=secondary、DC=com的方法,它在大多数情况下都能工作。但是,当尝试以完全信任的方式连接到其子域时,字符串必须更改为:LDAP://MyDomainController1.primary.secondary.com在ds上的“username”。过滤行实际上是“adUsername”?DirectorySearcher ds=new DirectorySearcher(“域名”)—在某些情况下,这就足够了。例如:ds.FindOne();当您看到错误时,是否仅在搜索子域用户时才出现?仅当我尝试获取父域中包含子域用户的组的成员时才出现此错误。
DirectoryEntry de = new DirectoryEntry("blah.com");
DirectoryEntry de = new DirectoryEntry("blah.com", "someguy@blah.com", "supersecret");