使用System.DirectoryServices.AccountManagement查询LDAP服务器

时间:2013-06-24 15:46:13

标签: c# .net ldap lotus-domino

我正在尝试在LDAP上运行查询,但是我得到异常UnauthorizedAccessException @ new PrincipalSearcher(qbeUser)。 (见下面的代码)

我不明白为什么应用程序无法像我运行时那样运行此查询 ldapsearch命令行工具工作正常。

        using(PrincipalContext ctx = new PrincipalContext(ContextType.Machine, "machineName"))
        {
            using(UserPrincipal qbeUser = new UserPrincipal(ctx))
            {
                using (PrincipalSearcher srch = new PrincipalSearcher(qbeUser))
                {
                    foreach (var found in srch.FindAll())
                    {
                        var user = (UserPrincipal)found;
                        Console.WriteLine(user.GivenName + " " + user.Surname +  " " + user.EmailAddress);
                    }
                }
            }
        }

3 个答案:

答案 0 :(得分:1)

这是关于如何在Domino服务器端收集LDAP的调试数据的IBM technote。我建议从一开始就使用LDAPDEBUG = 7设置,并将服务器上的控制台日志输出与ldapsearch查询和程序查询进行比较。

您可能需要注意的是绑定操作期间的身份验证。您没有提到是否在ldapsearch命令行中传递了任何身份验证信息(-D和-w参数),并且您没有说过任何关于SSO的内容 - 我甚至不确定Domino LDAP是否参与任何SSO 。记录在服务器上的数据应该有助于阐明您的查询用于绑定的身份(如果有)。 Domino目录上的正常设置可以防止匿名查询,我认为它还限制了没有编辑者权限(或更高版本)的用户查询其他用户帐户时可用的属性。

如果您没有服务器的管理权限,或者您可以在其上复制问题的测试服务器,则必须与实际管理员协调。您不希望将LDAPDEBUG设置保持打开的时间超过必要的时间。

答案 1 :(得分:0)

请参阅以下代码:

        using(PrincipalContext ctx = new PrincipalContext(ContextType.Domain, "DOMAINNAME"))
        {
            using(UserPrincipal qbeUser = new UserPrincipal(ctx))
            {
                using (PrincipalSearcher srch = new PrincipalSearcher(qbeUser))
                {
                    foreach (var found in srch.FindAll())
                    {
                        var user = (UserPrincipal)found;
                        Console.WriteLine(user.GivenName + " " + user.Surname +  " " + user.EmailAddress);
                    }
                }
            }
        }

如果我这样做它可以正常工作,但我无法指定服务器名称。还不确定它是否返回与命令行相同的结果。

我尝试使用ValidateCredentials检查验证是否使用我的凭证(使用ContextType.Machine),但不是返回true或false,而是抛出UnauthorizedAccessException。

答案 2 :(得分:0)

我尝试在.NET中使用不同的方法访问多米诺骨牌服务器,不幸的是,这个方法也没有用。 (它抛出DirectoryServicesCOMException(发生协议错误)。

        // create your "base" - the ou "formeremployees"
        DirectoryEntry formerEmployeeOU = new DirectoryEntry("LDAP://HOSTNAME");

        // create a searcher to find objects inside this container
        DirectorySearcher feSearcher = new DirectorySearcher(formerEmployeeOU);

        // define a standard ldap filter for what you search for - here "users"    
        feSearcher.Filter = "objectClass=*";

        // define the properties you want to have returned by the searcher
        feSearcher.PropertiesToLoad.Add("givenname");
        feSearcher.PropertiesToLoad.Add("sn");
        feSearcher.PropertiesToLoad.Add("mail");
        feSearcher.PropertiesToLoad.Add("memberOf");

        // search and iterate over results
        foreach (SearchResult sr in feSearcher.FindAll())
        {
            //do something
        }

        return;

对我来说,快速解决方案是运行ldapsearch命令行工具。

        // Start the child process.
        Process p = new Process();
        // Redirect the output stream of the child process.
        p.StartInfo.UseShellExecute = false;
        p.StartInfo.RedirectStandardOutput = true;
        p.StartInfo.FileName = "ldapsearch";
        p.StartInfo.Arguments = "-L -h hostname \"objectClass=*\" givenname sn mail";
        p.Start();
        // Do not wait for the child process to exit before
        // reading to the end of its redirected stream.
        // p.WaitForExit();
        // Read the output stream first and then wait.
        string output = p.StandardOutput.ReadToEnd();
        p.WaitForExit();

        System.IO.File.WriteAllText(@"output.txt", output);
        return;