Нужна помощь в переводе Powershell -> Javascript для функции преобразования LDAP (dn -> canonicalName)

Я нашел отличную функцию, которая принимает действительную строку Active Directory LDAP Однозначный (DN) и преобразует ее в правильно отформатированную строку canonicalName (не CN), написанную в PowerShell.

Поскольку я использую ldapjs в Node.js и мне нужно получить атрибут canonicalName объекта AD (который недоступен изначально с использованием любой из библиотек Node/AD/LDAP, потому что рассматриваемый атрибут "создан"), если кто-то может мне помочь преобразовать эту функцию в чистый Javascript, это решило бы мою дилемму идеально.

Кто-нибудь готов нанести удар? Оригинальный пост, на который ссылался этот код (вставленный ниже), можно найти здесь: https://gallery.technet.microsoft.com/scriptcenter/Get-CanonicalName-Convert-a2aa82e5

Пример входного значения:

'CN=Eric Paw,OU=Sales,OU=People,DC=example,DC=com'

Ожидаемый результат:

'example.com/People/Sales/Eric Paw'

(Подсказки: результирующая функция JS должна быть в состоянии обрабатывать глубоко вложенные объекты OU! Также я предполагаю, что выражения RegEx, вероятно, могли бы помочь обработать некоторые части этого довольно хорошо, но не имеют ни малейшего понятия, как это реализовать.)

Заранее благодарю всех, кто может помочь решить мою проблему!

function Get-CanonicalName ([string[]]$DistinguishedName) { 
    foreach ($dn in $DistinguishedName) {      
        ## Split the dn string up into it's constituent parts 
        $d = $dn.Split(',') 

        ## get parts excluding the parts relevant to the FQDN and trim off the dn syntax 
        $arr = (@(($d | Where-Object { $_ -notmatch 'DC=' }) | ForEach-Object { $_.Substring(3) }))  

        ## Flip the order of the array. 
        [array]::Reverse($arr)  

        ## Create and return the string representation in canonical name format of the supplied DN 
        "{0}/{1}" -f  (($d | Where-Object { $_ -match 'dc=' } | ForEach-Object { $_.Replace('DC=','') }) -join '.'), ($arr -join '/') 
    } 
}

2 ответа

Решение

Здесь удар по ответу на мой собственный вопрос, надеюсь, это поможет кому-то. Кажется, работает для меня просто отлично, даже в том случае, когда в значении / пути у атрибута allocishedName пользователя есть несколько CN.

function formatCanonicalName( DN ) {

  var CN = "", DC = "", OU = "";
  DN = DN.replace("\\,", "~");
  DN.split(",").forEach(function(item) {
    switch (item.substring(0,2)) {
      case 'CN': 
        if (item.indexOf('~') > -1) { item = item.split("~")[1] + " " + item.split("~")[0]; }
        CN = item.replace("CN=", "") + "/" + CN; 
        break;
      case 'OU': 
        OU = item.replace("OU=", "") + '/' + OU; 
        break;
      case 
        'DC': DC = DC + item.replace("DC=", "") + '.'; 
        break;
    };
  }); 
  return DC.substring(0, DC.length - 1) + '/' + OU + CN.substring(0, CN.length - 1); 
}

Это не отвечает на ваш точный вопрос, но отвечает вашей проблеме.

Построенные атрибуты доступны любому клиенту LDAP - вам просто нужно специально их запросить.

Например, если вы делаете поиск, вы можете указать, какие атрибуты вы хотите вернуть. Если вы ничего не укажете, он вернет все не сконструированные атрибуты, которые имеют значение. Если вам нужен составной атрибут, вам нужно указать его.

Я не знаю, какую библиотеку вы используете, но если вы используете LDAPjs, есть attributes недвижимость в options объект, который передается в search метод. где вы можете указать, какие атрибуты вы хотите вернуть. Вы можете указать canoncialName там (вместе с другими атрибутами, которые вы хотите).

Аналогично, если вы привязываете непосредственно к определенному объекту, обычно есть способ получить созданный атрибут.

Если вы сообщите нам, какую библиотеку LDAP вы используете, и, возможно, покажете свой код, мы поможем вам в дальнейшем.

Другие вопросы по тегам