代码之家  ›  专栏  ›  技术社区  ›  Dscoduc

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

  •  1
  • Dscoduc  · 技术社区  · 15 年前

    我正在尝试在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();
    }
    

    然后我试着得到佳能名称:

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

    问题是,javascript不能将cn作为字符串或数组来表示…如果您查看canonicalname的广告模式,您会发现它配置了“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 回复  |  直到 9 年前
        1
  •  2
  •   Xiazer    11 年前

    我知道这是一个古老的问题,但我想和大家分享一下。

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

    希望这能帮助你和其他人像我一样用头撞它。

        2
  •  1
  •   Javier Cobo    13 年前

    有时我也有同样的问题:我不能用javascript迭代一个对象,但是在vb中,它是用一个简单的for-each来完成的…

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

    var enumCn = new Enumerator(cn);
    for (; !enumCn.atEnd(); enumCn.moveNext()) {
        var cnItem = enumCn.item();
    
    ... do whatever you need with cnItem...
    
        };
    };
    
        3
  •  0
  •   Pianoman    9 年前

    我使用ADO记录集来解决这个问题,我想我会帮助未来的用户解决这个问题。它利用了夏泽的解决方案。

    我正在使用Internet Explorer 11和本地主机ApacheDS 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