扩展 GroupPrincipal 和 Members 属性

发布于 2024-08-30 03:35:56 字数 624 浏览 13 评论 0原文

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

using System.DirectoryServices.AccountManagement;

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

如何重写 MyGroupPrincipalMembers 属性,以便它有一个成员这是一个组,返回的是 MyGroupPrincipal 的实例,而不是 GroupPrincipal 的实例?我想写例如

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

I want to extend the GroupPrincipal class to handle some custom properties:

using System.DirectoryServices.AccountManagement;

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

How could I override the Members property for MyGroupPrincipal so that if it has a member that is a group an instance of MyGroupPrincipal and not of GroupPrincipal is returned? I would like to write e.g.

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

无戏配角 2024-09-06 03:35:56

无法直接覆盖 GroupPrincipal 的 Members 属性。相反,您可以推出自己的方法(抱歉,没有干净的代码,但我在我的代码中使用了下面描述的解决方案的部分内容)。

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

There is no way to directly override the Members property of GroupPrincipal. Instead you can roll your own method (sorry for no clean cut code, but I've used portions of the below described solutiont through out my code).

I've found that many times with the AccountManagement library that you just have to use the base DirectoryEntry to get things done right. You can access the base object by using group.GetUnderlyingObject(), then read the membership by iterating deGroup.Properties("member"). Read each members type (can't remember the property name, maybe 'member.SchemaClassName'?) and distinguishedName (member.Properties("distinguishedName")(0).ToString()) Then create a switch statement based on type where you create each principal using the distinguished name MyGroupPrincipal.FindByIdentity(context, distinguishedName), and do the same for users, etc...

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文