Egy régi problémám volt az, hogy hogyan találjunk meg egy felhsználót az Active Directoryban az e-mail címe alapján. Volt erről egy hosszú thread a technetklub levlistán (http://listmanager.technetklub.hu/read/messages?id=122959 [2008-05-30: Ez a link már nem él. A technetklub levlista kimúlt, béke poraira. Még nem adtam fel, hogy az archívumot egyszer kirakom az internetre publikusan, de sajna nincs időm befejezni a kódot.]) amiből az derült ki, hogy valamelyik proxyAddress alapján nehéz megtalálni a felhasználót, ráadásul lassú is. A probléma alapja, hogy azt gondoltom (gondoltuk többen), hogy a proxyAddresses propertyben nem lehet keresni mert az egy multivalue property. Már tervezgettem, hogy írok valami szolgáltatást a dologra. Egy progi megadott időközönként végigtúrja az AD-t épít belőle egy adatbázist amiben utána én tudok gyorsan keresni.
Ma megint kellet volna ez a dolog így tüzetesebben utánnanéztem a Windows 2000 Scripting Guide-ban (http://www.microsoft.com/technet/scriptcenter/guide/default.mspx). Olvasva az ADSI keresésre vonatkozó részt egy mondatra figyeltem fel (itt: http://www.microsoft.com/technet/scriptcenter/guide/sas_ads_jgtf.mspx):
…use objectCategory rather than objectClass because objectCategory is single-valued and ideal for servicing search requests…
Várjunk csak, ezek szerint lehet multivalue propertyben keresni. Kipróbáltam. Íme az eredmény:
var SearchMail = "test@domain.hu"; var ADConnect = new ActiveXObject("ADODB.Connection"); var ADCommand = new ActiveXObject("ADODB.Command"); var rootDSE, ForestRoot, ADRS; rootDSE = GetObject("LDAP://rootDSE"); ForestRoot = rootDSE.Get("rootDomainNamingContext"); ADConnect.Open("Provider=ADsDSOObject;"); ADCommand.ActiveConnection = ADConnect; ADCommand.CommandText = "<GC://" + ForestRoot + ">;(&(objectCategory=user)(proxyAddresses=smtp:" + SearchMail + "));name;subtree"; ADRS = ADCommand.Execute(); for(; !ADRS.EOF; ADRS.MoveNext()) WScript.Echo(ADRS.Fields("name").Value); ADConnect.Close();
2010-01-23 at 22:35
ki ez