Расширение свойства GroupPrincipal и Members - PullRequest
2 голосов
/ 19 апреля 2010

Я хочу расширить класс 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
    }
}

1 Ответ

1 голос
/ 19 апреля 2011

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

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

...