列出活动目录组的所有成员

时间:2010-03-11 15:29:33

标签: c# active-directory clr

我在检索活动目录中某个组的成员时遇到问题。我正在使用的代码如下:

[Microsoft.SqlServer.Server.SqlFunction(FillRowMethodName = "fillRow")]
public static IEnumerable getNTGroupMembers(string groupName)
    {
        SearchResult result;
        DirectorySearcher search = new DirectorySearcher();
        search.Filter = String.Format("(cn={0})", groupName);
        search.PropertiesToLoad.Add("member");
        result = search.FindOne();

        ArrayList userNames = new ArrayList();
        if (result != null)
        {
            for (int counter = 0; counter < result.Properties["member"].Count; counter++)
            {
                object user = (object)result.Properties["member"][counter];
                userNames.Add(user);
            }
        }
        return userNames;
    }

但是它返回了以下列表:

  

CN = X,OU = X,OU = X,OU = X,OU = X,DC = X,DC = X,DC = X

有谁知道如何返回会员的用户名。我尝试过不同的属性,但是我无法让它工作。

这是我为SQL Server 2005创建的CLR函数的一部分。

1 个答案:

答案 0 :(得分:0)

我设法做到了。它仍然存在一些问题,由于某些原因,一些AD组不会返回其中的一些成员 如果有人知道更好的方法,请告诉我!

[Microsoft.SqlServer.Server.SqlFunction(FillRowMethodName = "fillRow")]
public static IEnumerable getNTGroupMembers(string groupName)
{
    SearchResult result;
    DirectorySearcher search = new DirectorySearcher();
    search.Filter = String.Format("(cn={0})", groupName);
    search.PropertiesToLoad.Add("member");
    result = search.FindOne();
    ArrayList userNames = new ArrayList();
    if (result != null)
    {
        for (int counter = 0; counter < result.Properties["member"].Count; counter++)
        {
            string st = (string) result.Properties["member"][counter];
            DirectoryEntry gpMemberEntry = new DirectoryEntry(("LDAP://" + st));
            if (!(gpMemberEntry == null))
            {
                PropertyCollection userProps = gpMemberEntry.Properties;
                object objUser = userProps["sAMAccountname"].Value;
                userNames.Add(objUser);
            }
        }
    }
    return userNames;
}
private static void fillRow(Object obj, out string user)
{
    object row = (object)obj;
    user = (string)row;
}