C# GroupPrincipal.FindByIdentity находит группу, но при использовании GetMembers выдает ошибку - такого объекта на сервере нет

Этот код работал хорошо в течение прошлого года, теперь он все еще работает, но у меня есть только 4 группы, которые генерируют эту ошибку...

код прост:

   using (var context = new PrincipalContext(ContextType.Domain, domName))
              {
                  foreach (string grp in myGroups)
                  {
                      using (var group = GroupPrincipal.FindByIdentity(context, IdentityType.Name, grp))
                      {
                          PrincipalSearchResult<Principal> usersList;

                          usersList = group.GetMembers(true);

                          int usersListCount = usersList.Count();
}}}

когда эти конкретные группы приходят на поиск, я получаю группу и вижу ее описание в переменной объекта группы, но при получении ее членов я получаю сообщение об ошибке:

base: "На сервере нет такого объекта.\r\n"

Код ошибки: -2147016656

Опять же, это происходит только с 4 определенными группами из одного домена и того же OU. это началось всего несколько дней назад, и я ничего не изменил, не разрешения, ничего в коде, очень странно...

есть идеи?

2 ответа

Когда я столкнулся с этой проблемой, у меня не могло быть пустой группы. Мне пришлось добиваться «наилучших возможных» результатов, пока сетевые специалисты работали над решением проблемы «чужого SID». Я знаю, что это многовато, но аудиторов это удовлетворило, так что, возможно, это поможет вам. Вот что я сделал:

  1. Предшественник: я уже создал класс, содержащий все свойства сущности AD.
  2. Получил список пользователей и все их членства в группах.
  3. Обернул вызов для получения участников в попытке... поймать, и когда произошла эта ошибка, я вставил свойство «Членство в группе» «Ошибка при получении участников».
  4. Когда я перебрал все группы, я получил список всех групп, у которых было сообщение об ошибке в качестве члена группы, а затем запросил список пользователей, чтобы получить список всех пользователей, которые были членами этой группы.
  5. Затем вставлены записи свойств с найденными именами пользователей.

Поскольку этот ответ больше касается структуры решения, я дам лишь очень краткое описание используемых классов. Хотя это было далеко не элегантно, он дал мне многоразовый контейнер, который было легко понять и которым можно было поделиться, а также решение, которое было устойчивым в нескольких сетях. Вероятно, во многом ему не хватает, но он проходит тест №1 — он сработал.

      public class ADPropEntry : IComparable<ADPropEntry>
{
        #region Properties
        public string Name { get { return _name; } set { _adName = value; SetPropVals(_adName); } }
        public string Value { get { return _v; } set { _v = value; DoValConversion(); } }
        public bool IsVisible { get { return _isVis; } set { _isVis = value; } }
        public string ConvertTo { get { return _convertVal; } set { _convertVal = value; } }
        public int ID { get { return _id; } set { _id = value; } }
        #endregion

        private void SetPropVals(string s)
        {
            switch (s)
            {
                case "accountexpires": _name = "Account Expires"; _isVis = false; _convertVal = "FromFileTime"; break;
                ... more handles each property conversion
            }
        }
    }
    public class ADEntity : IComparable<ADEntity>
    {
        #region Properties
        public string Name { get { return _name; } set { _name = value; } }
        public List<ADPropEntry> MyProperty { get { return _ade; } set { _ade = value; } }
        public string EntityType { get { return _entT; } set { _entT = value; } }
        public string ADName { get { return GetProperty("SAM Account Name"); } }
        #endregion
    }

Эта форма предоставила мне надежный контейнер данных, а затем я использовал другой класс для запросов к AD любым удобным для меня методом. Это было упаковано в DLL, которую могло использовать клиентское приложение.

          class ADAccess
    {
        #region Properties
        public bool HasErrors { get { return (bool)(_errMsg.Length > 10); } }
        public string ErrorMsg { get { return _errMsg; } }
        public List<ADEntity> GroupEntries { get { return _lstGrps; } }
        public List<ADEntity> UserEntries { get { return _lstUsrs; } }
        public List<ADEntity> PrinterEntries { get { return _lstPrts; } }
        public List<ADEntity> ComputerEntries { get { return _lstCmps; } }
        #endregion
    
    public List<ADEntity> GetADListByMSO(string groupType)
    {
        if (groupType == "")
        {
             // get them all return an empty list populating properties
        }
        else
        {
             // set the context and fetch return populated list
        }
    }

Та же структура использовалась для отчетов о разрешениях SQL-сервера.

Я выяснил проблему, проблемные группы содержали пользователей из разных доменов, однажды удалив этих пользователей из групп, все вернулось к работе. Благодарю.

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