Active Directory, перечисляющий группы пользователей, исключение COM

#c# #.net #active-directory

#c# #.net #active-directory

Вопрос:

при перечислении групп текущего пользователя через AD .NET API я иногда получаю

 COMException: Unknown error (0x80005000)
  

Вот мой код :

         var userName = Environment.UserName;

        var context = new PrincipalContext(ContextType.Domain);
        var user = UserPrincipal.FindByIdentity(context, userName);

        foreach (var userGroup in user.GetGroups())
        {
            Console.WriteLine(userGroup.Name);
        }
  

В чем проблема? Я думал, что каждый пользователь может получить список СВОИХ групп?Это кажется странным поведением, иногда это может быть воспроизведено следующим образом: при запуске на ПК с ‘UserA’ происходит сбой, но он успешно перечисляет ДРУГИЕ группы ‘UserB’ (в разделе ‘UserA’)!

Комментарии:

1. Вызов чего-либо в Null вызовет исключение NullReferenceException, а не COMException, и да, пользователь не равен null, я упростил код (убрал проверку ошибок)

2. Кстати, нашел что-то в службе поддержки Microsoft, похоже, это известная проблема, я опубликую ссылку

Ответ №1:

Попробуйте использовать

 var context = new PrincipalContext(ContextType.Domain, "yourcompany.com", "DC=yourcompany,DC=com", ContextOptions.Negotiate);
  

Если для параметра ContextOption установлено значение Negotioate, клиент аутентифицируется с помощью Kerberos или NTLM, поэтому, даже если имя пользователя и пароль не указаны, API управления учетными записями привязывается к объекту с помощью контекста безопасности вызывающего потока.

Ответ №2:

У меня была такая же проблема, я решил ее, указав доменное имя при создании PrincipalContext :

 var domain = new PrincipalContext(ContextType.Domain, Environment.UserDomainName);
var user = UserPrincipal.FindByIdentity(domain, Environment.UserName);
  

Ответ №3:

0x80005000 = E_ADS_BAD_PATHNAME итак, вы где-то указали недопустимый adspath, может быть, вам нужно добавить LDAP:// префикс или противоположность делают это дважды? Установите точку останова и проверьте значение…

РЕДАКТИРОВАТЬ: AdsPath должен иметь значение типа «LDAP://CN=Administator,CN= Users, DC= contoso, DC = com», похоже, у вас неверный путь.

Комментарии:

1. Не могли бы вы, пожалуйста, предоставить более подробную информацию, какой путь, какое значение проверять?

2. ((Система. DirectoryServices. Управление учетными записями. Принципал)(пользователь)). DistinguishedName равно ‘CN =MyAccountName,OU= MyCompany Users, DC= mycompany, DC= local’ и это работает, на чужом компьютере это не работает

3. support.microsoft.com/kb/324433 — нашел это, но, похоже, это также не работает