0

使用 LDAP 和一般的 C# 相当新,我进行了多次搜索,但我尝试的大多数修复都无济于事。

我正在从 LDAP 中提取信息。一切正常,除了如果我明确需要哪个数组编号,我只能提取 memberOf 信息。尝试使用foreach, 或for语句无济于事。我知道我可能遗漏了一些简单的东西,但我想我应该问一下。

public static String FindOther(String userAccount)
{
   DirectoryEntry entry = GetDirectoryEntry();
   DirectorySearcher search = new DirectorySearcher(entry);
   try
   {
      search.Filter = "(SAMAccountName=" + account + ")";
      search.PropertiesToLoad.Add("distinguishedName"); 
      search.PropertiesToLoad.Add("displayName"); 
      search.PropertiesToLoad.Add("mail"); 
      search.PropertiesToLoad.Add("CN");
      search.PropertiesToLoad.Add("Title");
      search.PropertiesToLoad.Add("sn");
      search.PropertiesToLoad.Add("givenname");
      search.PropertiesToLoad.Add("telephoneNumber");
      search.PropertiesToLoad.Add("memberOf"); 
      SearchResult result = search.FindOne();

      if (result != null)
      {
         return
            "Results for " + userAccount + "\n" +
            " DistinguishedName..: " + result.Properties["distinguishedName"][0].ToString() + "\n" +
            " Displayname........: " + result.Properties["displayname"][0].ToString() + "\n" +
            " eMail..............: " + result.Properties["mail"][0].ToString() + "\n" +
            " Common Name........: " + result.Properties["CN"][0].ToString() + "\n" +
            " Title..............: " + result.Properties["Title"][0].ToString() + "\n" +
            " Last Name..........: " + result.Properties["sn"][0].ToString() + "\n" +
            " First Name.........: " + result.Properties["givenname"][0].ToString() + "\n" +
            " Telephone..........: " + result.Properties["telephoneNumber"][0].ToString() + "\n" +                                    
            " Member Of..........: " + result.Properties["memberOf"][0].ToString() + "\n" +  
            " Member Of..........: " + result.Properties["memberOf"][1].ToString() + "\n" +  
            "End Transmission" + "\n";
         }
         else
         {
            return "Object not found... User ID: " + account;
         }
      }
      catch (Exception ex)
      {
         return "Big Ol Error: " + ex.Message + " User ID: " + account;
      }
   }

感谢大家提供的任何帮助。

4

2 回答 2

1

您可以通过以下方式枚举 PropertyCollection:

   string Ret = string.Empty;
   ...
   foreach(object memberOf in result.Properties["memberOf"])
   {
      Ret += " Member Of..........: " + memberOf.ToString() + "\n";
   }

于 2013-05-21T20:08:54.957 回答
1

我将在这里稍微声明一下,主要是因为我从未编写过Active Directory轻量级目录访问协议。我所知道的一些事情是DirectoryEntry使用建议:

当您要查看实时条目而不是通过 DirectorySearcher 返回的条目时,或者要在返回的对象上调用方法时,请使用 GetDirectoryEntry。

此特定方法将直接从Active Directory返回信息。WhereDirectorySearcher只会通过集合中当前可用的内容生成。我提到这一点,因为如果没有填充集合,它不会产生太多。

我不确定您构建的是哪种类型的应用程序,但 Microsoft 在 Microsoft Developer Network 中有一个完整的区域,其中提到了如何将多个 LDAP/AD 功能集成到应用程序中。

我不确定你的全部目标,但我相信这就是你所追求的。如果不让我知道,我会修改代码。

static void Main(string[] args) { string groupName = "Domain Users"; 字符串域名 = "";

    PrincipalContext ctx = new PrincipalContext(ContextType.Domain, domainName);
    GroupPrincipal grp = GroupPrincipal.FindByIdentity(ctx, IdentityType.SamAccountName, groupName);

    if (grp != null)
    {
         foreach (Principal p in grp.GetMembers(false))
            {
                Console.WriteLine(p.SamAccountName + " - " + p.DisplayName);
            }


        grp.Dispose();
        ctx.Dispose();
        Console.ReadLine();
    }
    else
    {
        Console.WriteLine("\nWe did not find that group in that domain, perhaps the group resides in a different domain?");
        Console.ReadLine();
    }
}

这段代码实际上来自一本书,它是用来完成这样一个目标的。但正如我在上面所说的那样,我从来没有亲自完成过这样的任务——我只是希望能给你指出正确的方向。

可以在此处找到与您类似的另一个问题,其中包含很好的参考并回答了我相信的问题。

于 2013-05-21T20:20:26.837 回答