Запрос LDAP для Active Directory по имени и домену SAMAccountName
Как вы делаете запрос в хранилище LDAP с помощью sAMAccountName и Domain? Что такое свойство домена, указанное в терминах Active Directory или LDAP?
Это то, что у меня есть для фильтра. Я хотел бы иметь возможность добавить в домен:
(&(objectCategory=Person)(sAMAccountName=BTYNDALL))
Ответы
Ответ 1
Сначала измените свой фильтр поиска, чтобы искать только пользователей, а не контактов:
(&(objectCategory=person)(objectClass=user)(sAMAccountName=BTYNDALL))
Вы можете перечислить все домены леса, подключившись к разделу конфигурации и перечислив все записи в контейнере разделов. Извините, у меня сейчас нет кода на С#, но вот код 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
Из этого вы можете получить имя и dnsRoot каждого раздела:
AdRs.MoveFirst
With AdRs
While Not .EOF
dnsRoot = .Fields("dnsRoot")
Set objOption = Document.createElement("OPTION")
objOption.Text = dnsRoot(0)
objOption.Value = "LDAP://" & dnsRoot(0) & "/" & .Fields("nCName").Value
Domain.Add(objOption)
.MoveNext
Wend
End With
Ответ 2
Вы можете использовать следующие запросы
Пользователи, чье имя входа (Pre-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))
Пользователи LockedOut
(&(objectCategory=person)(objectClass=user)(!sAMAccountType=805306370)(lockouttime>=1))
Ответ 3
лучший способ поиска пользователей (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 не настолько легким, как предполагалось.
Также ресурс для общих запросов LDAP - пытается найти их самостоятельно, и вы потратите драгоценное время и определенно сделаете ошибки.
Что касается доменов: это невозможно в одном запросе, потому что домен является частью пользователя distinguisedName
(DN
), который в Microsoft AD не может быть найден путем частичного сопоставления.
Ответ 4
"Домен" не является свойством объекта LDAP. Это больше похоже на имя базы данных, в которой хранится объект.
Таким образом, для выполнения поиска в этой базе данных вам необходимо подключиться к нужной базе данных (в терминах LDAP: "привязываться к серверу домена/каталога" ).
Как только вы успешно свяжетесь, ваш запрос в этой текущей форме все, что вам нужно.
BTW: выбор "ObjectCategory=Person"
over "ObjectClass=user"
был хорошим решением. В AD первое является "индексированным свойством" с отличной производительностью, последнее не индексируется и немного медленнее.
Ответ 5
Вы должны выполнить поиск в домене:
http://msdn.microsoft.com/en-us/library/ms677934(VS.85).aspx
Таким образом, в основном вы должны привязываться к домену для поиска внутри этого домена.
Ответ 6
Если вы используете .NET, используйте класс DirectorySearcher. Вы можете передать свой домен в виде строки в конструктор.
// if you domain is domain.com...
string username = "user"
string domain = "LDAP://DC=domain,DC=com";
DirectorySearcher search = new DirectorySearcher(domain);
search.Filter = "(SAMAccountName=" + username + ")";