【问题标题】:What is best way to get canonical path from DistinguishedName in active directory c#从活动目录c#中的DistinguishedName获取规范路径的最佳方法是什么
【发布时间】:2017-03-08 18:59:58
【问题描述】:
在检索所有组/用户时,从 Active Directory 中的 DistinguishedName 获取规范路径的最佳方法是什么?下面的实现有什么问题吗
foreach (SearchResult entry in results)
{
var distinguishedName = entry.Properties["distinguishedName"][0].ToString();
entry.RefreshCache(new string[] { "canonicalName" });
var canonicalName = entry.Properties["canonicalName"][0].ToString();
}
【问题讨论】:
标签:
c#
active-directory
directoryservices
【解决方案1】:
您的代码将不起作用,因为 SearchResult 不包含 RefreshCache 方法。 DN转CN最好的方法是使用DsCrackNames函数。
您需要从 DS_NAME_FORMAT.DS_FQDN_1779_NAME 转换为 DS_NAME_FORMAT.DS_CANONICAL_NAME。
执行此转换不需要 Active Directory 连接。您需要使用 DS_NAME_FLAGS.DS_NAME_FLAG_SYNTACTICAL_ONLY 标志,然后将 IntPtr.Zero 作为连接句柄传递
请注意,无法使用此函数转换外国安全主体
但是,如果您已经查询 DN,您也可以查询 CN。在您的情况下,以下代码应该可以工作:
foreach (SearchResult entry in results)
{
var distinguishedName = entry.Properties["distinguishedName"][0].ToString();
var canonicalName = entry.Properties["canonicalName"][0].ToString();
}
如果条目中不包含CN,则需要将其作为请求属性添加到DirectorySearcher,然后再进行AD查询