Partages Réseau

cs_mamounette Messages postés 14 Date d'inscription lundi 23 février 2004 Statut Membre Dernière intervention 24 août 2006 - 19 nov. 2005 à 19:35
cs_mamounette Messages postés 14 Date d'inscription lundi 23 février 2004 Statut Membre Dernière intervention 24 août 2006 - 20 nov. 2005 à 14:14
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

cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
19 nov. 2005 à 19:53
Salut,

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

/*
coq
MVP Visual C#
*/
0
cs_mamounette Messages postés 14 Date d'inscription lundi 23 février 2004 Statut Membre Dernière intervention 24 août 2006
20 nov. 2005 à 00:09
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#.
0
cs_mamounette Messages postés 14 Date d'inscription lundi 23 février 2004 Statut Membre Dernière intervention 24 août 2006
20 nov. 2005 à 01:29
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
0
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
20 nov. 2005 à 06:55
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.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
20 nov. 2005 à 11:17
D'ailleurs ici tu peux mettre string pour ServerName, comme il est uniquement "In".

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



AP
0
cs_mamounette Messages postés 14 Date d'inscription lundi 23 février 2004 Statut Membre Dernière intervention 24 août 2006
20 nov. 2005 à 13:40
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");



}









}



}
0
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
20 nov. 2005 à 13:59
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#
*/
0
cs_mamounette Messages postés 14 Date d'inscription lundi 23 février 2004 Statut Membre Dernière intervention 24 août 2006
20 nov. 2005 à 14:14
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);





}



}
0
Rejoignez-nous