1

我正在使用用户 ID(用户名)从 AD 获取他/她的信息。我想知道是否可以使用其他标准(例如姓氏、电子邮件地址等)来做同样的事情。

这就是我现在要过滤掉用户的用户:

        string adPath = ConfigurationManager.AppSettings["ADPath"].ToString();
        DirectoryEntry de = new DirectoryEntry(adPath);
        DirectorySearcher deSearch = new DirectorySearcher();
        deSearch.SearchRoot = de;
        string sFilter = String.Format("(&(objectClass=user)(SAMAccountName={0}))", UserID);
        deSearch.Filter = sFilter;
        deSearch.SearchScope = SearchScope.Subtree;
        SearchResult results = deSearch.FindOne();

谢谢。

编辑(使用 Mrc_S 的建议):

using (adPrincipalContext)
{
    UserPrincipal qbeUser = new UserPrincipal(adPrincipalContext);
    qbeUser.GivenName = "Bruce";
    qbeUser.Surname = "Miller";

    PrincipalSearcher srch = new PrincipalSearcher(qbeUser);

    foreach (var found in srch.FindAll())
    {
        UserPrincipal up = (UserPrincipal)found;
        PrincipalSearchResult<Principal> psr = up.GetGroups();                    
        List<Principal> insListPrincipal = new List<Principal>();

        foreach (Principal p in psr)
        {
            insListPrincipal.Add(p);
        } 

        foreach (Principal gp in psr)
        {
            string s1 = gp.Name;
            string s2 = gp.Description;
        }

当我尝试在两个(内部)foreach 循环中查找用户所属的组时,在一次迭代后出现错误。该列表(“indListPrincipal”)将包含 18 个条目,第一个是“域用户”,其余是主要上下文的每个属性的错误。第二个 foreach 在第一次迭代后就死了。我得到的唯一一个是“域用户”组。似乎整个搜索结果在一次迭代后就被处理掉了。我做错了什么?

4

1 回答 1

1

由于您使用的是 .NET 3.5 及更高版本,因此您应该查看System.DirectoryServices.AccountManagement(S.DS.AM) 命名空间。在这里阅读所有相关信息:

基本上,您可以定义域上下文并在 AD 中轻松找到用户和/或组:

// set up domain context
using (PrincipalContext ctx = new PrincipalContext(ContextType.Domain))
{
    // find a user
    UserPrincipal user = UserPrincipal.FindByIdentity(ctx, "SomeUserName");

    if(user != null)
    {
       // do something here....     
    }
}

新的 S.DS.AM 使得在 AD 中与用户和组一起玩变得非常容易!

UserPrincipal对象有很多您可以直接访问的属性 - 如果您需要其他属性,您甚至可以UserPrincipal根据需要扩展您的属性!

更新:如果FindByIdentity搜索的各种属性对您来说还不够,请使用PrincipalSearcher带有“示例查询”主体的 a 进行搜索:

// create your domain context
using (PrincipalContext ctx = new PrincipalContext(ContextType.Domain))
{
   // define a "query-by-example" principal - here, we search for a UserPrincipal 
   // and with the first name (GivenName) of "Bruce" and a last name (Surname) of "Miller"
   UserPrincipal qbeUser = new UserPrincipal(ctx);
   qbeUser.GivenName = "Bruce";
   qbeUser.Surname = "Miller";
   // of course, you can set **ANY** of the UserPrincipal properties here

   // create your principal searcher passing in the QBE principal    
   PrincipalSearcher srch = new PrincipalSearcher(qbeUser);

   // find all matches
   foreach(var found in srch.FindAll())
   {
       // do whatever here - "found" is of type "Principal" - it could be user, group, computer.....          
   }
}
于 2013-09-09T16:13:27.280 回答