K

- Base de connaissances

Accueil > API WINDOWS > WNetAddConnection2

WNetAddConnection2

mercredi 28 juillet 2010, par webmestre

Fichier DLL : mpr.dll

Prototype VB6/VBA :

Declare Function WNetAddConnection2 Lib "mpr.dll" Alias "WNetAddConnection2A" (ByRef lpNetResource As NETRESOURCE, ByVal lpPassword As String, ByVal lpUserName As String, ByVal dwFlags As Long) As Long

Prototype VB.NET :

Declare Function WNetAddConnection2 Lib "mpr.dll" Alias "WNetAddConnection2A" (ByRef lpNetResource As NETRESOURCE, ByVal lpPassword As String, ByVal lpUserName As String, ByVal dwFlags As Integer) As Integer

La fonction WNetAddConnection2 monte, en local, une ressource réseau partagée répondant au protocole SMB. Ainsi, elle permet de rediriger un périphérique local (exemple : un lecteur sous windows) vers la ressource réseau partagée (Répertoires, imprimantes,...).

Pour information :
Le protocole SMB (Server Message Block) est un protocole permettant le partage de ressources (fichiers et imprimantes) sur des réseaux locaux avec des PC sous les systèmes d’exploitations Windows, MAC OS ou LINUX/UNIX. Sous Windows, cette technologie est implémentée de base. Sous Windows NT 4, il est appelé CIFS (Common Internet File System). Et, sous Vista et Seven, il est appelé SMB 2. Sous LINUX/UNIX et MAC, on utilise la librairie SAMBA pour implémenter cette technologie qui d’ailleurs est souvent implémentée de base dans différentes distributions.

Remarques :

  • La fonction WNetAddConnection2 remplace la fonction WNetAddConnection.
  • Dans la structure NETRESSOURCE, le chemin du périphérique local doit être renseigné avec le : comme caractère final (exemple : T :)

Référence : MSDN

Exemple de code source VB6/VBA :

Option Explicit
'--------------------------------------
'------Déclaration des constantes------
'--------------------------------------
' Pour API WNetAddConnection2A et WNetCancelConnection2A
Private Const NO_ERROR As Long = 0
Private Const RESOURCETYPE_DISK As Long = &H1   ' Type de ressource à connecter : ici un disque, une unité de stockage, un répertoire ...
Private Const CONNECT_INTERACTIVE As Long = &H8 ' Permet d'afficher une boite de dialogue système si les identifiants de connexions sont erronés
' Pour API FormatMessage
Private Const FORMAT_MESSAGE_FROM_HMODULE As Long = &H800
'---------------------------------
'------Déclaration des types------
'---------------------------------
Private Type NETRESOURCE
    dwScope         As Long
    dwType          As Long
    dwDisplayType   As Long
    dwUsage         As Long
    lpLocalName     As String
    lpRemoteName    As String
    lpComment       As String
    lpProvider      As String
End Type
'-------------------------------
'------Déclaration des API------
'-------------------------------
Private Declare Function FormatMessage Lib "kernel32.dll" Alias "FormatMessageA" (ByVal dwFlags As Long, ByVal lpSource As Long, ByVal dwMessageId As Long, ByVal dwLanguageId As Long, ByVal lpBuffer As String, ByVal nSize As Long, Arguments As Long) As Long
Private Declare Function GetModuleHandle Lib "kernel32.dll" Alias "GetModuleHandleA" (ByVal lpLibFileName As String) As Long
Private Declare Function WNetAddConnection2 Lib "mpr.dll" Alias "WNetAddConnection2A" (lpNetResource As NETRESOURCE, ByVal lpPassword As String, ByVal lpUserName As String, ByVal dwFlags As Long) As Long
Private Declare Function WNetAddConnection3 Lib "mpr.dll" Alias "WNetAddConnection3A" (hwndOwner As Long, lpNetResource As NETRESOURCE, ByVal lpPassword As String, ByVal lpUserName As String, ByVal dwFlags As Long) As Long
Private Declare Function WNetCancelConnection2 Lib "mpr.dll" Alias "WNetCancelConnection2A" (ByVal lpName As String, ByVal dwFlags As Long, ByVal fForce As Long) As Long
'---------------------------------------------------
'------Déclaration des procédures et functions------
'---------------------------------------------------
'---Connecter un lecteur réseau---
Public Function ConnecterLecteurReseau(LocalDrive As String, RemoteName As String, Optional UserName As String = vbNullString, Optional UserPassword As String = vbNullString) As Long
    '---Déclaration des variables---
    Dim theNetResource As NETRESOURCE
   
    '---Initialisation---
    With theNetResource
        .dwType = RESOURCETYPE_DISK
        .lpLocalName = LocalDrive
        .lpRemoteName = RemoteName
    End With
   
    '---Tentative de connexion---
    ' Avec WNetAddConnection2
    ConnecterLecteurReseau = WNetAddConnection2(theNetResource, UserPassword, UserName, CONNECT_INTERACTIVE)
   
    ' Avec WNetAddConnection3 équivalent à WNetAddConnection2
