lunedì 16 febbraio 2009

Condividere una cartella tramite la tecnologia .Net (VB.Net e C#)

Riporto l'articolo scritto per il sito iprogrmamatori http://www.iprogrammatori.it/articoli/programmazione/art_condividere-una-cartella-con-la-tecnolog_625.aspx



Tramite l’api NetShareAdd è possibile da codice tramite la tecnologia .Net, rendere una cartella condivisa.


Vedremo, come condividere una cartella in .Net tramite il linguaggio di programmazione Visual Basic Net e C#



Si crea un nuovo progetto di tipo windows application, nella form che viene visualizzata, aggiungiamo un controllo di tipo button.


Passiamo in visualizzazione codice.


Per utilizzare l’api NetShareAdd dobbiamo aggiungere lo spazio dei nomi System.Runtime.InteropServices il quale ci permette di gestire le api di Windows.



Di seguito si riporta il frammento di codice delle suddette operazioni.



VB.Net

Imports System.Runtime.InteropServices

C#

using System.Runtime.InteropServices;

Fatto ciò, a livello di form, inseriamo la dichiarazione di api, il quale ci permette di creare una cartella condivisa, la funzione accetta quattro parametri, il primo, il nome del pc, il secondo il livello di condivisione, il terzo parametro una struttura, per impostare i vari parametri della cartella condivisa, ed infine il quarto ed ultimo argomento, accetta un valore di tipo intero per l’errore.


Di seguito si riporta la dichiarazione di api.



VB.Net

'Dichiarazione di api

Declare Unicode Function NetShareAdd Lib "netapi32.dll" ( _

_

ByVal servername As String, _

ByVal level As Integer, _

ByRef buf As SHARE_INFO_2, _

ByRef parm_err As Integer) As Integer


C#

//Dichiarazione di api

[DllImport("Netapi32.dll")]

private static extern uint NetShareAdd(

[MarshalAs(UnmanagedType.LPWStr)] string strServer,

Int32 dwLevel,

ref SHARE_INFO_502 buf,

ref uint parm_err

);

Una volta dichiarata la funzione API, dobbiamo creare delle enumerazioni, una per la gestione degli errori, una per il tipo di condivisione, ed una per i permessi. Inoltre anche una struttura, che verrà passata alla funzione api, per fornire le informazioni relativa alla condivisione.


Di seguito si riporta le suddette dichiarazioni.



VB.Net

'Definizione di errore.

Public Enum NetError

NERR_Success = 0

ERROR_ACCESS_DENIED = 5

ERROR_INVALID_PARAMETER = 87

ERROR_INVALID_NAME = 123

ERROR_INVALID_LEVEL = 124

NERR_BASE = 2100

NERR_UnknownDevDir = (NERR_BASE + 16)

NERR_RedirectedPath = (NERR_BASE + 17)

NERR_DuplicateShare = (NERR_BASE + 18)

NERR_BufTooSmall = (NERR_BASE + 23)

End Enum



' definizione di condivisione

Public Enum ShareType

' Disk Share

Disk = 0

' Printer Share

Printer = 1

' Device Share

Device = 2

' IPC Share

IPC = 3

'>Special Share

Special = &H80000000

End Enum



'Informazioni relativa ai permessi

Public Enum SharePermissions

ACCESS_NONE = 0

ACCESS_READ = 1

ACCESS_WRITE = 2

ACCESS_CREATE = 4

ACCESS_EXEC = 8

ACCESS_DELETE = &H10

ACCESS_ATRIB = &H20

ACCESS_PERM = &H40

ACCESS_ALL = ACCESS_READ + _

ACCESS_WRITE + _

ACCESS_CREATE + _

ACCESS_EXEC + _

ACCESS_DELETE + _

ACCESS_ATRIB + _

ACCESS_PERM

ACCESS_GROUP = &H8000

End Enum




_

Public Structure SHARE_INFO_2

_

Public shi2_netname As String

_

Public shi2_type As ShareType

_

Public shi2_remark As String

_

Public shi2_permissions As SharePermissions

_

Public shi2_max_uses As Integer

_

Public shi2_current_uses As Integer

_

Public shi2_path As String

_

Public shi2_passwd As String




End Structure


C#

//Definizione di errore.

private enum NetError : uint

{

NERR_Success = 0,

ERROR_ACCESS_DENIED = 5,

ERROR_INVALID_PARAMETER = 87,

ERROR_INVALID_NAME = 123,

ERROR_INVALID_LEVEL = 124,

NERR_BASE = 2100,

NERR_UnknownDevDir = (NERR_BASE + 16),

NERR_RedirectedPath = (NERR_BASE + 17),

NERR_DuplicateShare = (NERR_BASE + 18),

NERR_BufTooSmall = (NERR_BASE + 23),

}

//definizione di condivisione

private enum ShareTYPE : uint

{

//Disk Share

Disk = 0,

//Printer Share

PRINTER = 1,

//Device Share

DEVICE = 2,

//IPC Share

IPC = 3,

//>Special Share

SPECIAL = 0x80000000,

}

//Informazioni relativa ai permessi

public enum SharePermissions

{

ACCESS_NONE = 0,

ACCESS_READ = 1,

ACCESS_WRITE = 2,

ACCESS_CREATE = 4,

ACCESS_EXEC = 8,

ACCESS_DELETE = 0x10,

ACCESS_ATRIB = 0x20,

ACCESS_PERM = 0x40,

ACCESS_ALL = ACCESS_READ + ACCESS_WRITE + ACCESS_CREATE + ACCESS_EXEC + ACCESS_DELETE + ACCESS_ATRIB + ACCESS_PERM,

ACCESS_GROUP = 0x8000

}



[StructLayout(LayoutKind.Sequential)]

private struct SHARE_INFO_502

{

[MarshalAs(UnmanagedType.LPWStr)]

public string shi502_netname;

public ShareTYPE shi502_type;

[MarshalAs(UnmanagedType.LPWStr)]

public string shi502_remark;

public SharePermissions shi502_permissions;

public Int32 shi502_max_uses;

public Int32 shi502_current_uses;

[MarshalAs(UnmanagedType.LPWStr)]

public string shi502_path;

[MarshalAs(UnmanagedType.LPWStr)]

public string shi502_passwd;

public Int32 shi502_reserved;

public IntPtr shi502_security_descriptor;

}

Siamo giunti quasi alla conclusione di questo articolo, ora non resta che scrivere nell’evento click del pulsante il codice, che permette di creare una cartella condivisa.


Dobbiamo creare una struttura di tipo Share_info_2, creata in precedenza, e valorizzarlo con le dovute informazioni (percorso e nome della cartella da condividere, permessi, nome della condivisione, ecc) ed eseguire la funzione api.


La funzione Api, ritorna un valore, il quale ci indica se è andata a buon fine, oppure si è verificato una determinata eccezione (nome cartella condivisa, già esistente, ecc).



Di seguito si riporta il frammento di codice delle suddette dichiarazioni.


VB.Net

Dim shi2 As SHARE_INFO_2


'Valorizzo la struttura relativa ai parametri di condivisione

shi2.shi2_netname = "Condivisa" 'Nome della condivisione

shi2.shi2_type = ShareType.Disk

shi2.shi2_remark = "" ' commenti

shi2.shi2_permissions = SharePermissions.ACCESS_NONE

shi2.shi2_max_uses = -1 'Utenti

shi2.shi2_current_uses = 0

shi2.shi2_path = "c:\test" 'Percorso e nome della Cartella da condividere

shi2.shi2_passwd = Nothing 'Password

Dim risultato As Integer

'primo parametro nome pc ritorna un intero, 0 creata, altrimenti non creata

risultato = NetShareAdd("emanuele", 2, shi2, Nothing)

'Visualizzo un messaggio a video

If risultato = NetError.NERR_Success Then

MessageBox.Show("Creata")

ElseIf risultato = NetError.NERR_DuplicateShare Then

MessageBox.Show("Nome già presente")

Else

MessageBox.Show("Errore")

End If


C#

SHARE_INFO_502 shi2 = new SHARE_INFO_502();


//Valorizzo la struttura relativa ai parametri di condivisione

shi2.shi502_netname = "Condivisa"; //Nome della condivisione

shi2.shi502_type = ShareTYPE.Disk;

shi2.shi502_remark = ""; // commenti

shi2.shi502_permissions = SharePermissions.ACCESS_NONE;

shi2.shi502_max_uses = -1; //Utenti

shi2.shi502_current_uses = 0;

shi2.shi502_path = "c:\\test"; //Percorso e nome della Cartella da condividere

shi2.shi502_passwd = null; //Password

uint errore = 0;

uint risultato;

//primo parametro nome pc ritorna un intero, 0 creata, altrimenti non creata

risultato = NetShareAdd("emanuele", 2, ref shi2, ref errore);

//Visualizzo un messaggio a video

if ((NetError)risultato == NetError.NERR_Success)

{

MessageBox.Show("Creata");

}

else if ((NetError)risultato == NetError.NERR_DuplicateShare)

{

MessageBox.Show("Nome già presente");

}

else

{

MessageBox.Show("Errore");

}




Conclusione


In questo articolo è stato dimostrato come rendere una cartella del nostro computer, condivisa.


Tramite la parola download è possibile scaricare il file utilizzato in questo articolo

Download

Nessun commento: