Alvi

📅 2026-03-24T17:18:48.918Z
👁️ 21 katselukertaa
🔓 Julkinen


using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.DirectoryServices;
using System.Net.NetworkInformation;
using System.Net;
using System.Threading.Tasks;

public class NetworkScanner
{
    public class OnlinePC
    {
        public string Hostname { get; set; }
        public string IPAddress { get; set; }
    }

    public static async Task<List<OnlinePC>> GetOnlineDomainComputersAsync()
    {
        var onlinePCs = new ConcurrentBag<OnlinePC>();
        var computerNames = GetAllDomainComputers();

        var tasks = new List<Task>();

        foreach (var name in computerNames)
        {
            tasks.Add(Task.Run(async () =>
            {
                try
                {
                    using (Ping ping = new Ping())
                    {
                        var reply = await ping.SendPingAsync(name, 1000);

                        if (reply.Status == IPStatus.Success)
                        {
                            onlinePCs.Add(new OnlinePC
                            {
                                Hostname = name,
                                IPAddress = reply.Address.ToString()
                            });
                        }
                    }
                }
                catch
                {
                    // Ignore failures (offline/unreachable)
                }
            }));
        }

        await Task.WhenAll(tasks);

        return new List<OnlinePC>(onlinePCs);
    }

    private static List<string> GetAllDomainComputers()
    {
        var computers = new List<string>();

        using (DirectoryEntry entry = new DirectoryEntry("LDAP://RootDSE"))
        {
            string defaultNamingContext = entry.Properties["defaultNamingContext"].Value.ToString();

            using (DirectoryEntry searchRoot = new DirectoryEntry($"LDAP://{defaultNamingContext}"))
            using (DirectorySearcher searcher = new DirectorySearcher(searchRoot))
            {
                searcher.Filter = "(objectClass=computer)";
                searcher.PropertiesToLoad.Add("name");

                foreach (SearchResult result in searcher.FindAll())
                {
                    if (result.Properties.Contains("name"))
                    {
                        computers.Add(result.Properties["name"][0].ToString());
                    }
                }
            }
        }

        return computers;
    }
}







var onlineMachines = await NetworkScanner.GetOnlineDomainComputersAsync();

foreach (var pc in onlineMachines)
{
    Console.WriteLine($"{pc.Hostname} - {pc.IPAddress}");
}