UserPrincipal.Current генерирует COMException от одного дня к следующему
Сегодня утром я начал замечать некоторые проблемы с некоторыми из моих программ, связанные с операциями чтения Active Directory. Я заметил, что все эти приложения (клиент и сервер) используют System.DirectoryServices.AccountManagement.UserPrincipal
класс для тех операций чтения, в то время как программы, все еще работающие правильно, используют System.DirectoryServices.DirectorySearcher
,
Поэтому, чтобы решить проблему, я создал очень простое консольное приложение.
class Program
{
static void Main(string[] args)
{
//this works great
Console.WriteLine($"Enviroment.Username:{Environment.UserName}");
//this works great
PrincipalContext pcFull = new PrincipalContext(ContextType.Domain, "my.company.de", "dc=my,dc=company,dc=de");
UserPrincipal upPrincipalContextFull = UserPrincipal.FindByIdentity(pcFull, Environment.UserName);
//this doesn't work at all
//Exception: “The specified directory service attribute or value does not exist”
PrincipalContext pc = new PrincipalContext(ContextType.Domain);
UserPrincipal upPrincipalContext = UserPrincipal.FindByIdentity(pc, Environment.UserName);
//this doesn't either, same exception
UserPrincipal upCurrent = UserPrincipal.Current;
Console.ReadKey();
}
}
Как вы можете видеть в комментариях, две последние операции не будут выполнены на каждом компьютере в домене, на котором я его тестировал, даже если они работали безупречно в течение нескольких лет. Следующее исключение происходит, когда я звоню UserPrincipal.Current
или же UserPrincipal.FindByIdentity(pc, Environment.UserName);
без указания Контейнера в PrincipalContext:
System.Runtime.InteropServices.COMException: “The specified directory service attribute or value does not exist”
Вот что я знаю:
- ни одно из приложений, которые внезапно перестали работать, не получало обновления в течение последних двух недель
- все эти приложения,
UserPrincipal.Current
СобственностиUserPrincipal.FindByIdentity
-Метод работал отлично вчера - Рабочие станции не получали обновления Windows или.Net за последнюю неделю
- Это явление не относится к одной рабочей станции, пользователю или ОС, но встречается у множества разных пользователей, на множестве разных машин под управлением Windows 7 или 10.
- Контроллеры домена получили обновления неделю назад. По-видимому, одно из этих обновлений имеет известную проблему с запросами LDAP: из-за дефекта в WLDAP32.DLL приложения, выполняющие поиск ссылок LDAP, могут использовать слишком много динамических TCP-портов. Кажется маловероятным, что это является причиной внезапных сбоев, потому что а) это исправление было установлено неделю назад, а проблемы возникли только сегодня, и б) предлагаемые обходные пути от Microsoft (перезапуск служб) не имеют никакого эффекта
Если у вас есть идеи, что могло вызвать такое поведение "за ночь", пожалуйста, поделитесь им со мной. Если это действительно связано с обновлением Windows, другие пользователи тоже скоро столкнутся с этой ошибкой!
Очевидно, я могу создавать обходные пути, поэтому мне не нужно использовать ошибочные методы и свойства, но я все равно должен знать, почему он вообще перестал работать.
Изменить: Для начала было бы полезно понять разницу междуpublic PrincipalContext(ContextType contextType);
а также public PrincipalContext(ContextType contextType, string name, string container);
, PrincipalContext, созданный без контейнера, все равно должен каким-то образом получить этот контейнер, не так ли?
Кроме того, если вы отрицаете мой вопрос, было бы очень интересно узнать, почему. В противном случае это трудно улучшить;)
1 ответ
По умолчанию PrincipalContext
поиск в контейнере "OU=Computers". Это терпит неудачу, если разрешение на чтение не установлено для Контейнера и вызовет исключение COM.