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