我想扩展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
}
}
最佳答案
无法直接覆盖GroupPrincipal的Members属性。相反,您可以滚动自己的方法(很抱歉,没有明确的代码,但是我在代码中使用了以下所述解决方案的某些部分)。
我发现,使用AccountManagement库很多次,您只需要使用基本DirectoryEntry即可正确完成工作。您可以使用group.GetUnderlyingObject()
访问基础对象,然后通过迭代deGroup.Properties("member")
读取成员资格。读取每个成员类型(不记得属性名称,也许是'member.SchemaClassName'?)和distinguishedName(member.Properties("distinguishedName")(0).ToString()
),然后根据类型创建一个switch语句,并在其中使用专有名称MyGroupPrincipal.FindByIdentity(context, distinguishedName)
创建每个主体。为用户做同样的事情,等等。