我很擅长使用C#,这是我第二次在活动目录中使用它。我不断收到错误:对象引用未设置为对象的实例。以下是我的代码。我知道我的空引用在var result = searcher.FindOne();
行中我不确定我需要做些什么来解决这个问题。
static void Main(string[] args)
{
List<string> userList = new List<string>();
try
{
string[] newUsers = { List of users is here ex: jsmith@xyz.com, bsmith@xyz.com, ... };
PrincipalContext AD = new PrincipalContext(ContextType.Domain, "xyz.com");
UserPrincipal u = new UserPrincipal(AD);
PrincipalSearcher search = new PrincipalSearcher(u);
DirectorySearcher searcher = new DirectorySearcher();
foreach (string x in newUsers)
{
searcher.Filter = string.Format("(&(objectCategory=person)(anr={0}))", x);
var result = searcher.FindOne();
userList.Add(string.Format("{0} {1}", result.Properties["DisplayName"][0].ToString(), result.Properties["Company"][0].ToString()));
search.Dispose();
}
foreach(string y in userList)
{
Console.WriteLine(y);
}
Console.ReadLine();
}
catch (Exception e)
{
Console.WriteLine("Error: " + e.Message);
}
File.WriteAllLines(file location, userList);
}
答案 0 :(得分:0)
正如一些评论者所指出的那样,您的代码未处理DirectorySearcher.FindOne
未找到用户的情况 - 如果没有用户,则as noted in the MSDN documentation,FindOne
会返回null
找到了:
如果在搜索过程中找到多个条目,则仅返回第一个条目。如果未找到与搜索条件匹配的条目,则返回空引用(在Visual Basic中为Nothing)。
因此,您需要处理您所寻找的用户不在的情况:
foreach (string x in newUsers)
{
Console.WriteLine("looking for user {0}", x);
searcher.Filter = string.Format("(&(objectCategory=person)(anr={0}))", x);
var result = searcher.FindOne();
if (result == null)
{
userList.Add(String.Format("user {0} not found!", x));
}
else
{
userList.Add(string.Format("{0} {1}", result.Properties["DisplayName"][0].ToString(), result.Properties["Company"][0].ToString()));
}
search.Dispose();
}
答案 1 :(得分:0)
您的问题是,您正在宣布PrincipalSearcher
和DirectorySearcher
,但您只是使用PrincipalSearcher
对象填充UserPrincipal
。
...
UserPrincipal u = new UserPrincipal(AD);
PrincipalSearcher search = new PrincipalSearcher(u);
...
但是,您的DirectorySearcher
对象searcher
为空。
DirectorySearcher searcher = new DirectorySearcher();
在foreach
循环中,您使用DirectorySearcher
对象而不是PrincipalSearcher
搜索一位用户:
var result = searcher.FindOne();
以上行始终会返回null
。您需要填充DirectorySearcher
。
DirectorySearcher searcher = new DirectorySearcher(/*need a DirectoryEntry*/);
我建议你充分利用UserPrincipal
课程。您似乎想要在Active Directory
中搜索用户,并且您知道他们的UserPrincipal
名称。
using (PrincipalContext ctx = new PrincipalContext(ContextType.Domain, "yourdomain.com"))
{
string [] newUsers; //need to declare list of new users
foreach (string user in newUsers)
{
using (UserPrincipal newUser = UserPrincipal.FindByIdentity(ctx, IdentityType.UserPrincipalName, user))
{
if (newUser != null)
{
//do what you need to do
//newUser will contain all info on a particular user
}
}
}
}