Вопрос по ldap, c#, active-directory – Список всех компьютеров в активном каталоге

11

Мне интересно, как получить список всех компьютеров / компьютеров / ПК из активного каталога?

(Попытка сделать эту страницу приманкой поисковой системы, ответит сам. Если у кого-то есть лучший ответ, я приму это)

Ваш Ответ

3   ответа
24

Если у вас очень большой домен или в вашем домене настроены ограничения на количество возвращаемых элементов за поиск, вам, возможно, придется использовать пейджинг.

using System.DirectoryServices;  //add to references

public static List GetComputers()
{
    List ComputerNames = new List();

    DirectoryEntry entry = new DirectoryEntry("LDAP://YourActiveDirectoryDomain.no");
    DirectorySearcher mySearcher = new DirectorySearcher(entry);
    mySearcher.Filter = ("(objectClass=computer)");
    mySearcher.SizeLimit = int.MaxValue;
    mySearcher.PageSize = int.MaxValue;

    foreach(SearchResult resEnt in mySearcher.FindAll())
    {
        //"CN=SGSVG007DC"
        string ComputerName = resEnt.GetDirectoryEntry().Name;
        if (ComputerName.StartsWith("CN="))
            ComputerName = ComputerName.Remove(0,"CN=".Length);
        ComputerNames.Add(ComputerName);
    }

    mySearcher.Dispose();
    entry.Dispose();

    return ComputerNames;
}
1

Запрос LDAP, такой как:(objectCategory=computer) должен сделать свое дело.

7

EKS предложилправильный, но выполняет немногомедленный.

Причиной этого является призыв кGetDirectoryEntry() на каждый результат. Это создаетDirectoryEntry объект, который нужен только если вам нужно изменить объект Active Directory (AD). Это'Хорошо, если ваш запрос вернет один объект, но при перечислении всех объектов в AD это значительно снижает производительность.

Если вам нужно только запросить AD, лучше просто использоватьProperties коллекция объекта результата. Это улучшит производительность кода в несколько раз.

Это объясняется вдокументация дляSearchResult учебный класс:

ЭкземплярыSearchResult класс очень похож на экземплярыDirectoryEntry учебный класс. Принципиальное отличие состоит в том, чтоDirectoryEntry класс извлекает свою информацию из иерархии доменных служб Active Directory при каждом доступе к новому объекту, тогда как данные дляSearchResult уже доступен вSearchResultCollectionгде он возвращается из запроса, который выполняется сDirectorySearcher учебный класс.

Вотпример о том, как использоватьProperties коллекция:

public static List GetComputers()
{
    List computerNames = new List();

    using (DirectoryEntry entry = new DirectoryEntry("LDAP://YourActiveDirectoryDomain.no")) {
        using (DirectorySearcher mySearcher = new DirectorySearcher(entry)) {
            mySearcher.Filter = ("(objectClass=computer)");

            // No size limit, reads all objects
            mySearcher.SizeLimit = 0;

            // Read data in pages of 250 objects. Make sure this value is below the limit configured in your AD domain (if there is a limit)
            mySearcher.PageSize = 250; 

            // Let searcher know which properties are going to be used, and only load those
            mySearcher.PropertiesToLoad.Add("name");

            foreach(SearchResult resEnt in mySearcher.FindAll())
            {
                // Note: Properties can contain multiple values.
                if (resEnt.Properties["name"].Count > 0)
                {
                    string computerName = (string)resEnt.Properties["name"][0];
                    computerNames.Add(computerName);
                }
            }
        }
    }

    return computerNames;
}

Документация дляSearchResult.Properties

Обратите внимание, что свойства могут иметь несколько значений, поэтому мы используемProperties["name"].Count проверить количество значений.

Чтобы улучшить ситуацию еще больше, используйтеPropertiesToLoad коллекция, чтобы дать искателю знать, какие свойства вы собираетесь использовать заранее. Это позволяет искателю только читать данные, которые фактически будут использоваться.

Обратите внимание, чтоDirectoryEntry а такжеDirectorySearcher объекты должны быть правильно расположены, чтобы высвободить все используемые ресурсы. Лучше всего сделать сusing пункт.

Похожие вопросы