2009-02-03 58 views
19

¿Cómo se hace una consulta de un almacén LDAP por sAMAccountName y Domain? ¿Cuál es la propiedad de "dominio" nombrada en términos de Active Directory o LDAP?Consulta LDAP de Active Directory por sAMAccountName y dominio

Esto es lo que tengo para el filtro hasta el momento. Me gustaría ser capaz de añadir en el dominio:

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

Respuesta

18

En primer lugar, modificar el filtro de búsqueda sólo para buscar usuarios y no Contactos:

(&(objectCategory=person)(objectClass=user)(sAMAccountName=BTYNDALL)) 

Puede enumerar todos los dominios de un bosque mediante la conexión a la partición de configuración y enumerar todas las entradas en las particiones envase. Lo siento, no tengo ningún código C# en este momento, pero aquí hay un código de VBScript que he utilizado en el pasado:

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 

Desde que se puede recuperar el nombre y dnsRoot de cada partición:

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

Las afirmaciones 'With' y 'While' parecen espantosas. Creo que escribí esto hace mucho tiempo y no he necesitado actualizarlo ya que solo funcionó ... – Dscoduc

+0

+1 y respuesta. Este es el tipo de pensamiento que estaba buscando. Gracias. – BuddyJoe

+0

Gracias, me alegro de que ayudó ... – Dscoduc

3

Si está utilizando .NET, use la clase DirectorySearcher. Puede pasar su dominio como una cadena al constructor.

// 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 + ")"; 
+0

lo que permite decir mi nombre de usuario es COMPANY \ BTYNDALL ¿cómo puedo simplemente asumen que la cadena LDAP va a ser LDAP: // DC = empresa DC = com porque en mi caso esto sería incorrecto, el último DC es DC = neto. ¿Hay alguna forma de buscar "dominios cortos" en AD y obtener el LDAP más largo uno? – BuddyJoe

+0

o solo tengo que crear una tabla de búsqueda en mi aplicación? – BuddyJoe

+0

Ver mi respuesta a continuación ... – Dscoduc

5

"Dominio" no es propiedad de un objeto LDAP. Es más como el nombre de la base de datos el objeto se almacena en

Así que hay que conectarse a la base de datos correcta. (En términos de LDAP: "se unen al dominio/servidor de directorio") con el fin de realizar una búsqueda en esa base de datos.

Una vez que se haya enlazado correctamente, su consulta en su forma actual es todo lo que necesita.

BTW: Elegir "ObjectCategory=Person" sobre "ObjectClass=user" fue una buena decisión. En AD, el primero es una "propiedad indexada" con excelente desempeño, este último no está indexado y es un poco más lento.

+2

Para consultar a los usuarios en AD Me gusta usar sAMAccountType = 805306368 ya que esto estrecha su búsqueda específicamente y es rápido – benPearce

7

La mejor manera de buscar usuarios es (sAMAccountType=805306368).

o para usuarios con discapacidad:

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

O para usuarios activos:

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

me parece LDAP como no ser tan ligero en el que se supone que es.

También recurso para common LDAP queries - tratando de encontrarlos usted mismo y tendrá un tiempo precioso y definitivamente cometer errores.

En cuanto a los dominios: no es posible en una sola consulta porque el dominio es parte del usuario distinguisedName (DN) que, en Microsoft AD, no se puede buscar haciendo una coincidencia parcial.

12

Puede utilizar consultas siguientes

usuarios cuyos Nombre de conexión (anterior a Windows 2000) es igual a John

(&(objectCategory=person)(objectClass=user)(!sAMAccountType=805306370)(sAMAccountName=**John**)) 

Todos los usuarios

(&(objectCategory=person)(objectClass=user)(!sAMAccountType=805306370)) 

usuarios habilitados

(&(objectCategory=person)(objectClass=user)(!sAMAccountType=805306370)(!userAccountControl:1.2.840.113556.1.4.803:=2)) 

usuarios discapacitados

(&(objectCategory=person)(objectClass=user)(!sAMAccountType=805306370)(userAccountControl:1.2.840.113556.1.4.803:=2)) 

LockedOut Usuarios

(&(objectCategory=person)(objectClass=user)(!sAMAccountType=805306370)(lockouttime>=1)) 
+0

Awesome reference +1 – BuddyJoe

Cuestiones relacionadas