С помощью 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; } );
}
}