'    ConnecterLecteurReseau = WNetAddConnection3(0, theNetResource, UserPassword, UserName, CONNECT_INTERACTIVE)
    ' Avec WNetAddConnection3 : On indique le handle de la feuille parent (ou appelant) à la boite de dialogue système de connexion dans le cas de l'échec de l'identification
'    ConnecterLecteurReseau = WNetAddConnection3(Form1.hWnd, theNetResource, UserPassword, UserName, CONNECT_INTERACTIVE)
End Function
'---Déconnecter un lecteur réseau---
Public Function DeconnecterLecteurReseau(LocalDrive As String, bForce As Boolean) As Long
    DeconnecterLecteurReseau = WNetCancelConnection2(LocalDrive, 0, Abs(CLng(bForce)))
End Function
'---Afficher un message d'erreur---
Private Sub MsgBoxError(dwMessageId As Long)
    '---Déclaration des variables---
    Dim dwRet      As Long
    Dim szString   As String * 2048
   
    '---Récupert le message---
    dwRet = FormatMessage(FORMAT_MESSAGE_FROM_HMODULE, GetModuleHandle("kernel32.dll"), dwMessageId, 0, szString, Len(szString), 0)
   
    '---Affichage---
    MsgBox "- Code Erreur : " & dwMessageId & vbCrLf & "- Message : " & Mid$(szString, 1, dwRet), vbCritical + vbOKOnly, "ERREUR..."
End Sub
'------------------------------------------------------
'------Déclaration des procédures évènementielles------
'------------------------------------------------------
Private Sub Command1_Click()
    '---Déclaration des variables---
    Dim ret As Long
   
    '---Tentative de connexion à une ressource réseau partagée---
    ret = ConnecterLecteurReseau("T:", "\\192.168.1.2\virtualisation", "PC-DEV-PORTABLE\philippe", "motdepasse")
    If ret = NO_ERROR Then
        MsgBox "Le lecteur a correctement été connecté !", vbInformation + vbOKOnly, "INFORMATION..."
    Else
        MsgBoxError ret
    End If
End Sub
Private Sub Command2_Click()
    '---Déclaration des variables---
    Dim ret As Long
   
    '---Tentative de déconnexion du lecteur---
    ret = DeconnecterLecteurReseau("T:", True)
    If ret = NO_ERROR Then
        MsgBox "Le lecteur a correctement été déconnecté !", vbInformation + vbOKOnly, "INFORMATION..."
    Else
        MsgBoxError ret
    End If
End Sub

Exemple de code source VB.NET :

