27/09/2021
At navigere og søge i store katalogtjenester som Active Directory kan være en kompleks opgave uden de rette værktøjer. Her kommer LDAP-filtre ind i billedet. Et LDAP-filter er en streng, der definerer specifikke kriterier for at finde objekter i et LDAP-katalog. Uanset om du er systemadministrator, udvikler eller blot nysgerrig, er en solid forståelse af LDAP-filtres syntaks afgørende for effektivt at kunne forespørge og administrere data. Denne artikel vil guide dig gennem alt fra de grundlæggende principper til avancerede teknikker, så du kan konstruere præcise og effektive søgninger.

Grundlæggende Syntaks for LDAP-filtre
Kernen i et LDAP-filter er dets syntaks. Hvert filter består af et eller flere kriterier, som er omsluttet af parenteser. Den grundlæggende struktur for et simpelt søgekriterium er (attribut=værdi). Her er 'attribut' navnet på det felt, du vil søge i (f.eks. cn for Common Name), og 'værdi' er den data, du leder efter.
For eksempel, hvis du vil finde en bruger med det almindelige navn 'Jens Jensen', vil dit filter se således ud:
(cn=Jens Jensen)
Det er vigtigt at bemærke, at hele filterudtrykket altid skal være omsluttet af et ydre sæt parenteser. Hvis du kombinerer flere kriterier, bruges en speciel notation kendt som 'polsk notation' eller præfiksnotation, hvor den logiske operator placeres før operanderne (kriterierne).
Logiske Operatorer: Kombinering af Kriterier
Når du har brug for at specificere mere end ét kriterium, kan du kombinere dem ved hjælp af logiske operatorer. De tre primære operatorer er AND, OR og NOT.
AND (&)
AND-operatoren bruges, når alle specificerede betingelser skal være opfyldt. Syntaksen er (&(kriterium1)(kriterium2)...). Forestil dig, at du vil finde alle brugere i 'Salg'-afdelingen, som også har efternavnet 'Hansen'. Filteret ville være:
(&(department=Salg)(sn=Hansen))
OR (|)
OR-operatoren bruges, når mindst én af de specificerede betingelser skal være opfyldt. Syntaksen er (|(kriterium1)(kriterium2)...). Hvis du for eksempel vil finde alle objekter, der enten er en bruger eller en computer, kan du bruge:
(|(objectClass=user)(objectClass=computer))
NOT (!)
NOT-operatoren bruges til at negere et kriterium, dvs. at finde objekter, hvor betingelsen ikke er opfyldt. Syntaksen er (!(kriterium)). Hvis du vil finde alle brugere, undtagen en bruger ved navn 'admin', vil filteret se således ud:
(&(objectClass=user)(!(sAMAccountName=admin)))
Disse operatorer kan også indlejres for at skabe komplekse forespørgsler. For eksempel, for at finde alle brugere i 'IT'- eller 'Support'-afdelingen, som ikke har en deaktiveret konto:
(&(|(department=IT)(department=Support))(!(userAccountControl:1.2.840.113556.1.4.803:=2)))
Sammenligningsoperatorer og Søgekriterier
Ud over simpel lighed (=) understøtter LDAP en række andre sammenligningsoperatorer, der giver mere fleksibilitet i dine søgninger.

Tabel over Sammenligningsoperatorer
| Operator | Betydning | Eksempel |
|---|---|---|
= | Lig med | (sn=Jensen) |
>= | Større end eller lig med | (logonCount>=100) |
<= | Mindre end eller lig med | (pwdLastSet<=133000000000000000) |
~= | Omtrent lig med (ofte behandlet som = i AD) | (displayName~=Hansen) |
=* | Tilstedeværelse (attributten eksisterer) | (mail=*) |
!(=*) | Fravær (attributten eksisterer ikke) | (!(proxyAddresses=*)) |
Brug af Wildcards og Specialtegn
Wildcards er ekstremt nyttige til at søge efter delvise strenge. Stjernen (*) er det primære wildcard-tegn i LDAP-filtre.
- Slutter med: For at finde alle med et efternavn, der ender på 'sen', brug
(sn=*sen). - Starter med: For at finde alle med et fornavn, der starter med 'Kar', brug
(givenName=Kar*). - Indeholder: For at finde alle, hvis titel indeholder ordet 'Manager', brug
(title=*Manager*).
Nogle tegn har en speciel betydning i LDAP-filtre (f.eks. *, (, ), \). Hvis du har brug for at søge efter disse tegn som en del af en værdi, skal de "escapes" ved at bruge en backslash (\) efterfulgt af tegnets to-cifrede hexadecimale ASCII-kode.
Eksempel: For at finde et objekt, hvis navn er 'Salg (DK)', skal filteret være:
(cn=Salg \28DK\29)
Avancerede Søgninger: Bitwise Operatorer
Nogle attributter, især i Active Directory, er bitfelter, hvor hver bit repræsenterer en bestemt indstilling eller flag. Et almindeligt eksempel er userAccountControl-attributten. For at søge baseret på specifikke bits kan du bruge en speciel syntaks med matchende regler (Matching Rule OIDs).
Syntaksen er: (attribut:matching-rule-OID:=værdi)
- LDAP_MATCHING_RULE_BIT_AND (1.2.840.113556.1.4.803): Finder objekter, hvor alle bits i den angivne værdi er sat i attributten.
- LDAP_MATCHING_RULE_BIT_OR (1.2.840.113556.1.4.804): Finder objekter, hvor mindst én af bitsene i den angivne værdi er sat i attributten.
Eksempel: For at finde alle deaktiverede brugerkonti er flaget ADS_UF_ACCOUNTDISABLE, som har værdien 2. Filteret bliver:
(userAccountControl:1.2.840.113556.1.4.803:=2)
For at finde alle brugere, hvis adgangskode aldrig udløber (værdi 65536):
(userAccountControl:1.2.840.113556.1.4.803:=65536)
Disse bitwise-søgninger er meget kraftfulde til at filtrere på komplekse statusattributter uden at skulle kende den samlede værdi af hele feltet.
Praktiske Eksempler på LDAP-filtre
Her er en samling af nyttige filtre til almindelige administrative opgaver i Active Directory.

