如何确定任意域\用户名是否在C#中扮演特定角色?

如何确定任意域\用户名是否在C#中扮演特定角色?,c#,active-directory,isinrole,C#,Active Directory,Isinrole,我对C#很陌生,所以请原谅我的无知。我需要测试用户(域\用户名)是否在特定组中,是的,这包括嵌套组 我发现WindowsPrincipal.IsInRole()在处理当前登录的用户时效果非常好。但我不是这样。我需要能够传入任意域\用户名或UPN(我将执行最容易实现的操作),如果它们是组X的成员,则返回true/false,即使它们只是组X的间接成员(例如:用户是组Y的成员,组Y是组X的成员) 我已经看过了WindowsIdentity,也许它对C#来说是新的,但我只是没有看到一种像Windows

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

我发现
WindowsPrincipal.IsInRole()
在处理当前登录的用户时效果非常好。但我不是这样。我需要能够传入任意域\用户名或UPN(我将执行最容易实现的操作),如果它们是组X的成员,则返回true/false,即使它们只是组X的间接成员(例如:用户是组Y的成员,组Y是组X的成员)

我已经看过了
WindowsIdentity
,也许它对C#来说是新的,但我只是没有看到一种像
WindowsIdentity(“MYDOMAIN\User1”)
这样的方法。是的,我做了,但从来没能让它发挥作用


使用C#,给定一个域\用户名,该用户名不是当前登录的用户,如何确定他们是否是域\组的成员?

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


这是我使用过的一个函数,可以正常工作,您应该可以使用它。您可能需要创建
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;
}
//
///检查中的用户是否为active directory组。
/// 
///可以包含域和用户名,也可以仅包含用户名
///(例如域\用户名或用户名)。如果未指定域,则默认值为
///使用域。
///要检查的Active directory组。仅限组名。不
///使用来自用户的域作为前导域。
/// 
public bool userIsInActiveDirectory组(字符串用户名,字符串组)
{
bool-isInGroup=false;
字符串user=“”;
字符串域=”;
//解析域外和用户以分离值
ParseUserDomain(用户名、出域、出用户);
if(string.IsNullOrEmpty(用户)||
string.IsNullOrEmpty(域)||
string.IsNullOrEmpty(组))
{
返回false;
}
使用(PrincipalContext ADContext=new PrincipalContext(ContextType.Domain,
域)
{
使用(GroupPrincipal principalGroup=
GroupPrincipal.FindByIdentity(ADContext,group))
{
if(principalGroup!=null)
{
使用(userprincipaluser=
UserPrincipal.FindByIdentity(ADContext,user))
{
//真实意味着深入的探索
var users=principalGroup.GetMembers(true);
isInGroup=users.Contains(ADPrincipalUser);
}
}
}
}
返回ISingGroup;
}

我在堆栈溢出中的一个类似条目中使用了一个名为。更改我在那里提供的代码可以让您做您想做的事情。

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

对我来说,成功的原因是:


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

Kelsey:我尝试过修改你的脚本,但它无法编译,当它击中用户时会抱怨。Contains()。表示错误5“System.DirectoryServices.AccountManagement.PrincipalSearchResult”不包含“Contains”的定义,并且找不到扩展方法“包含”接受类型为“System.DirectoryServices.AccountManagement.PrincipalSearchResult”的第一个参数(是否缺少using指令或程序集引用?)@Alan M您使用的是什么版本的C?您是否定义了以下
using
语句:
using System.Linq?我尝试了.NET Framework 2.0、3.5和4.0。这是在VisualStudio2010中。我没有包括System.Linq。我将把它绑在那里,然后试一试。@Alan M在我发布的示例中,我使用的是.NET 4.0和Linq。谢谢你的链接。虽然它没有让我得到我所希望的解决方案,但它确实包含了大量其他有用的内容。很抱歉,“Microsoft LDAP在目录搜索器筛选器中提供的特殊查询语法,用于递归获取用户直接或间接参与的所有组的列表”你的文章中描述的和我提供的样本中使用的是一样的,我将把这归因于我对C#缺乏经验。不管什么原因,我都能让它工作。