В вашем текущем коде вы должны проверить NULL
после вызова FindOne()
- он может вернуть значение NULL
, если не найдена соответствующая запись в каталоге.
См. Документы MSDN :
Если во время поиска найдено более одной записи, возвращается только первая запись. Если не найдено записей, соответствующих критериям поиска, возвращается нулевая ссылка (Ничего в Visual Basic).
Плюс, вы также должны всегда проверяйте на наличие свойства перед доступом к нему - оно может отсутствовать .....
Следовательно, ваш код должен выглядеть примерно так:
SearchResult result = searcher.FindOne();
if(result != null)
{
DirectoryEntry directoryEntry = result.GetDirectoryEntry();
if(directoryEntry.Properties["displayName"] != null &&
directoryEntry.Properties["displayName"].Length > 0)
{
string displayName = directoryEntry.Properties["displayName"][0].ToString();
if (!string.IsNullOrEmpty(displayName))
{
return displayName;
}
}
}
Но: если вы работаете в .NET 3.5 или новее, вы должны проверить пространство имен System.DirectoryServices.AccountManagement
, которое значительно упрощает работу с Active Directory.
Вы можете использоватьPrincipalSearcher
и принцип «запрос за примером» для поиска:
// create your domain context
PrincipalContext ctx = new PrincipalContext(ContextType.Domain);
// define a "query-by-example" principal - here, we search for a UserPrincipal
// and with the first name (GivenName) of "Bruce"
UserPrincipal qbeUser = new UserPrincipal(ctx);
qbeUser.SamAccountName = "whatever you're looking for.....";
// create your principal searcher passing in the QBE principal
PrincipalSearcher srch = new PrincipalSearcher(qbeUser);
// find all matches
foreach(var found in srch.FindAll())
{
// do whatever here - "found" is of type "Principal" - it could be user, group, computer.....
}
Если вы еще этого не сделали - обязательно прочитайте статью MSDN Управление принципами безопасности каталога в.NET Framework 3.5 , которая показывает, как наилучшим образом использовать новые функции в System.DirectoryServices.AccountManagement
. Конечно, в зависимости от ваших потребностей, вы можете указать другие свойства для этого запросапример пользователя, которого вы создаете:
Surname
(или фамилия) DisplayName
(обычно: имя + пробел + фамилия) SAM Account Name
- имя вашей учетной записи Windows / AD User Principal Name
- ваше имя в стиле «username@yourcompany.com»
Вы можете указать любое из свойств в UserPrincipal
и использовать их в качестве «запроса по примеру» для вашегоPrincipalSearcher
.