2

我想扩展GroupPrincipal类来处理一些自定义属性:扩展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

没有办法直接覆盖GroupPrincipal的Members属性。相反,你可以推出你自己的方法(对不起,没有干净的代码,但我已经使用了我的代码中的下述解决方案的一部分)。

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