需要帮助翻译Powershell->;LDAP(dn->;canonicalName)转换函数的Javascript

需要帮助翻译Powershell->;LDAP(dn->;canonicalName)转换函数的Javascript,javascript,node.js,powershell,active-directory,ldapjs,Javascript,Node.js,Powershell,Active Directory,Ldapjs,我发现了一个很好的函数,它接受一个有效的Active Directory LDAP DifferentizedName(DN)字符串,并将其转换为在PowerShell中编写的格式正确的canonicalName(而不是CN)字符串 因为我在Node.js中使用ldapjs,并且需要检索AD对象的canonicalName属性(由于该属性是“构造的”,因此无法使用任何Node/AD/LDAP库在本机使用),如果有人能帮助我将该函数转换为纯Javascript,这将完美地解决我的难题 有人愿意尝试

我发现了一个很好的函数,它接受一个有效的Active Directory LDAP DifferentizedName(DN)字符串,并将其转换为在PowerShell中编写的格式正确的canonicalName(而不是CN)字符串

因为我在Node.js中使用ldapjs,并且需要检索AD对象的canonicalName属性(由于该属性是“构造的”,因此无法使用任何Node/AD/LDAP库在本机使用),如果有人能帮助我将该函数转换为纯Javascript,这将完美地解决我的难题

有人愿意尝试一下吗?此处可以找到引用此代码(插入下面)的原始帖子:

输入值示例:

'CN=Eric Paw,OU=Sales,OU=People,DC=example,DC=com'
预期结果:

'example.com/People/Sales/Eric Paw'
(提示:生成的JS函数应该能够处理嵌套的对象!而且我猜正则表达式可能可以很好地处理其中的某些部分,但对于如何实现它却没有一点线索。)

提前向所有能够帮助解决我的问题的人表示最热烈的感谢

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 '/') 
    } 
}

这并没有回答你的确切问题,但它回答了你的问题

构造的属性对任何LDAP客户机都是可用的-您只需专门请求它们

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

我不知道您正在使用哪个库,但如果您正在使用,则传递到的
选项
对象中有一个
属性,您可以在其中指定要返回的属性。您可以在那里指定
canoncialName
(以及所需的其他属性)

同样,如果直接绑定到特定对象,通常有一种方法可以检索构造的属性


如果您让我们知道您使用的是哪个LDAP库,并且可能会显示您的代码,我们可以进一步提供帮助。

这里尝试回答我自己的问题,希望它对其他人有所帮助。即使在用户的DiscrimitedName属性在值/路径中有多个CNs的情况下,对我来说似乎也很好

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

谢谢你的回复。实际上,我在attributes属性中专门指定了canonicalName,但没有用。事实上,我已经检查了LDAP调用检索到的所有原始数据,并且返回了我请求的每个字段(cannonicalName除外)。有趣的是,dn/DifferentiedName属性也被认为是一个“构造”属性,并且返回时没有问题。但由于dn属性包含构造canonicalName所需的所有元素(与“cn”也不相同),我认为最简单的解决方案是以编程方式构造它。如果有帮助,我将使用npm的activedirectory2库。看起来有两个地方可以指定它。首先,当存在一个
attributes
集合时,您可以传递要为用户和组检索的属性(这是在您直接绑定到用户或组时使用的,而不是通过搜索)。此外,任何“find”方法都会获取一个对象,您可以在其中指定属性列表。你最好展示你的代码。这可能很简单。只是澄清一下,
discrimitedName
不是构造的属性。您可以看到,在-
systemFlags
中,没有像这样构造的
FLAG\u ATTR\u。感谢您的反馈,我向您保证,我已正确地将canonicalName作为所需属性传递以返回,但它没有发生。恕我直言,这不是我刚刚忽略或不理解的事情。即使我已经请求了它以及大约28个以上的其他属性,它也没有被传回。它们都是无问题返回的(包括二进制格式的用户照片!),但canonicalName不是。似乎对于其他库,此属性需要特殊处理,但activedirectory2或ldapjs没有为其提供明显的选项。发布此属性以防它对其他人有所帮助。