无法使LDAP连接正常工作-总是“;未知错误”;
本文关键字:总是 工作 错误 未知 LDAP 连接 常工作 | 更新日期: 2023-09-27 18:00:47
我正在研究构建Active Directory搜索工具所需的内容,该工具最终将用于C#ASP.NET web应用程序。
我对AD知之甚少(除了必要的之外,我不想知道更多),所以我要求我们的技术人员在服务器上设置一个虚拟实例。他们已经这样做了,给它提供了域伪。local
我现在需要计算我的LDAP连接字符串。我完全被卡住了。我使用的用户帐户是域管理员的成员。经过大量的网络搜索,我尝试了各种方法来计算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("------------");
}
}
上周我试图弄清楚如何正确格式化LDAP连接字符串,在serverfault:上发现了这个条目
如何计算LDAP连接字符串?
我注意到你在每个OU或DC条目之间都有一个"/"——我的条目中没有包含这些条目,在上面的例子中也没有包含它们。
我(显然)远非专家,但我只是觉得我会把它扔出去。