1

我对 C# 真的很陌生,所以请原谅我的无知。我需要测试用户(域\用户名)是否在特定组中,是的,这包括嵌套组。

WindowsPrincipal.IsInRole()在与当前登录的用户打交道时,我发现效果非常好。但对我来说不是这样。我需要能够传入任意 DOMAIN\username 或 UPN(我会做最容易实现的那个),如果他们是 X 组的成员,则返回 true/false,即使他们只是 X 组的间接成员组 X(例如:用户是组 Y 的成员,组 Y 是组 X 的成员)。

我看过WindowsIdentity,也许它是 C# 的新手,但我只是没有看到一种方法来做类似WindowsIdentity("MYDOMAIN\User1"). 嗯,我做到了,但从来没有接近让它发挥作用。

使用 C#,给定一个 DOMAIN\username,它不是当前登录的用户,我如何确定他们是否是 DOMAIN\group 的成员?

4

4 回答 4

0

您可以为此使用 LDAP 查询。这是一篇好文章

Howto:(几乎)通过 C# 在 Active Directory 中的所有内容

于 2011-09-12T20:46:47.633 回答
0

这是我使用的一个有效的功能,您应该可以按原样使用它。您可能必须创建ParseUserDomain,但这很简单:

/// <summary>
/// Checks if a user in is a active directory group.
/// <summary>
/// <param name="username">Can contain the domain and username or just username
///    (eg. domain\username or username).  If no domain is specified, the default
///    domain is used.</param>
/// <param name="group">Active directory group to check.  Group name only.  No
///    leading domain as the domain from the user is used.</param>
/// <returns></returns>
public bool UserIsInActiveDirectoryGroup(string username, string group)
{
    bool isInGroup = false;
    string user = "";
    string domain = "";
    // Parses off domain and user to seperate values
    ParseUserDomain(username, out domain, out user);   

    if (string.IsNullOrEmpty(user) ||
        string.IsNullOrEmpty(domain) ||
        string.IsNullOrEmpty(group))
    {
        return false;
    }

    using (PrincipalContext ADContext = new PrincipalContext(ContextType.Domain,
        domain))
    {
        using (GroupPrincipal principalGroup = 
            GroupPrincipal.FindByIdentity(ADContext, group))
        {
            if (principalGroup != null)
            {
                using (UserPrincipal ADPrincipalUser = 
                    UserPrincipal.FindByIdentity(ADContext, user))
                {
                    // True means deep search
                    var users = principalGroup.GetMembers(true);
                    isInGroup = users.Contains(ADPrincipalUser);
                }
            }
        }
    }
    return isInGroup;
}
于 2011-09-12T20:53:45.510 回答
0

我使用 C#在 Stack Overflow 中名为Find Recursive Group Membership (Active Directory)的类似条目中回答了递归查询。更改我在那里提供的代码可以让你做你想做的事。

于 2011-09-13T04:04:34.877 回答
0

回答自己的问题:我尝试了提出的解决方案,而不是让它们起作用。请注意,我 100% 确定这是由于我对 C# 缺乏经验,与评论者发布的内容无关。爱并感谢所有提供帮助的评论者。

对我有用的是:http ://ddkonline.blogspot.com/2010/05/how-to-recursively-get-group-membership.html

我确实必须做一些基本的调整以使上述解决方案适合我的情况(例如更改 LDAP 参数),但它基本上是有效的。如果是组成员,则返回 true,否则返回 false。我希望这可以为未来的搜索者节省一些头发,因为我已经失去了一把。再次感谢所有发布帮助的人。

于 2011-09-13T19:34:03.603 回答