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