Partages Réseau

Signaler
Messages postés
14
Date d'inscription
lundi 23 février 2004
Statut
Membre
Dernière intervention
24 août 2006
-
Messages postés
14
Date d'inscription
lundi 23 février 2004
Statut
Membre
Dernière intervention
24 août 2006
-
Salut,

j'aurai aimé savoir de quelle façon je pourrai lister les différents partages présents sur les machines d'un réseau en C#.

J'avais pensé à récupérer les adresses ip des machines se trouvant sur
le même réseau que la machine sur laquelle on lance l'application mais
après comment trouver les dossiers partagés ?



Merci d'avance.

9 réponses

Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
92
Salut,

Tu dois te servir de la méthode NetShareEnum des API.

/*
coq
MVP Visual C#
*/
Messages postés
14
Date d'inscription
lundi 23 février 2004
Statut
Membre
Dernière intervention
24 août 2006

Merci !

Par contre quelle(s) directive(s) utiliser ? Car à l'éxécution de mon programme, l'erreur suivante m'est renvoyée:



"The type or namespace name 'DWORD' could not be found (are your missing a using directive or an assemblye reference ?)"



Il en est de même pour LPTSRT, TCHAR et NET_API_STATUS.



J'ai beau chercher sur le net, je ne trouve que les librairies à
inclure en C++ (include <lm.h>) mais jamais la correspondance en
C#.
Messages postés
14
Date d'inscription
lundi 23 février 2004
Statut
Membre
Dernière intervention
24 août 2006

Finalement , j'ai utilisé ça:



[DllImport("Netapi32.dll", CharSet=CharSet.Unicode)]

private static extern int NetShareEnum(

StringBuilder ServerName,

int level,

ref IntPtr bufPtr,

uint prefmaxlen,

ref int entriesread,

ref int totalentries,

ref int resume_handle

);



avec la diretive using System.Text.



Il me reste à résoudre le problème du type TCHAR
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
38
Salut, ton prototype managé est correct, quel est le problème avec le type TCHAR ?

Le type TCHAR corresponds à un char sur 1 octect dans un environnement Ansi et 2 octects dans un environnement Unicode, dans l'appel de platforme pour remplacer un tableau ou un pointeur de type TCHAR tu peux utiliser le type string ou StringBuilder c'est le paramètre CharSet de l'attribt DllImport qui definit comment marshaler le type char.
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
92
D'ailleurs ici tu peux mettre string pour ServerName, comme il est uniquement "In".

/*
coq
MVP Visual C#
*/
Messages postés
74
Date d'inscription
lundi 30 juin 2003
Statut
Membre
Dernière intervention
18 octobre 2006
2
Regarde à cette adresse il y a un example d'utilisation en
C"# : http://pinvoke.net/default.aspx/netapi32.NetShareEnum



AP
Messages postés
14
Date d'inscription
lundi 23 février 2004
Statut
Membre
Dernière intervention
24 août 2006

Voici finalement mon code .

Tout ceci s'exécute bien, il n'y a plus d'erreurs , cependant, rien ne s'affiche !!!





using System;

using System.Net;

using System.Text.RegularExpressions;

using System.Runtime.InteropServices;

using System.Text;









public class share{



[DllImport("Netapi32.dll", CharSet=CharSet.Unicode)]

private static extern int NetShareEnum(

String ServerName,

int level,

ref IntPtr bufPtr,

//uint prefmaxlen,

ref int entriesread,

ref int totalentries,

ref int resume_handle

);





public struct SHARE_INFO_2{





[MarshalAs(UnmanagedType.LPWStr)]

public string shi2_netname;

public uint shi2_type;

[MarshalAs(UnmanagedType.LPWStr)]

public string shi2_remark;

public Int32 shi2_permissions;

public Int32 shi2_max_uses;

public Int32 shi2_current_uses;

[MarshalAs(UnmanagedType.LPWStr)]

public string shi2_path;

[MarshalAs(UnmanagedType.LPWStr)]

public string shi2_passwd;

}









public static void Main () {



String Servername = null;

int level = 2;

//uint prefmaxlen =MAX_PREFERRED_LENGTH;

int entriesread=0;

int totalentries=0;

int resume_handle=0;

IntPtr bufPtr =IntPtr.Zero;



int ret= NetShareEnum(Servername,level,ref bufPtr,ref entriesread,ref totalentries,ref resume_handle);





IntPtr currentPtr = bufPtr;

for( int i =0; i< entriesread;i++)

{

SHARE_INFO_2
shio =
(SHARE_INFO_2)Marshal.PtrToStructure(currentPtr,typeof(SHARE_INFO_2));

Console.Out.WriteLine("Partage: "+shio.shi2_netname+"\n");



}









}



}
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
92
Normal : pas mal la mise en commentaire du paramètre...
Ce n'est pas une option, tu dois conserver la méthode tel quel...
Et tu ne dois pas non plus éliminer l'appel de NetApiBufferFree.

private const uint MAX_PREFERRED_LENGTH = 0xFFFFFFFF;

La ligne qui effectue le "mouvement" vers la structure duivante dans le buffer est importante elle aussi :
int nStructSize = Marshal.SizeOf(typeof(SHARE_INFO_2));
...
currentPtr = new IntPtr(currentPtr.ToInt32() + nStructSize);

/*
coq
MVP Visual C#
*/
Messages postés
14
Date d'inscription
lundi 23 février 2004
Statut
Membre
Dernière intervention
24 août 2006

Merci encore une fois Coq !!



using System;

using System.Net;

using System.Text.RegularExpressions;

using System.Runtime.InteropServices;

using System.Text;









public class share{



[DllImport("Netapi32.dll", CharSet=CharSet.Unicode)]

private static extern int NetShareEnum(

String ServerName,

int level,

ref IntPtr bufPtr,

uint prefmaxlen,

ref int entriesread,

ref int totalentries,

ref int resume_handle

);



[DllImport("Netapi32.dll", SetLastError=true)]

static extern int NetApiBufferFree(IntPtr Buffer);







public struct SHARE_INFO_2{





[MarshalAs(UnmanagedType.LPWStr)]

public string shi2_netname;

public uint shi2_type;

[MarshalAs(UnmanagedType.LPWStr)]

public string shi2_remark;

public Int32 shi2_permissions;

public Int32 shi2_max_uses;

public Int32 shi2_current_uses;

[MarshalAs(UnmanagedType.LPWStr)]

public string shi2_path;

[MarshalAs(UnmanagedType.LPWStr)]

public string shi2_passwd;

}









public static void Main () {





//private const uint MAX_PREFERRED_LENGTH = 0xFFFFFFFF;



String Servername = null;

int level = 2;

uint prefmaxlen = 368880;

int entriesread=0;

int totalentries=0;

int resume_handle=0;

IntPtr bufPtr =IntPtr.Zero;



int ret= NetShareEnum(Servername,level,ref
bufPtr,prefmaxlen,ref entriesread,ref totalentries,ref resume_handle);





IntPtr currentPtr = bufPtr;

int nStructSize = Marshal.SizeOf(typeof(SHARE_INFO_2));



for( int i =0; i< entriesread;i++)

{


SHARE_INFO_2 shio =
(SHARE_INFO_2)Marshal.PtrToStructure(currentPtr,typeof(SHARE_INFO_2));

Console.Out.WriteLine("Partage: "+shio.shi2_netname+"\n");

currentPtr = new IntPtr(currentPtr.ToInt32() + nStructSize);





}



NetApiBufferFree(bufPtr);





}



}