无法使LDAP连接正常工作 - 始终"未知错误"

时间:2015-07-01 21:56:32

标签: c# asp.net active-directory ldap connection-string

我正在研究构建Active Directory搜索工具所需的内容,该工具最终将用于C#ASP.NET Web应用程序。

我对AD知之甚少(并且特别想要了解更多信息)所以我已经要求我们的技术人员在服务器上设置虚拟实例。他们已经完成了域名 dummy.local

我现在需要弄清楚我的LDAP连接字符串。在这里,我完全陷入困境。我使用的是Domain Admins成员的用户帐户。在网络上狩猎之后,我尝试了各种各样的东西来计算出LDAP连接字符串的各种组件。例如,如果我在cmd.exe中为服务器上的该域管理员用户运行以下内容...

dsquery user -samid "username" | dsget user -memberof -expand

...这给了我以下信息:

"CN=Domain Admins,CN=Users,DC=dummy,DC=local"
"CN=Remote Desktop Users,CN=Builtin,DC=dummy,DC=local"
"CN=Users,CN=Builtin,DC=dummy,DC=local"
"CN=Administrators,CN=Builtin,DC=dummy,DC=local"
"CN=Domain Users,CN=Users,DC=dummy,DC=local"
"CN=Denied RODC Password Replication Group,CN=Users,DC=dummy,DC=local"

我还在C#控制台应用程序中运行以下内容......

using (var context = new PrincipalContext(ContextType.Domain))
using (var comp = ComputerPrincipal.FindByIdentity(context, Environment.MachineName))
{
    Console.WriteLine(String.Join(",", comp.DistinguishedName.Split(',').SkipWhile(s => !s.StartsWith("OU=")).ToArray()));
}

......这给了我以下内容:

OU=Domain Controllers,DC=dummy,DC=local

我认为因此我拥有构建LDAP连接字符串所需的所有属性。我最终得到了这个:

LDAP://COMSECWEBDEV.dummy.local/ou=Domain Controllers,/cn=Domain Admins,/cn=Users,/dc=dummy,/dc=local

我已尝试使用此连接字符串,我知道域管理员的用户名和密码是正确的,但我尝试的所有内容总是给我同样的错误:

System.Runtime.InteropServices.COMException (0x80005000): Unknown error (0x80005000)
  at System.DirectoryServices.DirectoryEntry.Bind(Boolean throwIfFail)
  at System.DirectoryServices.DirectoryEntry.Bind()
  at System.DirectoryServices.DirectoryEntry.get_AdsObject()
  at System.DirectoryServices.DirectorySearcher.FindAll(Boolean findMoreThanOne)
  at System.DirectoryServices.DirectorySearcher.FindOne()

由于这个错误没有给我任何细节,我不知道我做错了什么。我确定我没有正确连接字符串,但我不知道如何计算出正确的字符串。

为了完整起见,这是我正在测试的控制台代码:

static void Main(string[] args)
{
    var connString = ConfigurationSettings.AppSettings["lc"];
    var username = ConfigurationSettings.AppSettings["lu"];
    var password = ConfigurationSettings.AppSettings["lpw"];

    using (DirectoryEntry de = new DirectoryEntry(connString, username, password))
    {
        DirectorySearcher search = new DirectorySearcher(de);

        search.PageSize = 1001;// To Pull up more than 100 records.

        DirectorySearcher directorySearcher = new DirectorySearcher(de);
        directorySearcher.Filter = string.Format("(&(objectClass=user)(objectCategory=user) (sAMAccountName={0}))", username);

        directorySearcher.PropertiesToLoad.Add("msRTCSIP-PrimaryUserAddress");

        try
        {
            var result = directorySearcher.FindOne();

            var found = false;
            if (result != null)
            {
                if (result.Properties["msRTCSIP-PrimaryUserAddress"] != null)
                {
                    found = true;
                    Console.WriteLine("Found: " + result.Properties["msRTCSIP-PrimaryUserAddress"][0]);
                }
            }

            if (!found)
            {
                Console.WriteLine("Sad face");
            }
        }
        catch (Exception x)
        {
            Console.WriteLine(x.Message);
        }

        Console.WriteLine("------------");
    }
}

1 个答案:

答案 0 :(得分:1)

上周我试图弄清楚如何正确格式化LDAP连接字符串,并在serverfault上找到了这个条目:

How can I figure out my LDAP connection string?

我注意到你在每个OU或DC条目之间都有一个“/” - 我没有包括我的那些,我也没有在上面的例子中看到它们。

我远非专家(显然),但我只想把它扔到那里。