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