首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在Active Directory中获取用户的组?(c#,asp.net)

如何在Active Directory中获取用户的组?(c#,asp.net)
EN

Stack Overflow用户
提问于 2011-03-15 17:50:20
回答 4查看 216.4K关注 0票数 116

我使用此代码来获取当前用户的组。但我想手动给用户,然后获取他的组。我该怎么做呢?

代码语言:javascript
复制
using System.Security.Principal;

public ArrayList Groups()
{
    ArrayList groups = new ArrayList();

    foreach (IdentityReference group in System.Web.HttpContext.Current.Request.LogonUserIdentity.Groups)
    {
        groups.Add(group.Translate(typeof(NTAccount)).ToString());
    }

    return groups;
}
EN

回答 4

Stack Overflow用户

发布于 2013-10-16 22:03:17

GetAuthorizationGroups()找不到嵌套组。要真正获取给定用户所属的所有组(包括嵌套组),请尝试以下操作:

代码语言:javascript
复制
using System.Security.Principal

private List<string> GetGroups(string userName)
{
    List<string> result = new List<string>();
    WindowsIdentity wi = new WindowsIdentity(userName);

    foreach (IdentityReference group in wi.Groups)
    {
        try
        {
            result.Add(group.Translate(typeof(NTAccount)).ToString());
        }
        catch (Exception ex) { }
    }
    result.Sort();
    return result;
}

我使用try/catch是因为在一个非常大的AD中,200个组中有2个是例外的,因为一些SID不再可用。( Translate()调用执行SID ->名称转换。)

票数 61
EN

Stack Overflow用户

发布于 2011-03-15 17:54:49

在AD中,每个用户都有一个属性memberOf。其中包含他所属的所有组的列表。

下面是一个小代码示例:

代码语言:javascript
复制
// (replace "part_of_user_name" with some partial user name existing in your AD)
var userNameContains = "part_of_user_name";

var identity = WindowsIdentity.GetCurrent().User;
var allDomains = Forest.GetCurrentForest().Domains.Cast<Domain>();

var allSearcher = allDomains.Select(domain =>
{
    var searcher = new DirectorySearcher(new DirectoryEntry("LDAP://" + domain.Name));

    // Apply some filter to focus on only some specfic objects
    searcher.Filter = String.Format("(&(&(objectCategory=person)(objectClass=user)(name=*{0}*)))", userNameContains);
    return searcher;
});

var directoryEntriesFound = allSearcher
    .SelectMany(searcher => searcher.FindAll()
        .Cast<SearchResult>()
        .Select(result => result.GetDirectoryEntry()));

var memberOf = directoryEntriesFound.Select(entry =>
{
    using (entry)
    {
        return new
        {
            Name = entry.Name,
            GroupName = ((object[])entry.Properties["MemberOf"].Value).Select(obj => obj.ToString())
        };
    }
});

foreach (var item in memberOf)
{
    Debug.Print("Name = " + item.Name);
    Debug.Print("Member of:");

    foreach (var groupName in item.GroupName)
    {
        Debug.Print("   " + groupName);
    }

    Debug.Print(String.Empty);
}
}
票数 11
EN

Stack Overflow用户

发布于 2020-05-07 19:23:46

我的解决方案是:

代码语言:javascript
复制
UserPrincipal user = UserPrincipal.FindByIdentity(new PrincipalContext(ContextType.Domain, myDomain), IdentityType.SamAccountName, myUser);
List<string> UserADGroups = new List<string>();            
foreach (GroupPrincipal group in user.GetGroups())
{
    UserADGroups.Add(group.ToString());
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5309988

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档