从 DN 获取用户信息

本文关键字:信息 用户 获取 DN | 更新日期: 2023-09-27 18:37:16

我有两个目标,下面的代码

1) 获取特定 AD 组
以下用户的列表2)获取属于该组的所有用户的电子邮件/姓氏/名字

如果有更好的方法来完成这两个,请告诉我。

我能够获得完整的DN,但我不确定如何从完整的DN中获取剩余的数据,或者是否有更好的方法来提取此信息,请告诉我。 下面是我正在使用的代码,但它出现错误:

The value provided for adsObject does not implement IADs.

当我尝试使用完整的 DN 进行目录搜索器时。

HashSet<string> User_Collection = new HashSet<string>();
SearchResultCollection sResults = null;
DirectoryEntry dEntryhighlevel = new DirectoryEntry("LDAP://CN=Global_Users,OU=Astrix,OU=Clients,OU=Channel,DC=astro,DC=net");
foreach (object dn in dEntryhighlevel.Properties["member"])
{
    DirectoryEntry dEntry = new DirectoryEntry(dn);
    Console.WriteLine(dn);
    DirectorySearcher dSearcher = new DirectorySearcher(dEntry);
    //filter just user objects
    dSearcher.SearchScope = SearchScope.Base;
    //dSearcher.Filter = "(&(objectClass=user)(dn="+dn+")";
    dSearcher.PageSize = 1000;
    sResults = dSearcher.FindAll();
    foreach (SearchResult sResult in sResults)
    {
        string Last_Name = sResult.Properties["sn"][0].ToString();
        string First_Name = sResult.Properties["givenname"][0].ToString();
        string Email_Address = sResult.Properties["mail"][0].ToString();
        User_Collection.Add(Last_Name + "|" + First_Name + "|" + Email_Address);
    }

速度很重要,是的,我知道我没有按照设计使用HashSet。

从 DN 获取用户信息

我总是使用System.DirectoryServices.AccountManagement.

您将看到的第一件事是:"使用快速并发绑定 (FSB) 功能(如果可用)可以提高连接速度。连接缓存减少了使用的端口数。话虽如此,我没有针对此测试您的代码以提高速度,您将不得不自己这样做,但这是Microsoft的新库。

这是我的代码示例:

// Create the context for the principal object. 
PrincipalContext ctx = new PrincipalContext(ContextType.Domain,
                                            "fabrikam",
                                            "DC=fabrikam,DC=com");
// Create an in-memory user object to use as the query example.
GroupPrincipal u = new GroupPrincipal(ctx) {DisplayName = "Your Group Name Here"};
// Set properties on the user principal object.
// Create a PrincipalSearcher object to perform the search.
PrincipalSearcher ps = new PrincipalSearcher {QueryFilter = u};
// Tell the PrincipalSearcher what to search for.
// Run the query. The query locates users 
// that match the supplied user principal object. 
PrincipalSearchResult<Principal> results = ps.FindAll();
foreach (UserPrincipal principal in ((GroupPrincipal)results.FirstOrDefault()).Members)
{
    string email = principal.EmailAddress;
    string name = principal.Name;
    string surname = principal.Surname;
}

看起来您正在 AD 中某个组的组成员身份中行走......(从上面的成员参考中猜测这一点)

无论如何,您需要决定要查找哪种 API。您现在使用的级别要低一些(尽管如果需要,可以降低:))。更高级别是一种选择,因为前面的答案无法实现。

为了进一步抖出代码(并帮助您解决性能问题,因为您提到它对您来说是不合适的):

  • 使用用于组成员身份搜索本身的相同连接(即没有其他连接/绑定)
  • 执行基本搜索,
  • 其中基本 DN 是用户 DN,搜索过滤器是 (objectclass=*),属性只是您关心的属性(否 *)
  • 您可以删除页面大小。分页是一种在组(又名页面)中请求许多对象的方法,但基本搜索仅返回 1 个对象,因此它实际上不会执行任何操作。
  • 基本搜索结果计数应始终为 1。

还要记住跨域问题。请确保使用 2 域林测试代码,其中域 1 中的一组域本地类型具有域 2 的成员。这将产生一些额外的工作来获取更多属性,因为您需要连接到另一个域中的 DC(或者,如果您关心的少数属性都在 GC 部分属性集中......

还要记住安全性。如果您无权访问网域中某些用户的这些属性,代码会有什么作用?上面的代码会以一种令人讨厌的方式失败。:)您可能希望更优雅地处理此问题...

希望这有帮助。~埃里克