从DN获取用户信息

时间:2012-06-15 16:57:32

标签: c# active-directory

我有以下代码的两个目标

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

如果有更好的方法可以实现这两点,请告诉我。

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

  

The value provided for adsObject does not implement IADs.

当我尝试使用完整DN进行DirectorySearcher时。

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,因为它的设计。

2 个答案:

答案 0 :(得分:1)

我总是使用System.DirectoryServices.AccountManagement

您将看到的第一件事是:“可用时使用快速并行绑定(FSB)功能可以提高连接速度。连接缓存会减少使用的端口数量。” 有了这个说我没有测试你的代码反对这个速度你必须自己做,但这是微软的新库。

这是我的代码示例:

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

答案 1 :(得分:0)

看起来你正在走AD的某个群体的群组成员资格......(猜测上面的成员参考)

无论如何,您需要确定您正在寻找的API类型。你现在使用的那个是一个较低的水平(虽然如果你想要你可以降低:))。如上一个答案所述,上升水平是一个选择。

稍微改掉一下代码(并在你提到它时对你的帮助有所帮助):

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

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

还要记住安全性。如果您无法访问域中某些用户的这些属性,那么代码会做什么?上面的代码会以令人讨厌的方式失败。 :)你可能想要更优雅地处理这个......

希望这会有所帮助。 〜埃里克