我想扩展GroupPrincipal类以处理一些自定义属性:

using System.DirectoryServices.AccountManagement;

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


如何覆盖MembersMyGroupPrincipal属性,以便如果它的成员是一个组,则返回MyGroupPrincipal而不是GroupPrincipal的实例?我想写例如

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

最佳答案

无法直接覆盖GroupPrincipal的Members属性。相反,您可以滚动自己的方法(很抱歉,没有明确的代码,但是我在代码中使用了以下所述解决方案的某些部分)。

我发现,使用AccountManagement库很多次,您只需要使用基本DirectoryEntry即可正确完成工作。您可以使用group.GetUnderlyingObject()访问基础对象,然后通过迭代deGroup.Properties("member")读取成员资格。读取每个成员类型(不记得属性名称,也许是'member.SchemaClassName'?)和distinguishedName(member.Properties("distinguishedName")(0).ToString()),然后根据类型创建一个switch语句,并在其中使用专有名称MyGroupPrincipal.FindByIdentity(context, distinguishedName)创建每个主体。为用户做同样的事情,等等。

10-08 09:04