2009-02-03 13 views
19

Wie führen Sie eine Abfrage eines LDAP-Speichers durch sAMAccountName und Domain durch? Was ist die Eigenschaft "Domäne", die in Active Directory oder LDAP-Begriffen benannt ist?Active Directory-LDAP-Abfrage nach sAMAccountName und Domain

Das ist, was ich für den Filter bisher habe. Ich möchte in der Domäne hinzufügen können:

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

Antwort

18

Zuerst Ihre Suchfilter ändern nur für Benutzer suchen und nicht die Kontakte:

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

Sie können auf die Konfigurationspartition und Aufzählen alle Einträge in den Partitionen alle Domänen eines Waldes aufzählen, indem Container. Leider habe ich keinen C# -Code jetzt aber hier einige Vbscript Code, den ich in der Vergangenheit verwendet habe:

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 

Von dass Sie den Namen und dnsRoot jede Partition abrufen können:

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

Die 'With' und 'While' Statements sehen scheußlich aus. Ich denke, dass ich das vor langer Zeit geschrieben habe und es nicht aktualisieren musste, da es gerade funktionierte ... – Dscoduc

+0

+1 und antworte. Das ist die Art von Denken, nach der ich gesucht habe. Vielen Dank. – BuddyJoe

+0

Danke, ich bin froh, dass es geholfen hat ... – Dscoduc

3

Wenn Sie .NET verwenden, verwenden Sie die Klasse DirectorySearcher. Sie können Ihre Domain als String in den Konstruktor übergeben.

// 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

kann also sagen, dass meine Login COMPANY \ BTYNDALL ist, wie kann ich nur davon ausgehen, dass der LDAP-String LDAP sein wird: // DC = company, DC = com, denn in meinem Fall wäre das falsch, der letzte DC ist DC = net. Gibt es eine Möglichkeit, "kurze Domains" in AD nachzuschlagen und das längere LDAP zu bekommen? – BuddyJoe

+0

oder muss ich nur eine Nachschlagetabelle in meiner App erstellen? – BuddyJoe

+0

Siehe meine Antwort unten ... – Dscoduc

5

"Domäne" ist keine Eigenschaft eines LDAP-Objekts. Es ist mehr wie der Name der Datenbank das Objekt gespeichert ist

So haben Sie an die richtige Datenbank zu verbinden. (In LDAP-Bedingungen: „bindet an die Domäne/Verzeichnisserver“), um Führen Sie eine Suche in dieser Datenbank durch.

Sobald Sie erfolgreich gebunden haben, ist Ihre Abfrage in der aktuellen Form alles was Sie brauchen.

BTW: Wählen "ObjectCategory=Person" über "ObjectClass=user" war eine gute Entscheidung. In AD ist Ersteres eine "indizierte Eigenschaft" mit ausgezeichneter Leistung, letztere ist nicht indiziert und ein bisschen langsamer.

+2

Für die Abfrage von Benutzern in AD verwende ich gerne sAMAccountType = 805306368, da dies Ihre Suche spezifisch einschränkt und schnell ist – benPearce

7

Die beste Weise der Suche nach Benutzer ist (sAMAccountType=805306368).

Oder für behinderte Nutzer:

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

Oder für aktive Benutzer:

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

Ich finde LDAP als nicht so leicht ist es eigentlich sein sollte.

Auch Ressource für common LDAP queries - versuchen, sie selbst zu finden, und Sie werden wertvolle Zeit und auf jeden Fall machen Sie Fehler.

In Bezug auf Domänen: es ist nicht in einer einzigen Abfrage möglich, da die Domäne Teil des Benutzers distinguisedName (DN) ist, die auf Microsoft AD nicht durch partielles Matching durchsuchbar ist.

12

können Sie folgenden Abfragen verwenden

Für Benutzer, deren Anmeldename (Prä-Windows 2000) gleich John

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

Alle Benutzer

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

aktivierte Benutzer

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

behinderte Nutzer

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

lockedout Benutzer

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

Ehrfürchtige Referenz +1 – BuddyJoe