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.

Другие вопросы по тегам