Это проблема с разрешением.
Когда вы запускаете консольное приложение, оно запускается с вашими учетными данными, например, как "ты".
Служба WCF работает где? В IIS? Скорее всего, он работает под отдельной учетной записью, которой не разрешено запрашивать Active Directory.
Вы можете либо попытаться заставить олицетворение WCF работать, чтобы передать ваши собственные учетные данные, либо указать имя пользователя / пароль при создании DirectoryEntry:
DirectoryEntry directoryEntry =
new DirectoryEntry("LDAP://someserver.contoso.com/DC=contoso,DC=com",
userName, password);
ОК, так что в конце концов это могут быть не учетные данные (как правило, это более чем в 80% случаев, которые я вижу).
Как насчет того, чтобы немного изменить свой код?
DirectorySearcher directorySearcher = new DirectorySearcher(directoryEntry);
directorySearcher.Filter = string.Format("(&(objectClass=user)(objectCategory=user) (sAMAccountName={0}))", username);
directorySearcher.PropertiesToLoad.Add("msRTCSIP-PrimaryUserAddress");
var result = directorySearcher.FindOne();
if(result != null)
{
if(result.Properties["msRTCSIP-PrimaryUserAddress"] != null)
{
var resultValue = result.Properties["msRTCSIP-PrimaryUserAddress"][0];
}
}
Моя идея такова: почему бы не сказать DirectorySearcher
сразу, какой атрибут вас интересует? Тогда вам не нужно делать еще один дополнительный шаг, чтобы получить полную DirectoryEntry
из результата поиска (должно быть быстрее), и, поскольку вы сказали поисковику каталогов найти это свойство, оно, безусловно, будет загружено в результат поиска. - поэтому, если оно не равно нулю (значение не установлено), вы сможете легко его получить.
Марк