Imports System.Math
Public Partial Class MainForm
        '--------------------------------------
        '------Déclaration des constantes------
        '--------------------------------------
        ' Pour API WNetAddConnection2A et WNetCancelConnection2A
        Private Const NO_ERROR                    As Integer = 0
        Private Const RESOURCETYPE_DISK   As Integer = &H1
        Private Const CONNECT_INTERACTIVE As Integer = &h8
        ' Pour API FormatMessage
        Private Const FORMAT_MESSAGE_FROM_HMODULE as Integer = &H800
        '---------------------------------
        '------Déclaration des types------
        '---------------------------------
        Private Structure NETRESOURCE
                Public dwScope                  As Integer
                Public dwType                   As Integer
                Public dwDisplayType    As Integer
                Public dwUsage                  As Integer
                Public lpLocalName              As String
                Public lpRemoteName     As String
                Public lpComment                As String
                Public lpProvider               As String
        End Structure
       
        '-------------------------------
        '------Déclaration des API------
        '-------------------------------
        Private Declare Function FormatMessage Lib "kernel32.dll" Alias "FormatMessageA" (ByVal dwFlags As Integer, ByVal lpSource As Integer, ByVal dwMessageId As Integer, ByVal dwLanguageId As Integer, ByVal lpBuffer As String, ByVal nSize As Integer, Arguments As Integer) As Integer
        Private Declare Function GetModuleHandle Lib "kernel32.dll" Alias "GetModuleHandleA" (ByVal lpLibFileName As String) As Integer
        Private Declare Function WNetAddConnection2 Lib "mpr.dll" Alias "WNetAddConnection2A" (ByRef lpNetResource As NETRESOURCE, ByVal lpPassword As String, ByVal lpUserName As String, ByVal dwFlags As Integer) As Integer
        Private Declare Function WNetAddConnection3 Lib "mpr.dll" Alias "WNetAddConnection3A" (hWndOwner as IntPtr,ByRef lpNetResource As NETRESOURCE, ByVal lpPassword As String, ByVal lpUserName As String, ByVal dwFlags As Integer) As Integer
        Private Declare Function WNetCancelConnection2 Lib "mpr.dll" Alias "WNetCancelConnection2A" (ByVal lpName As String, ByVal dwFlags As Integer, ByVal fForce As Integer) As Integer
        '---------------------------------------------------
        '------Déclaration des procédures et functions------
        '---------------------------------------------------
        '---Connecter un lecteur réseau---
        Private Function ConnecterLecteurReseau(LocalDrive as String, RemoteName As String, Optional UserName As String = vbNullString, Optional UserPassword As String = vbNullString) As Integer
            '---Déclaration des variables---
            Dim theNetResource As New NETRESOURCE()
            '---Initialisation---
            With theNetResource
                .dwType = RESOURCETYPE_DISK
                .lpLocalName = LocalDrive
                .lpRemoteName = RemoteName
            End With
            '---Tentative de connexion---
            ' Avec WNetAddConnection2
                Return WNetAddConnection2(theNetResource, UserPassword, UserName, CONNECT_INTERACTIVE)
   
                ' Avec WNetAddConnection3 équivalent à WNetAddConnection2
'               Return WNetAddConnection3(0, theNetResource, UserPassword, UserName, CONNECT_INTERACTIVE)
                ' Avec WNetAddConnection3 : On indique le handle de la feuille parent (ou appelant) à la boite de dialogue système de connexion dans le cas de l'échec de l'identification
'               Return WNetAddConnection3(Me.Handle, theNetResource, UserPassword, UserName, CONNECT_INTERACTIVE)
        End Function
        '---Déconnecter un lecteur réseau---
        Private Function DeconnecterLecteurReseau(LocalDrive As String, bForce As Boolean) As Integer
            Return WNetCancelConnection2(LocalDrive, 0, Abs(CLng(bForce)))
        End Function   
       
        '---Afficher un message d'erreur---
        Private Sub MsgBoxError(dwMessageId As Long)
            '---Déclaration des variables---
            Dim dwRet      As Long
            Dim szString   As String = space$(2048)
           
            '---Récupert le message---
            dwRet = FormatMessage(FORMAT_MESSAGE_FROM_HMODULE, GetModuleHandle("kernel32.dll"), dwMessageId, 0, szString, szString.Length, 0)
           
            '---Affichage---
            MsgBox("- Code Erreur : " & dwMessageId & vbCrLf & "- Message : " & Mid(szString, 1, dwRet), MsgBoxStyle.Critical + MsgBoxStyle.OKOnly, "ERREUR...")
        End Sub
       
        '---------------------------------------
        '------Déclaration du constructeur------
        '---------------------------------------       
        Public Sub New()
                Me.InitializeComponent()
        End Sub
        '------------------------------------------------------
        '------Déclaration des procédures évènementielles------
        '------------------------------------------------------
        Sub Button1Click(sender As Object, e As EventArgs)
            '---Déclaration des variables---
            Dim ret As Integer
           
            '---Tentative de connexion à une ressource réseau partagée---
            ret = ConnecterLecteurReseau("T:", "\\192.168.1.2\virtualisation", "PC-DEV-PORTABLE\philippe", "motdepasse")
            If ret = NO_ERROR Then
                MsgBox("Le lecteur a correctement été connecté !", MsgBoxStyle.Information + MsgBoxStyle.OkOnly, "INFORMATION...")
            Else
                MsgBoxError(ret)
            End If                             
        End Sub
       
        Sub Button2Click(sender As Object, e As EventArgs)
            '---Déclaration des variables---
            Dim ret As Long
           
            '---Tentative de déconnexion du lecteur---
            ret = DeconnecterLecteurReseau("T:", True)
            If ret = NO_ERROR Then
                MsgBox("Le lecteur a correctement été déconnecté !", MsgBoxStyle.Information + MsgBoxStyle.OkOnly, "INFORMATION...")
            Else
                MsgBoxError(ret)
            End If             
        End Sub
End Class

Répondre à cet article

Plan du site | Suivre la vie du site RSS 2.0 | powered by NYSTEK-EDITIONS and NYSTEK-CONSULTING