Comment se connecter a une ressource reseau ?

Symptômes


Comment faire pour accéder à une ressource sur le réseau, un partage par
exemple, avec des droits différents que l'utilisateur exécutant le
programme ?


Résolution


Il se peut que dans certains cas une application doive stocker des
informations sur un serveur mais sans donner les droits d'écriture aux
utilisateurs classiques.
WnetAddConnection2() WnetCancelConnection2() sont des fonctions qui
permettent, par programmation, d'ajouter et de supprimer une connexion a
une ressource sur le reseau. On s'en sert typiquement pour associer une
lettre à un partage, ou pour se connecter à une ressource directement
grace à la syntaxe UNC (\\server\nom_partage). WnetAddConnection2 permet
également de passer en argument un mot de passe ainsi que le nom de
l'utilisateur pour s'authentifier :
DWORD WNetAddConnection2(
LPNETRESOURCE lpNetResource, // connection details
LPCTSTR lpPassword, // password
LPCTSTR lpUsername, // user name
DWORD dwFlags // connection options
);


EXEMPLE :

Prenons :
- ServeurA la machine sur laquelle se trouve le partage "partage"
- ClientA le poste client sur lequel tournera l'application et qui
dispose d'un fichier c:\output.log pour faire fonctionner l'exemple
- User1 le nom de l'utilisateur exécutant l'application et ayant des
droits de lecture uniquement (ou aucun droit) sur le partage
\\ServeurA\partage
- SuperUser1 le nom de l'utilisateur ayant les droits d'écriture sur le
partage.
- Droits NTFS à fixer sur le répertoire partagé
Clic droit sur le répertoire / Onglet Securité
SuperUser1 : Control Total
User1 : Lecture uniquement
(les permissions sur le partage peuvent être laissées à Tout le monde -
Controle total)

Le code ci dessous va se connecter sur la ressource "\\ServeurA\partage\"
avec le compte "SuperUser1" et le mot de passe "azerty1"; il tentera
ensuite de copier un fichier output.log sur ce partage :

1. Créer un projet Standard EXE
2. Ajouter un module au projet
Menu Projet / Ajouter Module
3. Copier le code ci dessous dans le Module :

<code>
Public Const NO_ERROR = 0
Public Const CONNECT_UPDATE_PROFILE = &H1
Public Const RESOURCETYPE_DISK = &H1
Public Const RESOURCETYPE_PRINT = &H2
Public Const RESOURCETYPE_ANY = &H0
Public Const RESOURCE_CONNECTED = &H1
Public Const RESOURCE_REMEMBERED = &H3
Public Const RESOURCE_GLOBALNET = &H2
Public Const RESOURCEDISPLAYTYPE_DOMAIN = &H1
Public Const RESOURCEDISPLAYTYPE_GENERIC = &H0
Public Const RESOURCEDISPLAYTYPE_SERVER = &H2
Public Const RESOURCEDISPLAYTYPE_SHARE = &H3
Public Const RESOURCEUSAGE_CONNECTABLE = &H1
Public Const RESOURCEUSAGE_CONTAINER = &H2
' Error Constants:
Public Const ERROR_ACCESS_DENIED = 5&
Public Const ERROR_ALREADY_ASSIGNED = 85&
Public Const ERROR_BAD_DEV_TYPE = 66&
Public Const ERROR_BAD_DEVICE = 1200&
Public Const ERROR_BAD_NET_NAME = 67&
Public Const ERROR_BAD_PROFILE = 1206&
Public Const ERROR_BAD_PROVIDER = 1204&
Public Const ERROR_BUSY = 170&
Public Const ERROR_CANCELLED = 1223&
Public Const ERROR_CANNOT_OPEN_PROFILE = 1205&
Public Const ERROR_DEVICE_ALREADY_REMEMBERED = 1202&
Public Const ERROR_EXTENDED_ERROR = 1208&
Public Const ERROR_INVALID_PASSWORD = 86&
Public Const ERROR_LOGON_FAILURE = 1326&

Public Const ERROR_NO_NET_OR_BAD_PATH = 1203&

Public 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

Public Declare Function WNetCancelConnection2 Lib "mpr.dll" Alias _
"WNetCancelConnection2A" (ByVal lpName As String, _
ByVal dwFlags As Long, ByVal fForce As Long) As Long


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
</code>

4. Ajouter une référence à Microsoft Scripting Runtime
Menu Projet / Références / Microsoft Scripting Runtime (scrrun.dll)
5. Ajouter un bouton sur la feuille
6. Coller le code suivant :

<code>
Dim fso As Scripting.FileSystemObject

Private Sub Command1_Click()
Set fso = New Scripting.FileSystemObject
Dim NetR As NETRESOURCE
Dim ret As Long
On Error GoTo errh
NetR.dwScope = RESOURCE_GLOBALNET
NetR.dwType = RESOURCETYPE_DISK
NetR.dwDisplayType = RESOURCEDISPLAYTYPE_SHARE
NetR.dwUsage = RESOURCEUSAGE_CONNECTABLE
NetR.lpLocalName = ""
NetR.lpRemoteName = "\\ServeurA\partage"
'NetR.lpComment = "Commentaire optionnel"
'NetR.lpProvider = ' Réservé

'Creation d'une connection avec un jeton particulier
ret = WNetAddConnection2(NetR, "azerty&1", "SuperUser1", _
CONNECT_UPDATE_PROFILE)
Debug.Print ret
If ret = ERROR_LOGON_FAILURE Then
MsgBox "Echec de Logon"
ElseIf ret = NO_ERROR Then
fso.CopyFile "c:\output.log", "\\ServeurA\partage\", True
'Deconnection du partage
ret = WNetCancelConnection2(NetR.lpRemoteName, _
CONNECT_UPDATE_PROFILE, False)
If ret = NO_ERROR Then
MsgBox "Deconnexion reussi!", vbInformation, _
"Partage deconnecté"
Else
MsgBox "ERROR: " & ErrInfo & " - Deconnexion a echoué!", _
vbExclamation, "Partage non deconnecté"
End If
End If
Set fso = Nothing
Exit Sub
errh:
WNetCancelConnection2 NetR.lpRemoteName, CONNECT_UPDATE_PROFILE, _
False
MsgBox Err.Description
End Sub

Private Sub Form_Load()
Command1.Caption = "Copier fichier"
End Sub
</code>

7. Exécuter le projet en appyuant sur la touche F5
8. Cliquer sur le bouton
9. Vérifier sur le partage que le fichier soit bien présent; on peut
egalement s'assurer qu'avec User1 il n'est pas possible d'écrire sur le
partage en utilisant l'explorateur par exemple.


REMARQUE :

Cet méthode ne fonctionne pas sous Windows 9x du fait que le Client pour
Réseaux Microsoft ne supporte pas de connections à multiple credentials :
Q183366 INFO: WNetAddConnection2 and Multiple User Credentials
http://support.microsoft.com/support/kb/articles/q183/3/66.asp


Références

Pour plus de renseignements, veuillez-vous référer à :
WNetAddConnection2
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wnet/net
works_84z6.asp
WNetCancelConnection2
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wnet/net
works_6c6q.asp


MOTS-CLES :
La liste de(s) mot(s) suivant(s) permet une recherche plus efficace de
cette fiche technique : WNetAddConnection2 WNetAddConnection multiple
connexions permissions partage vb
Propriétés

ID d'article : 19923 - Dernière mise à jour : 25 sept. 2004 - Révision : 1

Commentaires