Использование JavaScript для получения многозначного строкового атрибута LDAP - PullRequest
1 голос
/ 18 ноября 2009

Я пытаюсь получить атрибут объекта в 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 как строку или как массив ... если вы посмотрите на схему AD для 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 ]

2 голосов
/ 21 февраля 2014

Я знаю, что это более старый вопрос, но я разобрался с ним и хотел бы поделиться.

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 голос
/ 07 марта 2012

Иногда у меня возникает та же проблема: я не могу перебрать объект с помощью javascript, но в vb это делается с простым для каждого ...

Я нашел способ перебора в javascript, который решил мою проблему. Я надеюсь, что это полезно для вас:

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

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

    };
};
0 голосов
/ 08 июля 2016

Я использовал ADO Recordset для этого и подумал, что помогу будущим пользователям пройти мимо с этой проблемой. Он использует решение Xiazer.

Я использую 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
...