繁体   English   中英

C# 过滤 Active Directory 用户列表并返回 Active/Enabled 用户

[英]C# Filter List of Active Directory Users & return Active/Enabled Users

我有一个从 AD 返回的用户列表,我需要过滤它们以返回活动用户。 这是我的代码,但它没有返回任何用户。 经过大量的谷歌搜索,我不知道缺少什么;

        public static List<Models.ToolUser> ActiveUsers()
    {
        int unlimitedAccess;
        //string userAccountControl;
        string listEntry;
        string fName;
        string lName;
        string unlimitedAccessGroup;

//This is getting the List of Users that I need to filter
        List<Models.ToolUser> activeUserList = UIDal.GetFullWindowsUserList();

        try
        {
            string filter = "(&(objectCategory=person)(objectClass=user)(!userAccountControl:1.2.840.113556.1.4.803:=2))";
            string[] propertiesToLoad = new string[1] { "name" };

            using (DirectoryEntry de = GetDirectoryEntryWithGc())
            using (DirectorySearcher searcher = new DirectorySearcher(de, filter, propertiesToLoad))
            using (SearchResultCollection results = searcher.FindAll())
            {
                foreach (SearchResult result in results)
                {
                    unlimitedAccess = 0;
                    fName = result.Properties["givenName"][0].ToString();
                    lName = result.Properties["sn"][0].ToString();
                    listEntry = fName + " " + lName;

                    var name = result.Properties["sAMAccountName"][0].ToString();

                    var u = new ToolUser
                    {
                        ToolUserId = 0,
                        DomainAccount = result.Properties["sAMAccountName"][0].ToString(),
                        FirstName = fName,
                        LastName = lName,
                        LoginId = "pc-" + result.Properties["sAMAccountName"][0].ToString(),
                        UnlimitedAccess = unlimitedAccess > 0,
                    };

                    activeUserList.Add(u);
                }
            }
        }
        catch
        {
        }

        return activeUserList;
    }

空的 catch 块是魔鬼。 在继续之前,您至少应该记录异常。

在这种情况下,您的空 catch 块隐藏了真正发生的事情。 您在此处收到“索引超出范围”异常:

fName = result.Properties["givenName"][0].ToString();

因为result.Properties["givenName"]是一个空集合(索引0处没有元素)。 之所以会这样,是因为:

string[] propertiesToLoad = new string[1] { "name" };

您告诉搜索仅返回找到的对象的name属性,但随后您继续使用givenNamesnsAMAccountName 如果您打算使用它们,则需要告诉它返回这些属性:

string[] propertiesToLoad = new string[3] { "givenName", "sn", "sAMAccountName" };

也就是说, givenNamesn不是必需的属性。 如果这些属性在找到的任何帐户上为空,则它们根本不会出现在Properties集合中,您将再次遇到相同的异常。 因此,在尝试使用这些属性之前,您应该测试它们是否确实存在。 例如,如果属性不存在,这将检查变量并将其设置为空字符串:

fName = result.Properties.Contains("givenName") ? result.Properties["givenName"][0].ToString() : "";
lName = result.Properties.Contains("sn") ? result.Properties["sn"][0].ToString() : "";

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM