Valamikor írtam róla, hogyan járt szerencsétlen ügyfelünk: az anyacége dömperrel beborított vagy 30000 kontaktot a címtárába. Szaladgáltak is szegények, mi lesz most a címlistákkal: végül egy illegalitásba hajló lépéssel megpatkoltuk a rendszert.

Aki nem olvasta át a két linket, röviden összefoglalom: szerencsére kiderült, hogy a távoli tartományban született kontaktok msexchoriginatingforest tulajdonsága megőrzi az eredeti forest értékét. A helyben született objektumoknál viszont ez üres. Azaz a GAL mögötti ldap filterbe ‘és’ kapcsolattal becsatoltunk egy !(msexchoriginatingforest=*) feltételt – így csak azok jelentek meg a globális címlistában, akiknek üres volt ez a tulajdonsága. Természetesen az eredeti GAL filtert kimentettük egy custom címlistába, hogy akik abban akarnak keresni, azért tudjanak.

Mindenki boldog volt.

Egészen az Exchange 2007 migrációig.

Igazából nem az a legnagyobb baj, hogy ebben a termékben kinyírták az ldap alapú szűrést. Hiszen bejött helyette az OPATH – és ha megszokod, rájössz, hogy ez tényleg jobb. Még csak nem is az a katasztrófa, hogy beszuszakoltak egy plusz réteget a filter és a címtár közé. Igaz, hogy mostantól a feltételekben nem direktben hivatkozol az objektumok tulajdonságainak értékére, hanem helyette ujjból szopott nevű változókat kell használnod… de ez maximum kényelmetlenség. A tragédia az, hogy nem definiáltak minden tulajdonsághoz változót. Költői kérdés: találd ki, használhatjuk-e OPATH filterben az msexchoriginatingforest tulajdonságra definiált változót? Nem… mert nincs. Nyugodtan böngészd át a választékot.

Mondtam, ugye, hogy a legnagyobb szopás az ldap filter az egész upgrade-ben?

Akkor mi legyen? Adódik, hogy szűrjünk rá a szerver nevére. Az ügyfélnél egy darab nagy teljesítményű központi szerver lesz, tehát még a szűrőfeltétel sem lesz túl bonyolult. Alapvetően működhetne is… csak éppen nem elegáns. Mi van, ha valamikor üzembeállítanak majd egy másik MBX szervert is? Mi van, ha egyszer átmigrálják a postafiókokat egy másik szerverre? Ki fog emlékezni rá, hogyan lett megbuherálva a GAL? Ráadásul…ugye az átállás ideje alatt még két szerver van, tehát mindkettőnek a nevét be kellene írni a feltételbe. Pedig a régi csak pár hétig fog még élni. Jó, majd utólag módosítjuk.
Meséltem már erről? Lehet. De ismétlés a tudás k. anyja.
Szóval, a GAL-t a set-globaladdresslist paranccsal tudjuk upgradelni. Exchange 2007 alatt ugyanis minden szűrős objektumnak két szűrője is van. (Logikus, hiszen illeszkednie kell mind a régi, mind az új rendszerhez.) A címtár preparálásakor meg is jelenik az új tulajdonság, de sehol, hangsúlyozom, sehol sem történik automatikus filter konverzió, amikor betoljuk az első MBX szervert az organizációba.
Magad uram, ha szolgád nincsen.
Címlistáknál, email address policy-knél nem is gond. De a GAL-nál igen. A set-globaladdresslist parancs ugyanis egylövetű. Egyszer beírhatod az OPATH szűrőt. A következő futtatáskor már azt kapod, hogy ‘Hohó, valaki nem bír magával!’. Nyilván adsiedit és purportedsearch… de nem lehetsz benne biztos, nem csináltál-e valami visszafordíthatatlant. Lehet, hogy valahol a mélyben elpattant egy fogaskerék, a szerver teliholdkor életre kel és szakrálisan feláldozza az éjszakai recepcióst. Vagy bármi. De hogy nem lesz supportált, az tuti biztos.
Márpedig, ha a szervernevekkel játszol, akkor kétszer is módosítanod kell a GAL-t.

De azért megpróbáltam körbejárni. Leginkább azért, hogy közben időt hagyjak ott hátul a megoldáskeresésnek.
Összedobtam az Exchange 2003-ban egy teszt címlistát. Varázslóval. Középső fül, szervernév megad. Nézzük az eredményt… hoppá. Brian… leestem a székről. Ott voltak benne a külföldi címek. Most én vagyok a hülye… vagy a varázsló? Szerintem az utóbbi. Nézzük csak a konkrét feltételt… jézusmária. Sőt, ez már inkább duplajézusmária erősségű volt. Ez az idióta kuruzsló ‘vagy’ kapcsolatba tette a szervernévre vonatkozó feltételt az első panelen bepipált ‘contact’ feltétellel. Így mindenki beleesett. Döbbenet.

