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». Я знаю, что это многовато, но аудиторов это удовлетворило, так что, возможно, это поможет вам. Вот что я сделал:
- Предшественник: я уже создал класс, содержащий все свойства сущности AD.
- Получил список пользователей и все их членства в группах.
- Обернул вызов для получения участников в попытке... поймать, и когда произошла эта ошибка, я вставил свойство «Членство в группе» «Ошибка при получении участников».
- Когда я перебрал все группы, я получил список всех групп, у которых было сообщение об ошибке в качестве члена группы, а затем запросил список пользователей, чтобы получить список всех пользователей, которые были членами этой группы.
- Затем вставлены записи свойств с найденными именами пользователей.
Поскольку этот ответ больше касается структуры решения, я дам лишь очень краткое описание используемых классов. Хотя это было далеко не элегантно, он дал мне многоразовый контейнер, который было легко понять и которым можно было поделиться, а также решение, которое было устойчивым в нескольких сетях. Вероятно, во многом ему не хватает, но он проходит тест №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-сервера.
Я выяснил проблему, проблемные группы содержали пользователей из разных доменов, однажды удалив этих пользователей из групп, все вернулось к работе. Благодарю.