需要帮助翻译Powershell-> LDAP的Javascript(dn-> canonicalName)转换功能

时间:2019-01-28 22:16:52

标签: javascript node.js powershell active-directory ldapjs

我发现了一个很棒的函数,它可以使用有效的Active Directory LDAP专有名称(DN)字符串,并将其转换为用PowerShell编写的格式正确的canonicalName(not CN)字符串。

因为我在Node.js中使用ldapjs,并且需要检索AD对象的canonicalName属性(使用任何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 个答案:

答案 0 :(得分:0)

这不能回答您的确切问题,但是可以回答您的问题。

构造的属性可用于任何LDAP客户端-您只需专门要求它们即可。

例如,如果要搜索,则可以指定要返回的属性。如果不指定任何内容,它将返回所有具有值的非构造属性。如果需要构造的属性,则需要指定它。

我不知道您使用的是哪个库,但是如果您使用的是LDAPjs,则attributes对象中有一个options属性会传递给{ {3}},您可以在其中指定要返回的属性。您可以在此处指定canoncialName(以及所需的其他属性)。

同样,如果直接绑定到特定对象,通常可以使用一种方法来获取构造的属性。

如果您让我们知道您使用的是哪个LDAP库,或者可能显示您的代码,我们将为您提供进一步的帮助。

答案 1 :(得分:0)

在回答我自己的问题时不切实际,希望对您有所帮助。即使在用户的distinguishedName属性的值/路径中具有多个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); 
}