Active directory 按sAMAccountName和域的Active Directory LDAP查询

Active directory 按sAMAccountName和域的Active Directory LDAP查询,active-directory,ldap,ldap-query,Active Directory,Ldap,Ldap Query,如何按sAMAccountName和Domain查询LDAP存储?在Active Directory或LDAP术语中,“域”属性的名称是什么 到目前为止,这是我为过滤器准备的。我希望能够在域中添加: (&(objectCategory=Person)(sAMAccountName=BTYNDALL)) 您必须在域中执行搜索: 因此,基本上您应该绑定到一个域,以便在此域内搜索。如果您使用的是.NET,请使用该类。您可以将域作为字符串传递到构造函数中 //如果您的域是domain.com

如何按sAMAccountName和Domain查询LDAP存储?在Active Directory或LDAP术语中,“域”属性的名称是什么

到目前为止,这是我为过滤器准备的。我希望能够在域中添加:

(&(objectCategory=Person)(sAMAccountName=BTYNDALL))

您必须在域中执行搜索:


因此,基本上您应该绑定到一个域,以便在此域内搜索。

如果您使用的是.NET,请使用该类。您可以将域作为字符串传递到构造函数中

//如果您的域是domain.com。。。
字符串username=“user”
string domain=“LDAP://DC=domain,DC=com”;
DirectorySearcher search=新的DirectorySearcher(域);
search.Filter=“(SAMAccountName=“+username+”);
“域”不是LDAP对象的属性。它更像是存储对象的数据库的名称

因此,为了在该数据库中执行搜索,您必须连接到正确的数据库(用LDAP术语:“绑定到域/目录服务器”)

一旦绑定成功,您就可以使用当前形状的查询了


顺便说一句:选择
“ObjectCategory=Person”
而不是
“ObjectClass=user”
是一个很好的决定。在AD中,前者是一种性能优异的“索引属性”,后者没有索引,速度稍慢。

首先,修改搜索过滤器,只查找用户而不查找联系人:

(&(objectCategory=person)(objectClass=user)(sAMAccountName=BTYNDALL))
通过连接到配置分区并枚举分区容器中的所有条目,可以枚举林的所有域。很抱歉,我现在没有任何C#代码,但以下是我过去使用过的一些vbscript代码:

Set objRootDSE = GetObject("LDAP://RootDSE")
AdComm.Properties("Sort on") = "name"
AdComm.CommandText = "<LDAP://cn=Partitions," & _
    objRootDSE.Get("ConfigurationNamingContext") & ">;" & _
        "(&(objectcategory=crossRef)(systemFlags=3));" & _
            "name,nCName,dnsRoot;onelevel"
set AdRs = AdComm.Execute

搜索用户的最佳方法是
(sAMAccountType=805306368)

或对于禁用的用户:

(&(sAMAccountType=805306368)(userAccountControl:1.2.840.113556.1.4.803:=2))

或对于活动用户:

(&(sAMAccountType=805306368)(!(userAccountControl:1.2.840.113556.1.4.803:=2))

我发现LDAP并没有达到它应该达到的程度

还有一个资源——你自己去寻找它们,你会失去宝贵的时间,肯定会犯错误


关于域:在单个查询中不可能这样做,因为域是用户
distinguisedName
DN
)的一部分,在Microsoft AD上,无法通过部分匹配进行搜索。

您可以使用以下查询

登录名(Windows 2000以前版本)等于John的用户

(&(objectCategory=person)(objectClass=user)(!sAMAccountType=805306370)(sAMAccountName=**John**))
所有用户

(&(objectCategory=person)(objectClass=user)(!sAMAccountType=805306370))
启用的用户

(&(objectCategory=person)(objectClass=user)(!sAMAccountType=805306370)(!userAccountControl:1.2.840.113556.1.4.803:=2))
(&(objectCategory=person)(objectClass=user)(!sAMAccountType=805306370)(userAccountControl:1.2.840.113556.1.4.803:=2))
残疾用户

(&(objectCategory=person)(objectClass=user)(!sAMAccountType=805306370)(!userAccountControl:1.2.840.113556.1.4.803:=2))
(&(objectCategory=person)(objectClass=user)(!sAMAccountType=805306370)(userAccountControl:1.2.840.113556.1.4.803:=2))
锁定输出用户

(&(objectCategory=person)(objectClass=user)(!sAMAccountType=805306370)(lockouttime>=1))
我写了一个C#class

  • Dscoduc的算法
  • 来自sorin的查询优化
  • 域到服务器映射的缓存,以及
  • 用于搜索域\ sAMAccountName格式的帐户名的方法
但是,它不了解现场情况

使用系统;
使用System.Collections.Generic;
使用System.DirectoryServices;
使用System.Linq;
使用系统文本;
公共静态类ADUserFinder
{
私有静态字典_dictDomain2LDAPPath;
专用静态字典DictDomain2LDAP路径
{
得到
{
if(null==\u dictDomain2ldapath)
{
字符串配置容器;
使用(DirectoryEntry rootDSE=newdirectoryEntry(“LDAP://rootDSE”))
configContainer=rootDSE.Properties[“ConfigurationNamingContext”].Value.ToString();
使用(DirectoryEntry partitionsContainer=new DirectoryEntry(“LDAP://CN=Partitions,+configContainer))
使用(DirectorySearcher dsPartitions=newdirectorysearcher)(
分区容器,
“(&(objectcategory=crossRef)(systemFlags=3))”,
新字符串[]{“name”、“nCName”、“dnsRoot”},
SearchScope.OneLevel
))
使用(SearchResultCollection srcPartitions=dsPartitions.FindAll())
{
_dictDomain2ldapath=srcPartitions.OfType()
.ToDictionary(
result=>result.Properties[“name”][0].ToString(),//域部分
结果=>$“LDAP://{result.Properties[“dnsRoot”][0]}/{result.Properties[“nCName”][0]}”
);
}
}
返回_dictDomain2LDAPPath;
}
}
私有静态DirectoryEntry FindRotentry(字符串域部分)
{
if(dictDomain2ldapath.ContainsKey(domainPart))
返回新的DirectoryEntry(DictDomain2LDAP路径[domainPart]);
其他的
抛出新ArgumentException($“域\”{domainPart}\“在Active Directory中未知”);
}
公共静态DirectoryEntry FindUser(字符串域,字符串sAMAccountName)
{
使用(DirectoryEntry rootEntryForDomain=FindRootEntry(域))
使用(DirectorySearcher dsUser=newdirectorysearcher)(
根福特域,
$“(&(sAMAccountType=805306368)(sAMAccountName={EscapeLdapSearchFilter(sAMAccountName)}”)”//幻数805306368表示“用户对象”,它比(objectClass=user)更有效
))
返回dsUser.FindOne().GetDirectoryEntry();
}
公共静态DirectoryEntry FindUser(字符串domainBackslashSAMAccountName)
{
string[]domainAndsAMAccountName=domainBackslashSAMAccountName.Split('\\');
if(DomainAndSamaAccountName.Length!=2)
抛出新的ArgumentException($“用户名\“{domainBackslashSAMAccountName}\”的格式不正确DOMAIN\\SAMACCOUNTNAME”,“domainBackslashSAMAccountName”);
字符串domain=domain和samaccountname[0];
字符串sAMAccountName=domainAndsAMAccountName[1];
返回FindUser(域,sAMAccountName);
}
/// 
///逃脱