Buenas foreros !!!
Bueno.. sé que el título es un poco "raro", pero es tal cual lo que necesito. Agradecería a cualquier experto en materia de apis y de conocimientos en .NET me de nociones de como aprender a trabajar con ellas.
Para ello, expongo el siguiente caso, en el que me he visto envuelto y lo he solucionado gracias a las APIS:
Necesitaba recorrer las carpetas compartidas de los equipos de red de mi red(valga la redundancia), para ello vi un código en codeproject, del cual he usado la gran parte:
Código:
public class ClsCarpetas
{
[DllImport("netapi32", CharSet = CharSet.Unicode)]
protected static extern int NetShareEnum(string lpServerName, int dwLevel,
out IntPtr lpBuffer, int dwPrefMaxLen,
out int entriesRead, out int totalEntries,
ref int hResume);
[Flags]
public enum ShareType
{
/// <summary>Disk share</summary>
Disk = 0,
/// <summary>Printer share</summary>
Printer = 1,
/// <summary>Device share</summary>
Device = 2,
/// <summary>IPC share</summary>
IPC = 3,
/// <summary>Special share</summary>
Special = -2147483648, // 0x80000000,
}
/// <summary>Share information, NT, level 2</summary>
/// <remarks>
/// Requires admin rights to work.
/// </remarks>
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
protected struct SHARE_INFO
{
[MarshalAs(UnmanagedType.LPWStr)]
public string NetName;
public ShareType ShareType;
[MarshalAs(UnmanagedType.LPWStr)]
public string Remark;
public int Permissions;
public int MaxUsers;
public int CurrentUsers;
[MarshalAs(UnmanagedType.LPWStr)]
public string Path;
[MarshalAs(UnmanagedType.LPWStr)]
public string Password;
}
private List<string> ListaDirectorios = new List<string>();
public void GetCarpetas(string direccionEquipo)
{
int level = 2;
int entriesRead, totalEntries, nRet, hResume = 0;
IntPtr pBuffer = IntPtr.Zero;
nRet = NetShareEnum(direccionEquipo, level, out pBuffer, -1, out entriesRead,
out totalEntries, ref hResume);
if (nRet == 0 && entriesRead > 0)
{
int offset = Marshal.SizeOf(typeof(SHARE_INFO));
for (int i = 0, lpItem = pBuffer.ToInt32(); i < entriesRead; i++, lpItem += offset)
{
IntPtr pItem = new IntPtr(lpItem);
SHARE_INFO si = (SHARE_INFO)Marshal.PtrToStructure(pItem, typeof(SHARE_INFO));
if (si.ShareType == ShareType.Disk)
{
string direccionCarpeta = string.Format(@"\\{0]\{1}", direccionEquipo, si.NetName);
ListaDirectorios.Add(direccionCarpeta);
GetSubDirectorios(direccionCarpeta);
//string[] listaDirectorios = Directory.GetDirectories(@"\\192.168.1.138\");
}
}
}
}
private void GetSubDirectorios(string pathDirectorio)
{
string[] directoriosEncontrados = Directory.GetDirectories(pathDirectorio);
if (directoriosEncontrados.Length > 0)
{
foreach(string rutaDirectorio in directoriosEncontrados)
{
ListaDirectorios.Add(rutaDirectorio);
GetSubDirectorios(rutaDirectorio);
}
}
}
}
Bueno, pues como podeis ver, toda la parte de arriba (Menos los dos últimos métodos) los copié de CodeProject.
Y en fin, querría saber, como cojones hizo el chico que lo hizo, para saber que tenía que crear:
- El método NetShareEnum.
- La enumeración ShareType y con el atributo [Flags]
- La structura SHARE_INFO
La importación de la DLL netapi32 entiendo que buscando por google te pueda salir, pero... ¿Como cojones pudo saber como crear esas enumeraciones, structuras y demás?
Bueno, agradecería, desde mi humilde postura, pudieran decirme como puedo aprender a manejarme solo con este tema...
Gracias y espero haberme explicado en mi necesidad.
Saludos.