Forum Clubic

Récupérer la liste des ordinateurs connectés au réseau en c#

Bonjour.

Je développe pour mon entreprise un petit programme en C# qui récupère la liste des ordinateurs connectés au réseau et qui inscrit dans un fichier .txt cette liste.

Le souci est que chez moi, le listage des ordinateurs fonctionne très bien, mais sur le réseau de l’entreprise, seul le nom NetBios de l’ordinateur sur lequel le programme est lancé figure sur le fichier. Or, via l’explorateur réseau, il m’est possible de voir l’ensemble des ordinateurs présents sur le réseau.

Donc si quelqu’un peut me dire où se trouve le problème dans le code si-dessous, je lui serais gré.



using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net.NetworkInformation;
using System.Net;
using System.Threading;

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

namespace Ordi_reseau
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            string[] computers = GetComputers();
            

            foreach (string computer in computers)
            {
                Console.WriteLine(computer);

                //Inscription des noms des ordis dans un fichier .txt

                
            }//foreach (string computer in computers)
            Console.Read();
            
            MessageBox.Show("Liste créée");
        }

        

	/**************************************************************************/
	/**************************************************************************/
	// récupèration des noms des ordis présents sur le réseau

	[StructLayout(LayoutKind.Sequential)]
        public struct _SERVER_INFO_100
        {
            internal int sv100_platform_id;
            [MarshalAs(UnmanagedType.LPWStr)]
            internal string sv100_name;
        }

        [DllImport("Netapi32", SetLastError = true), SuppressUnmanagedCodeSecurityAttribute]
        public static extern int NetApiBufferFree(IntPtr pBuf);

        [DllImport("Netapi32", CharSet = CharSet.Auto, SetLastError = true), SuppressUnmanagedCodeSecurityAttribute]
        public static extern int NetServerEnum(
            string ServerNane,
            int dwLevel,
            ref IntPtr pBuf,
            int dwPrefMaxLen,
            out int dwEntriesRead,
            out int dwTotalEntries,
            int dwServerType,
            string domain,
            out int dwResumeHandle
            );

        const int LVL_100 = 100;
        const int MAX_PREFERRED_LENGTH = -1;
        const int SV_TYPE_WORKSTATION = 1;
        const int SV_TYPE_SERVER = 2;

        /// <summary>
        /// Cette fonction est tirée d'une source trouvée ici => http://www.codeproject.com/cs/internet/ListNetworkComputers.asp
        /// </summary>
        public static string[] GetComputers()
        {
            ArrayList computers = new ArrayList();
            IntPtr buffer = IntPtr.Zero, tmpBuffer = IntPtr.Zero;
            int entriesRead, totalEntries, resHandle;
            int sizeofINFO = Marshal.SizeOf(typeof(_SERVER_INFO_100));

            try
            {
                int ret = NetServerEnum(null, LVL_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));
                        computers.Add(svrInfo.sv100_name);
                    }
                }
                else
                    throw new Win32Exception(ret);
            }
            finally
            {
                NetApiBufferFree(buffer);
            }


            return (string[])computers.ToArray(typeof(string));
        }//public static string[] GetComputers()
    }// public partial class Form1 : Form
}// namespace Ordi_reseau









Edité le 14/12/2010 à 18:57

Sans connaître le C#, je pense que ce que tu dois chercher ce sont les ordinateurs du domaine, et non du groupe de travail car il me semble que Windows fait une différence dessus.

Les ordis de l’entreprise ne sont pas sur un domaine (il y a trop de va et vient de portable pour mettre en place un domaine).

Il y a juste un portail captif, mais ça, c’est pour aller sur le net, donc inintéressant pour moi.

Bonsoir,

J’ai testé votre code dans mon lycée en utilisant un StreamWriter à la place du Console.WriteLine dans Form1_Load, et cela marche très bien.