我正在尝试在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);
}
}
}
}
答案 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;