【问题标题】:LDAP query to return all users in a groupLDAP 查询以返回组中的所有用户
【发布时间】:2016-04-18 16:47:30
【问题描述】:

我正在编写一个 LDAP 接口,对于给定组的 objectguid,它必须返回这些组中所有用户的列表以及用户的 SID。

对于给定组的objectguid,下面的代码返回该组中的用户。但是它们都是形式...

CN=Chad Hutchins,OU=Contractors,DC=RM,DC=LOCAL

...但我需要用户的 SID 与上述字符串。有没有办法从一个组开始获取用户的 SID 并查询该组中的所有用户?

using System.DirectoryServices;

public void GetUsers(Guid groupId, string domain, string username, string password)
{
    var rootEntry = new DirectoryEntry("LDAP://" + domain);
    rootEntry.Username = username;
    rootEntry.Password = password;

    var searcher = new DirectorySearcher(rootEntry);
    searcher.Filter = @"(objectguid=" + ConvertGuidToOctectString(groupId) + ")";

    var groupResult = searcher.FindOne();
    foreach (DictionaryEntry prop in groupResult.Properties)
    {
        var key = (string)prop.Key;

        switch (key)
        {
            case "member":
                foreach (string name in groupResult.Properties[key])
                    Console.WriteLine(name);
                break;
        }
    }
}

private string ConvertGuidToOctectString(Guid guid)
{
    var byteGuid = guid.ToByteArray();
    var queryGuid = string.Empty;
    foreach (var b in byteGuid)
    {
        queryGuid += @"\" + b.ToString("x2");
    }
    return queryGuid;
}

【问题讨论】:

  • 你可以使用AccountManagement类吗?获取用户SID 真的很容易。如果没有,那么您可以将所有成员的所有DistinguishedName 存储在字符串列表中,然后按用户的DN 搜索用户,然后您可以检索SIDs

标签: .net active-directory ldap directoryservices


【解决方案1】:

对于如何从特定的 group 检索用户 SIDs,您几乎没有选择。

  1. AccountManagement 命名空间中使用GroupPrincipal

    public static List<string> GetUsersFromGroupByGroupID(string ID)
    {
        using (PrincipalContext ctx = new PrincipalContext(ContextType.Domain, "yourdomain.com")
        {
            using (GroupPrincipal group = GroupPrincipal.FindByIdentity(ctx, IdentityType.Guid, ID))
            {
                if (group != null)
                {
                    List<string> memberSIDs = new List<string>();
                    var members = group.GetMembers(true);
                    foreach(var member in members)
                    {
                        memberSIDs.Add(member.Sid.ToString());
                    }
                    return memberSIDs;
                }
            }
        }
        return null;
    }
    
  2. 您可以将查询中所有用户的DistinguishedName 存储到List&lt;string&gt; 中,然后使用UserPrincipal 类查找用户SID

    public static List<string> GetUserSIDs(List<string>userDNs)
    {
        List<string> userSIDs = new List<string>();
        using (PrincipalContext ctx = new PrincipalContext(ContextType.Domain, "yourdomain.com"))
        {
            foreach(string userDN in userDNs)
            {
                using (UserPrincipal user = UserPrincipal.FindByIdentity(ctx, IdentityType.DistinguishedName, userDN))
                {
                    if (user != null)
                    {
                        userSIDs.Add(user.Sid.ToString());
                    }
                }
            }
        }
        return userSIDs;
    }
    
  3. 最后一个选项您仍然可以从您的查询中获取DistiniguishedName 的列表并仍然使用DirectoryEntry

    using (DirectoryEntry entry = new DirectoryEntry("LDAP://userDistinguishedName")
    {
        var userSID = entry.Properties["objectSID"][0];
    }
    

注意* 在这种情况下,userSID 将返回为 byte[] array

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多