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