[英]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
属性,但随后您继续使用givenName
、 sn
和sAMAccountName
。 如果您打算使用它们,则需要告诉它返回这些属性:
string[] propertiesToLoad = new string[3] { "givenName", "sn", "sAMAccountName" };
也就是说, givenName
和sn
不是必需的属性。 如果这些属性在找到的任何帐户上为空,则它们根本不会出现在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.