【问题标题】:Check if the windows user exists of one of the AD groups(ADgroup1, AD group2,ADgroup3 etc)检查其中一个 AD 组(ADgroup1、AD group2、ADgroup3 等)的 windows 用户是否存在
【发布时间】:2018-02-09 19:15:14
【问题描述】:

我目前有检查用户是否属于单个 AD 组的代码,但是如何检查此用户是否属于多个 AD 组。 下面是我必须检查单个组的代码

PrincipalContext ctx = new PrincipalContext(ContextType.Domain, Environment.UserDomainName);

        // find a user
        UserPrincipal user = UserPrincipal.FindByIdentity(ctx, Environment.UserName);

        // find the group in question
        GroupPrincipal group = GroupPrincipal.FindByIdentity(ctx, "ADGROUP1");

        if (user != null)
        {
            if (user.IsMemberOf(group))
            {
                //Enable certain Form Buttons and objects for IT Users
                authTbox.Visible = true;
            }
        }

如何检查同一用户是否属于 ADgroup2 、 ADGroup3 等。

我在论坛和谷歌搜索了这里,但找不到有效的解决方案。实现此目的的一种方法是定义多个组并在 if 子句中使用 OR 来检查所有组..见下文

前:

     GroupPrincipal group1 = GroupPrincipal.FindByIdentity(ctx, "ADGROUP1");
         GroupPrincipal group2 = GroupPrincipal.FindByIdentity(ctx, "ADGROUP2");
 if (user != null)
            {
                if (user.IsMemberOf(group) ||user.IsMemberOf(group1) || user.IsMemberOf(group2) )
                {
                    //Enable certain Form Buttons and objects for IT Users
                    authTbox.Visible = true;
                }
            }

由于我必须搜索 10 个这样的组,我只是想知道是否有有效的方法来实现这一目标。

【问题讨论】:

    标签: c# winforms active-directory


    【解决方案1】:

    将您想要的组放入ArrayList<T> 或其他IEnumerable<T> 容器并循环它们:

    List<GroupPrincipal> groupList = new List<GroupPrincipal>
    {
        GroupPrincipal.FindByIdentity(ctx, "ADGROUP1"),
        GroupPrincipal.FindByIdentity(ctx, "ADGROUP1")
        // ...
    }
    foreach(var group in groupList) 
    {
        if(user.IsMemberOf(group)
        {
            // do something
        }
    }
    

    这是最直接的。这样,您还可以在配置文件或数据库中定义每个组,并简单地获取您需要的一切。

    如果您需要简单的批量确认,可以使用Enumerable.All&lt;TSource&gt; 方法:

    List<GroupPrincipal> groupList = new List<GroupPrincipal>
    {
        GroupPrincipal.FindByIdentity(ctx, "ADGROUP1"),
        GroupPrincipal.FindByIdentity(ctx, "ADGROUP1")
        // ...
    }
    if(groupList.All(g => user.IsMemberOf(g)) 
    { 
        // do something 
    }
    

    作为一个小旁注:根据您的用例,您可能希望将控制元素设置为启用/禁用而不是可见性。这样你只需要维护一个界面布局。

    【讨论】:

    • 感谢您的回答,这正是我正在寻找的,将于本周一实施并回复您。我正在使用 button.enabled = true 登录成功,感谢您的注意。
    猜你喜欢
    • 2014-04-08
    • 1970-01-01
    • 1970-01-01
    • 2018-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-15
    • 2018-02-27
    相关资源
    最近更新 更多