DirectoryEntry Invoke ("Members", null) не получает все элементы - PullRequest
1 голос
/ 11 октября 2019

У меня есть группа ActiveDirectory, которая называется AuditUsers, и в ней есть несколько членов.

Это мой код:

` DirectoryEntry de = new DirectoryEntry(ADSPath);
    DirectorySearcher deSearch = new DirectorySearcher(LDAP://CN=AuditUsers,OU=WEB Groups,OU=Groups,DC=doamin,DC=com);
    deSearch.Filter = "(&(objectCategory=person)(objectClass=user)(!userAccountControl:1.2.840.113556.1.4.803:=2))"; 
     object members = de.Invoke("Members", null);`

Так что этот член объекта не тянет всех пользователей, которые на самом деле являются его членами. Только некоторые участники появляются. Кто-нибудь знает, почему некоторые люди здесь отсутствуют, даже если они являются частью этой группы? Есть ли какие-либо ключевые поля в AD для тех, кто пропустил? userAccountControl - то же самое для тех участников, которые тянут и не тянут.

Спасибо

1 Ответ

0 голосов
/ 11 октября 2019

Вызов 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];
        }
    }
}
...