- Find alle brugere i en bestemt gruppe (inklusive indlejrede grupper):
(&(objectCategory=Person)(sAMAccountName=*)(memberOf:1.2.840.113556.1.4.1941:=cn=Gruppenavn,ou=Grupper,dc=domæne,dc=com))
Denne syntaks bruger den specielle 'in-chain' matchende regel til at gennemgå indlejret gruppemedlemskab. - Find alle aktive brugere (ikke deaktiverede):
(&(objectCategory=person)(objectClass=user)(!(userAccountControl:1.2.840.113556.1.4.803:=2))) - Find alle brugere, der skal ændre adgangskode ved næste login:
(&(objectCategory=person)(objectClass=user)(pwdLastSet=0)) - Find alle computere, der ikke er deaktiverede:
(&(objectCategory=computer)(!(userAccountControl:1.2.840.113556.1.4.803:=2))) - Find alle sikkerhedsgrupper (ikke distributionsgrupper):
(&(objectCategory=group)(groupType:1.2.840.113556.1.4.803:=2147483648)) - Find alle grupper uden medlemmer:
(&(objectCategory=group)(!(member=*)))
Ofte Stillede Spørgsmål (FAQ)
Hvad er forskellen på objectClass og objectCategory?
Selvom de kan virke ens, er der en vigtig forskel. objectClass er en flerværdi-attribut, der beskriver alle klasser, et objekt tilhører (f.eks. top, person, organizationalPerson, user). objectCategory er en enkeltværdi-attribut, som er indekseret og peger på den mest specifikke klasse. I Active Directory-miljøer er det næsten altid mere effektivt at bruge objectCategory i dine filtre, da det giver hurtigere søgninger. For eksempel er (objectCategory=person) hurtigere end (objectClass=user).
Hvorfor virker mit filter med wildcards på 'memberOf' ikke?
Attributter som 'memberOf' og 'distinguishedName' har en speciel syntaks (DN-String). LDAP-standarden tillader ikke brug af wildcards på attributter af denne type. I stedet for at forsøge noget som (memberOf=*CN=Salg*), skal du bruge den fulde Distinguished Name (DN) for gruppen. Hvis du har brug for at finde medlemmer af indlejrede grupper, skal du bruge den specielle 'in-chain' operator som vist i eksemplerne ovenfor.
Er der forskel på store og små bogstaver i LDAP-filtre?
For de fleste streng-attributter i Active Directory er der ikke forskel på store og små bogstaver. En søgning på (sn=Jensen) vil finde 'Jensen', 'jensen' og 'JENSEN'. Dog kan der være undtagelser, især i andre LDAP-implementeringer eller for specifikke attribut-typer som binære værdier. For booleske attributter skal du bruge 'TRUE' eller 'FALSE' med store bogstaver.
Hvordan finder jeg objekter, der er blevet ændret for nylig?
Du kan bruge attributten whenChanged med en dato i Generalized Time-format (YYYYMMDDHHMMSS.0Z). For eksempel, for at finde alle objekter, der er ændret efter 1. juni 2024, ville filteret være:
(whenChanged>=20240601000000.0Z)
Dette er nyttigt til revisions- og synkroniseringsformål.
Hvis du vil læse andre artikler, der ligner Forstå LDAP-filtre: En Komplet Guide, kan du besøge kategorien Teknologi.
