Вызов IADsGroup.Members
- это просто более сложный способ перечисления de.Properties["member"]
. Оба просто читают атрибут member
группы.
Но это не единственный способ, которым пользователь может быть участником. Я более подробно расскажу об этом в статье, которую я написал , но я подозреваю, что здесь происходит то, что группа используется в качестве основной группы для многих ваших пользователей. И это членство выполняется по-разному.
Если это так, то атрибут primaryGroupId
пользователей будет установлен на Относительный идентификатор (RID) группы. RID - это последний набор номеров в SID (который также можно получить из атрибута primaryGroupToken
группы). В статье, которую я написал о поиске всех членов группы , я включил пример того, как найти всех пользователей, у которых группа является основной. На моем сайте он возвращал DOMAIN \ username, но я изменил его здесь, чтобы он возвращал distinguishedName
, так что вы можете добавить то, что вы получите от этого, к тому, что вы получите от атрибута member
.
public static IEnumerable<string> GetPrimaryGroupMemberList(DirectoryEntry group) {
group.RefreshCache(new[] { "distinguishedName", "primaryGroupToken" });
var groupDn = (string) group.Properties["distinguishedName"].Value;
var ds = new DirectorySearcher(
new DirectoryEntry($"LDAP://{groupDn.Substring(groupDn.IndexOf("DC=", StringComparison.Ordinal))}"),
$"(&(objectClass=user)(primaryGroupId={group.Properties["primaryGroupToken"].Value}))",
new [] { "distinguishedName" })
{
PageSize = 1000
};
using (var primaryMembers = ds.FindAll()) {
foreach (SearchResult primaryMember in primaryMembers) {
yield return (string) primaryMember.Properties["distinguishedName"][0];
}
}
}