使用JavaScript获取LDAP多值字符串属性

时间:2009-11-17 22:54:00

标签: javascript active-directory activex ldap

我正在尝试在Active Directory中检索一个似乎是多值字符串的对象属性(请参阅canonicalName)。执行搜索后:

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没有将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]); }

两者都不起作用......

如何读取此对象的值?

3 个答案:

答案 0 :(得分: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]);
    }

希望这对你和其他任何人都有帮助,就像我一直对它一样。

答案 1 :(得分:1)

有时候我遇到了同样的问题:我不能用javascript迭代一个对象,但是在vb中,每个都用一个简单的方法完成...

我找到了一种在javascript中迭代解决问题的方法。我希望它对你有用:

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

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

    };
};

答案 2 :(得分: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