Расширение свойств GroupPrincipal и Members

Я хочу расширить класс GroupPrincipal для обработки некоторых пользовательских свойств:

using System.DirectoryServices.AccountManagement;

[DirectoryRdnPrefix("CN")]
[DirectoryObjectClass("group")]
public class MyGroupPrincipal : GroupPrincipal {
    // ...
}

Как я могу переопределить свойство Members для MyGroupPrincipal, чтобы при наличии члена, являющегося группой, возвращался экземпляр MyGroupPrincipal, а не GroupPrincipal? Я хотел бы написать, например.

MyGroupPrincipal group = GetGroup();
foreach (var m in group.Members) {
    if (m is MyGroupPrincipal) { // always fails: m is a normal GroupPrincipal 
        // do something
    }
}

person Paolo Tedesco    schedule 19.04.2010    source источник


Ответы (1)


Невозможно напрямую переопределить свойство Members объекта GroupPrincipal. Вместо этого вы можете использовать свой собственный метод (извините за отсутствие чистого кода, но я использовал части описанного ниже решения в своем коде).

Я обнаружил, что много раз с библиотекой AccountManagement вам просто нужно использовать базовый DirectoryEntry, чтобы все было сделано правильно. Вы можете получить доступ к базовому объекту, используя group.GetUnderlyingObject(), а затем прочитать членство, повторив deGroup.Properties("member"). Прочитайте тип каждого члена (не могу вспомнить имя свойства, может быть, 'member.SchemaClassName'?) и различающееся имя (member.Properties("distinguishedName")(0).ToString()). Затем создайте оператор переключения на основе типа, где вы создаете каждого принципала, используя различающееся имя MyGroupPrincipal.FindByIdentity(context, distinguishedName), и сделайте то же самое для пользователи и тд...

person Peter    schedule 19.04.2011