LDAP 查询 return 组中的所有用户

LDAP query to return all users in a group

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

对于给定组的 objectguid 下面的代码 return 是该组中的用户。然而他们都在形式...

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;
}

关于如何从特定 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<string> 中,然后使用 [=20] 查找用户 SID =] class.

    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