Kitérő:

Ha csak lehet, ne használj varázslót.
Ha ez eddig nem lenne egyértelmű, elmagyarázom, miért.
Nézzük az előbbi példát, kattogtassunk össze egy címlistát, amelyikben az Exchange postafiókkal bíró felhasználók címei vannak. Első fül, ‘Users with Exchange mailbox’ checkbox. Ez lesz a szűrőfeltétel:

(&(&(& (mailnickname=*) (| (&(objectCategory=person)(objectClass=user)(|(homeMDB=*)(msExchHomeServerName=*))) ))))

Azaz mindenki, akinek nem üres a homemdb (melyik adatbázisban van) és az msexchhomeservername (melyik exchange szerveren van) tulajdonságának az értéke.

Jelöljük be mellé a külső emailcímmel bíró felhasználókat is. Ez ugyanazon a panelen a következő két checkboxot jelenti: ‘Users with Exchange mailbox’ és ‘Users with external mail addresses’. A szűrőfeltétel:

(&(&(& (mailnickname=*) (| (&(objectCategory=person)(objectClass=user)(!(homeMDB=*))(!(msExchHomeServerName=*)))(&(objectCategory=person)(objectClass=user)(|(homeMDB=*)(msExchHomeServerName=*))) ))))

Azaz mindenki, akinek nem üres a homemdb (melyik adatbázisban van) és az msexchhomeservername (melyik exchange szerveren van) tulajdonságának az értéke – illetve mindenki, akinek meg üres. Jópofa, mi? Ha belegondolsz, hogy beviszünk egy feltételt, majd ‘vagy’ kapcsolattal annak az ellenkezőjét is, akkor tkp megkapjuk az univerzumot. Ami nem baj, mert ugye pont azt kértük… csak éppen megkaphatjuk egyszerűbben is, sokkal kevesebb munkával.
A helyes, varázslótlanitott szűrő:

(&(mailnickname=*)(objectCategory=person)(objectClass=user))

Ha belegondolsz, hogy ez a szűrőfeltétel minden RUS futáskor végigmegy a címtáradon… ugye nem mindegy, mennyit kell tökölnie a feltétel kiértékelésén.

Kitérő vége.

Szóval nem tetszett a szerverneves vizsgálódás. Ldp-ből kinyomtattam mindenfajta objektumból egy-egy teljes tulajdonságlistát, majd egy kihúzófilc társaságában félrevonultam. Kerestem, hol lehet ezt az egészet megfogni.
Hamar kiderült, hogy a szervernévvel egész konkrétan nem. Az ugyanis a magyar kontaktoknál is üres, nemcsak a kintről betoltaknál.
Gyakorlatilag nem találtam semmit. Illetve találtam, de. Nekem, emberi aggyal egyből látszott…de látszik-e ez a programnak is? Ugye ott van a distinguishedname, mint paraméter. Ebben szépen benne van az objektum elérési útvonala is. Márpedig a letolt címek, mégha egy nagyon bonyolult OU struktúrában is, de egy OU-n belül vannak. Azaz a distinguishedname valahogy így néz ki: cn=blabla,,,ou=PamPam,ou=blabla,dc=blabla. A vastaggal jelölt rész mindegyik idegen címben megegyezik, és csak azokra jellemző. Nosza, nézzük csak meg azt az OPATH szintakszist. Jé, ez a nolike egész szimpatikus. Tud ez wildcardot? Tud. A distinguishedname tulajdonságra létezik változó? Létezik, méghozzá ugyanazzal a névvel. Mire várunk?

Hölgyeim és Uraim! Imhol az új GAL:

alias -ne $null -and distinguishedname -nolike ‘*ou=PamPam*’

Már csak be kell gépelni. Jelzem, elsőre úgysem fog sikerülni. A filterek beadása rendszeresen kész katasztrófa. Elsőre úgyis csak címlistákon gyakorlunk, tehát dobjuk be ezt a keresést egy már létező ‘teszt’ nevűbe:

set-addresslist -identity teszt domaincontroller dc.domain.hu -recipientfilter {alias -ne $null -and distinguishedname -nolike ‘*ou=PamPam*’} -whatif

A -whatif azért van a végén, hogy ne csinálja meg, csak írja ki, mi lett volna.
Nos?
Ha jól csináltuk, akkor egy kövér errort kaptunk. Azt mondja, ennél a tulajdonságnál nem használhatunk wildcard-ot.
Ez már maga a Turáni Átok. Miért, ó miért? Bakker, hiszen ezen tudtuk (volna) egyedül megfogni a külsős címeket.
Gugli. Ezen a fórumon valaki hasonlóba futott bele, választ persze nem kapott. Viszont a Szkriptelő Fiúk egy helyen elkottyantották magukat:

