我发现了一个很棒的函数,它可以使用有效的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 '/')
}
}
答案 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);
}