2

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

  • 组织
    • 1队
      • 大卫(用户)
  • 团体
    • 应用 A
      • 第一组(上组)

仅列出 David 的成员身份不会表明他是 Application A 组的成员。

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

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

让我知道是否可以澄清任何事情。

4

3 回答 3

3

添加对 DirectoryServices.AccountManagement 的引用

然后添加一条 using 语句:

using System.DirectoryServices.AccountManagement;

然后在您的主程序中(或其他地方,如果需要,调用程序 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。

于 2012-10-01T20:46:56.673 回答
1

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

于 2012-09-28T06:40:40.397 回答
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();

如果您不想检查子组,请传递falseGetMembers.

它不需要给定的用户必须登录。希望能帮助到你。

于 2012-09-28T07:08:50.357 回答