Alas, this won’t work, either. As it turns out, the DN is a “constructed” attribute. The DN isn’t actually stored in Active Directory, it’s constructed on-the-fly any time you request it. Thus you can’t do a wildcard search on the distinguishedName attribute. And don’t bother asking about the ADsPath attribute, which also contains the OU name; you can’t do a wildcard search on the ADsPath, either.

Nem örülök… de beletörődtem.

Viszont az agyam, az kiürült. Szórakozottan nézegettem a papírjaimat, meg a változókat. Aztán az agyam kezdett magára találni, szép lassan összerakta az újabb variációt. Nézzük csak, proxyaddress tulajdonság, melyet itt emailaddresses-nek hívnak. Határozottan jelzi a táblázat, hogy nyomjuk csak bátran neki a wildcardot, bírja. Csakhogy ez egy tömb. Hogyan szűrjünk rá? Ezt is megmondja: a tömb elemei vesszővel vannak elválasztva és az egész egy szép nagy sztring. Nocsak. Persze az SMTP cím nem megoldás, rengeteg fajta van a cégen belül, aztán meg ott vannak a külsős kontaktok is. Na de… itt van ez az őskövület. Az X400-as cím. Mely már az égegyadta világon semmire sem jó. Csakhogy ennek a ‘P’ paramétere (Private Management Domain Name) pont az organizáció neve. És X400-as címe mindenkinek van – hiszen ez csak az email address policy-n múlik.

Azaz a következő kisérlet:

alias -ne $null -and emailaddresses -like ‘*p=orgname*’

Na, ez már jó. Mennyire? Túl.
Ez ugyanis beleveszi az összes emailcímmel bíró public foldert is, azt meg mi nem igazán szeretnénk. De innentől már rutinmunka. Úgy csinálunk, mintha gyártanánk egy új címlistát, bejelölünk mindenkit az első panelen (vegyük észre, hogy a public folderek fel sincsennek sorolva, azokat csak EMS-ből lehet felvenni), majd az utolsó panelről ctrl+v-vel lekapjuk a recipientfilter paraméter értékét, beleírjuk az emailaddresses figyelést… és készen is vagyunk. Imhol.

set-addresslist -identity teszt -domaincontroller dc.domain.hu -recipientfilter {emailaddresses -like ‘*p=orgname*’ -and (RecipientType -eq ‘UserMailbox’ -or RecipientType -eq ‘MailContact’ -or RecipientType -eq ‘MailUser’ -or (RecipientType -eq ‘MailUniversalDistributionGroup’ -or RecipientType -eq ‘MailUniversalSecurityGroup’ -or RecipientType -eq ‘MailNonUniversalGroup’ -or RecipientType -eq ‘DynamicDistributionGroup’) -or (RecipientType -eq ‘UserMailbox’ -and ResourceMetaData -like ‘ResourceType:*’ -and ResourceSearchProperties -ne $null))}

Habár már éppen eleget dolgoztunk ma, de azért ellenőrizzünk. Számoljuk össze, hány emberből áll az egyik lista és hányból a másik. Apró baki, hogy Exchange 2007-ben már csak preview van az Address List tulajdonságlapján, számláló nincs. Na de ott van még a régi szerver! Meg tudja számolni a 2003-as Exchange System Manager a 2007-es címlista elemeit? Meg hát. Igaz, eleinte hőbörög, de aztán beletörődik és számol.
A jó hír az, hogy kicsi az eltérés. A rossz hír az, hogy van. Nyilván annak a húsz embernek nem vigasz, hogy csak huszan nem látszanak a listában. És persze az egyik biztosan a vezérigazgató.
Akkor mégsem végeztünk. Nyilván az történt, hogy a több ezer emberből húsznál ki van kapcsolva a recipient policy, manuálisan meg nem kaptak X.400 címet. Semmi gond, megkeressük, levadásszuk.
Nyilván szkripttel.
Egy általános keresőszkript mindig itt figyel a gépemen, pusztán csak a kilistázott adatokat kell konkretizálnom. X400-as cím… az ugye a proxyaddresses tömb része. Nem tudom, ki szeret tömböt boncolni, én nem igazán. Kerülő út? Persze, hogy van. Tudni kell, hogy létezik olyan, hogy textEncodedORAddress változó, ebben a felhasználó elsődleges X400-as címe figyel. Pusztán csak ezeket kell lekérni egy Excel táblába, majd vizuálisan kiszúrni, kinél nincs adat.

Innentől már tényleg csak a piszkos munka van hátra.