2009-11-17 52 views
1

我試圖在Active Directory中檢索看起來是多值字符串的對象屬性(請參閱canonicalName)。執行搜索後:使用JavaScript獲取LDAP多值字符串屬性

var conn; 
conn.Open = 'Provider=ADsDSOObject;'; 
var command = '<LDAP://CN=Partitions,CN=Configuration,DC=domain,DC=com>;(&(objectcategory=crossRef)(systemFlags=3));name,nETBIOSName,nCName,canonicalName;onelevel'; 
var ado = new ActiveXObject('ADODB.Command'); 
ado.ActiveConnection = conn; 
ado.CommandText = command; 
var records = ado.Execute; 

,並同時通過記錄循環:

while (!records.Eof){ 
    ... 

    records.MoveNext(); 
} 

然後我嘗試並獲得canonicalName:

var cn = records.Fields('canonicalName').Value; 

的問題是,JavaScript不intrepret cn作爲一個字符串或數組...如果你看看canonicalName的AD模式,你可以看到它配置了'isSingleValue = false',這是我認爲會導致問題的原因...

當使用Visual Studio跨過代碼時,我可以鑽取字符串值,並且QuickWatch顯示cn.value(0)返回字符串值。但是,當我鍵入了它不工作...

我已經試過了通用的方式得到的數值沒有運氣:

for (var i in cn) { alert(cn[i]); } 

for (i = 0; i < cn.length; i++) { alert(cn[i]); } 

無論是工程.. 。

如何讀取此對象的值?

+0

什麼是更令人沮喪的是,我可以處理這個問題,而不使用VBScript ... – Dscoduc

+0

沒有真正得到賞金系統中的任何問題...爲什麼我會用我的名譽點得到答案?畢竟,這是我的聲譽... – Dscoduc

回答

2

我知道這是一個老問題,但我想通了,並想與大家分享。

var ldap = GetObject("LDAP://cn=Group Name, ou=Name, dc=Domain"); 

var ldapArr = ldap.member.toArray(); 

for(var x = 0; x < ldapArr.length; x++) { 
    WScript.Echo(ldapArr [x]); 
    } 

希望能幫助你和其他任何人像我一樣砸過頭。

+0

適合我!好的解決方案 – Pianoman

1

有時候,我已經得到了同樣的問題:我不能用JavaScript遍歷一個對象,但是在VB中它是一個簡單的對每個做...

我找到了一種方法在JavaScript上解決了迭代我的問題。我希望這是有用的給你:

var enumCn = new Enumerator(cn); 
for (; !enumCn.atEnd(); enumCn.moveNext()) { 
    var cnItem = enumCn.item(); 

... do whatever you need with cnItem... 

    }; 
}; 
+0

沒有爲我工作說對象不是集合 – Hogan

0

我爲此使用了ADO Recordset,並認爲我會幫助未來的用戶通過這個問題。它利用夏爾的解決方案。

我正在使用Internet Explorer 11和本地主機Apache DS Explorer LDAP服務器。當然還有JQuery。

只需將其放入任何HTML文件並在Internet Explorer中打開即可。

$(document).ready(function(){ 
    console.log("Starting"); 
    showUsers(); 
    console.log("Done") 
}); 

function GetFieldValue(objField){ 
    var result = ""; 
    if (objField.Value == null){ 
    } 
    else{ 
     if (objField.type == 12){ 
      var ldapArr = objField.Value.toArray(); 
      result = ldapArr[0]; 
     } 
     else{ 
      result = objField.Value; 
     } 
    } 
    return result; 
}//GetFieldValue 

function showUsers(){ 
    console.log("showUsers"); 
    var strAttributes, strFilter, SrchCriteria, strQuery; 

    strAttributes = "cn,sn,entryDN" 
    SrchCriteria="(objectClass=iNetOrgPerson)" 

    var ADOCommand = new ActiveXObject("ADODB.Command"); 
    var ADOConnection = new ActiveXObject("ADODB.Connection"); 
    var ADORecordSet = new ActiveXObject("ADODB.RecordSet"); 
    ADOConnection.Provider = "ADsDSOObject"; 
    ADOConnection.Properties("User ID") = "uid=admin,ou=system" 
    ADOConnection.Properties("Password") = "secret" 
    strDomainName = "localhost:10389/dc=mijnldap,dc=local" 
    strBase = "<LDAP://" + strDomainName + ">"; 

    ADOConnection.Open("Active Directory Provider"); 
    ADOCommand.ActiveConnection = ADOConnection; 
    strFilter = SrchCriteria; 
    strQuery = strBase + ";" + strFilter + ";" + strAttributes + ";subtree"; 
    strQuery = strQuery; 

    console.log(strQuery); 

    ADOCommand.CommandText = strQuery; 
    ADORecordSet = ADOCommand.Execute; 
    console.log("Query executed"); 

    if (ADORecordSet.RecordCount > 0) { 
    ADORecordSet.MoveFirst; 
    while (! ADORecordSet.EOF){ 
     console.log (GetFieldValue(ADORecordSet.Fields("sn"))); 
     console.log (GetFieldValue(ADORecordSet.Fields("cn"))); 
     console.log (GetFieldValue(ADORecordSet.Fields("entryDN"))); 
     ADORecordSet.MoveNext; 
    } 
    }//if 
    ADORecordSet.close 

} //showUsers