Condividere una cartella con la tecnologia .Net

In questo articolo vedremo come condividere una cartella di Windows tramite .NEt (VB.Net e C#).

il
Sviluppatore Microsoft .Net, Collaboratore di IProgrammatori

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