Home / Programmazione / C# - Asp.NET / Identificare i nomi dei pc connessi in rete in C#
Mattepuffo

Identificare i nomi dei pc connessi in rete in C#

Identificare i nomi dei pc connessi in rete in C#

Oggi vediamo un pò di codice C# per identificare i computer connessi alla nostra rete.

Faremo uso delle NetApi32.dll, che sono scritte in C++ ma che possiamo tranquillamente integrare nel nostro progetto in C#.

Qua sotto tutto il codice; ammetto che mi sono fatto prendere un pò dalla pirgrizia questa volta: ho preso spunto da questo ottimo esempio e non l'ho "messo a posto".

Quindi vi ritrovate tutto in una classe insieme al main.

Ecco qua:

using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using System.Security;

namespace Test
{
    class Program
    {
        static void Main(string[] args)
        {
            List list = getNetworkComputers();
            foreach (String str in list)
            {
                Console.WriteLine(str);
            }
        }

        [DllImport("Netapi32", CharSet = CharSet.Auto, SetLastError = true), SuppressUnmanagedCodeSecurity]
        public static extern int NetServerEnum(
            string ServerNane, // must be null
            int dwLevel,
            ref IntPtr pBuf,
            int dwPrefMaxLen,
            out int dwEntriesRead,
            out int dwTotalEntries,
            int dwServerType,
            string domain, // null for login domain
            out int dwResumeHandle
);
        [DllImport("Netapi32", SetLastError = true), SuppressUnmanagedCodeSecurity]
        public static extern int NetApiBufferFree(IntPtr pBuf);
        [StructLayout(LayoutKind.Sequential)]
        public struct _SERVER_INFO_100
        {
            internal int sv100_platform_id;
            [MarshalAs(UnmanagedType.LPWStr)]
            internal string sv100_name;
        }

        public static List getNetworkComputers()
        {
            List networkComputers = new List();
            const int MAX_PREFERRED_LENGTH = -1;
            int SV_TYPE_WORKSTATION = 1;
            int SV_TYPE_SERVER = 2;
            IntPtr buffer = IntPtr.Zero;
            IntPtr tmpBuffer = IntPtr.Zero;
            int entriesRead = 0;
            int totalEntries = 0;
            int resHandle = 0;
            int sizeofINFO = Marshal.SizeOf(typeof(_SERVER_INFO_100));
            try
            {
                int ret = NetServerEnum(null, 100, ref buffer,
                    MAX_PREFERRED_LENGTH,
                    out entriesRead,
                    out totalEntries, SV_TYPE_WORKSTATION |
                    SV_TYPE_SERVER, null, out
                    resHandle);
                if (ret == 0)
                {
                    for (int i = 0; i < totalEntries; i++)
                    {
                        tmpBuffer = new IntPtr((int)buffer + (i * sizeofINFO));
                        _SERVER_INFO_100 svrInfo = (_SERVER_INFO_100)Marshal.PtrToStructure(tmpBuffer, typeof(_SERVER_INFO_100));
                        networkComputers.Add(svrInfo.sv100_name);
                    }
                }
            }
            catch (Exception ex)
            {
                return null;
            }
            finally
            {
                NetApiBufferFree(buffer);
            }
            return networkComputers;
        }
    }
}

Sostanzialmente questo codice fa tutto da solo, e a me personalmente serve solo questo.

Una volta lanciato, verrà mostrata tutta la lista dei nomi dei pc della rete locale.

Vi consiglio di approfondire un pò lo studio perchè è interessante.

Enjoy!