С помощью C# получить список компьютеров из Active Directory по диапазону IP адресов

В коде ниже выводится весь список компьютеров из Active Directory, но мне нужен список согласно диапазона IP адресов. Что изменить в коде, чтобы выводились компьютеры от 10.62.39.66 до 10.62.39.69

private void button1_Click(object sender, EventArgs e)
    {
        // Разделяем IP-адреса на октеты
        string[] octets1 = ipAddressControl1.Text.Split('.');
        string[] octets2 = ipAddressControl2.Text.Split('.');
        // Проверка на совпадение первых трех октетов
        if (octets1[0] == octets2[0] &&
            octets1[1] == octets2[1] &&
            octets1[2] == octets2[2])
        {
            // Проверка, что 4-й октет первого IP меньше 4-го октета второго IP
            if (int.Parse(octets1[3]) < int.Parse(octets2[3]))
            {
                List<string> computers = GetComputersByIPRange(ipAddressControl1.Text, ipAddressControl2.Text);
                foreach (string computer in computers)
                {
                    Console.WriteLine(computer);
                }
            }
            else
            {
                MessageBox.Show("Первые три октета совпадают, но 4-й октет первого IP не меньше 4-го октета второго IP.");
            }
        }
        else
        {
            MessageBox.Show("Первые три октета IP-адресов не совпадают.");
        }
    }
    private List<string> GetComputersByIPRange(string startIP, string endIP)
    {
        List<string> computers = new List<string>();
        // Создаем DirectorySearcher для поиска компьютеров в Active Directory
        DirectorySearcher searcher = new DirectorySearcher();
        searcher.Filter = "(&(objectClass=computer))";
        searcher.PropertiesToLoad.Add("cn");
        // Выполняем поиск и получаем список компьютеров
        SearchResultCollection results = searcher.FindAll();
        foreach (SearchResult result in results)
        {
            string computerName = (string)result.Properties["cn"][0];
            computers.Add(computerName);
        }
        return computers;
    }

Изменяю эту строку на

searcher.Filter = "(&(objectClass=computer)(ipAddress>='" + startIP + "')(ipAddress<='" + endIP + "'))";

то тоже ничего не происходит.


Ответы (1 шт):

Автор решения: rotabor

Попробуйте это (но не было возможности проверить; и вставьте свой домен):

using System;
using System.Linq;
using System.Collections.Generic;
using System.DirectoryServices;
static class Program {
    static bool IpAddressInRange(string lal, string ipa, string ual) {
        var ip = string.Join("", ipa.Split('.').Select(s => s.PadLeft(3, '0')));
        return string.Compare(lal, ip) < string.Compare(ual, ip);
    }
    static List<string> GetComputersByIPRange(string lal, string ual ) {
        using (var de = new DirectoryEntry("LDAP://YourActiveDirectoryDomain.no"))
            using (DirectorySearcher searcher = new DirectorySearcher(de) {
                    Filter = "(objectClass=computer)",
                    SizeLimit = int.MaxValue,
                    PageSize = int.MaxValue }) {
                searcher.PropertiesToLoad.AddRange(new string[]{"cn", "IPv4Address"});
                return ((IEnumerable<SearchResult>)searcher.FindAll())
                    .Select(s => new {Cn = (string)s.Properties["cn"][0],
                        Ip = (string)s.Properties["IPv4Address"][0]})
                    .Where(w => IpAddressInRange(lal, w.Ip, ual))
                    .Select(s => s.Cn).ToList();
            }
    }
    static void Main() {
        GetComputersByIPRange("010062039066", "010062039069")
            .Select(s => { Console.WriteLine(s); return 0; } );
    }
}
→ Ссылка