简单的方法是从AD获得用户的角色?

时间:2012-09-28 06:29:19

标签: c# .net active-directory ldap

我正在编写一个独立的应用程序,在给定AD帐户名称的情况下,需要确定用户是否是特定组的成员。我在.NET(C#)中编写应用程序。 AD中的结构如下所示:

  • 组织
    • 第1队
      • David (用户)
    • 申请A.
      • 第1组(上面的组)

仅列出David的成员资格不会表明他是应用程序A组的成员。

我从Microsoft的文档中了解到(使用主体)我可以简单地使用IsInRole调用,但我找不到任何不需要David登录到计算机或运行执行检查的应用程序的情况。我认为我对安全模型的有限理解也在这里发挥作用。

有人可以指出我正确的方向吗?我正在寻找的是如何在C#中解决上述(参考,提示,片段)的提示,而不依赖于David必须运行任何应用程序。

如果有任何事情可以澄清,请告诉我。

3 个答案:

答案 0 :(得分:3)

添加对DirectoryServices.AccountManagement的引用

然后添加一个using语句:

using System.DirectoryServices.AccountManagement;

然后在您的主程序中(或在其他地方,如果需要,请调用Procedure IsMember:

string userName = "David";
string GroupName = "Team 1";
bool test = IsMember(userName, GroupName);

    public static bool IsMember(string UserName, string GroupName)
    {
        try
        {
            UserPrincipal user = UserPrincipal.FindByIdentity(
                new PrincipalContext(ContextType.Domain),
                UserName);

            foreach (Principal result in user.GetAuthorizationGroups())
            {
                if (string.Compare(result.Name, GroupName, true) == 0)
                    return true;
            }
            return false;
        }
        catch (Exception E)
        { 
            throw E; 
        }
    }

如果David在Team 1中,则该过程将返回true,否则返回false。

答案 1 :(得分:1)

您可以使用UserPrincipal.FindByIdentity从目录中获取UserPrincipal对象。这与您可能找到的其他主要对象不完全相同,但它具有IsMemberOf方法,允许您查询组成员资格。

答案 2 :(得分:0)

我在AD环境中使用它

var pc = new PrincipalContext(ContextType.Domain);
var group = GroupPrincipal.FindByIdentity(pc, "GROUPNAME");
var existsInGroup = group.GetMembers(true).Where(p => p.UserPrincipalName == "username@domain").Any();

如果您不想查看子群组,请将false传递给GetMembers

不要求给定用户必须登录。希望它有所帮助。