Mappage d'un lecteur réseau avec une DLL<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Bonjour,
J'aimerais pouvoir mapper (puis démapper) un lecteur réseau spécifique dans le cadre d'un fichier JSL à l'aide d'une DLL. En discutant avec des informaticiens internes, ils m'ont indiqué mpr.dll et les fonctions WNetAddConnection2 et WNetCancelConnection2. Cependant, je ne suis pas un programmeur expert et même si j'ai regardé les exemples dans le Guide de script et les exemples sur ce forum de discussion (qui font des choses incroyables), je n'arrive pas à faire fonctionner le mien. De plus, je n'ai jamais appelé de DLL auparavant dans aucune programmation que j'ai faite ... Y a-t-il quelqu'un qui peut m'aider?
Le code que j'ai concocté jusqu'à présent (d'un collègue informatique qui a lu le fichier d'aide mais ne connaît pas JMP) est ci-dessous. Quelqu'un peut-il voir des erreurs évidentes? J'apprécierais vraiment l'aide...
Merci
Colin
(Désolé, il n'a pas bien formaté. J'ai essayé quelques options mais elles avaient l'air bizarre)
// nom d'utilisateur, mot de passe, emplacement de la carte réseau ont tous été modifiés pour être collés ici
//Charger la DLL requise
dll_obj = Charger Dll("mpr.dll");
// Affecter des constantes aux membres de la structure - voir la liste des constantes ci-dessous pour référence
// Ceux-ci sont définis dans la dll en tant que DWORD (entiers positifs non signés)
dwScope = HexToNumber("00000002"); //&H2;
dwType = HexToNumber("00000001"); //&H1;
dwTypeAffichage = HexToNumber("00000003"); //&H3;
dwUsage = HexToNumber("00000001"); //&H1;
dwFlags = HexToNumber("00000004"); //&H4;
lpNomLocal = "Z :" ;
lpNomDistant = " \\10.254.1.1\!lecteur\ " ;
lpComment = "" ;
lpProvider = "" ;
lpPassword = "mot de passe" ; // Mot de passe réseau
lpUserName = "domaine\nom d'utilisateur" ;
//Déclarer la fonction exportée et définir l'alias
dll_obj << DéclarerFonction(
"WNetAjouteConnexion2",
Alias("MapNetworkDrive"),
StructArg(
Arg(Int32, "dwScope"),
Arg(Int32, "dwType"),
Arg(Int32, "dwTypeAffichage"),
Arg(Int32, "dwUsage"),
Arg(AnsiString, "lpNomLocal"),
Arg(AnsiString, "lpRemoteName"),
Arg(AnsiString, "lpComment"),
Arg(AnsiString, "lpProvider"),
"NETRESSOURCE",
saisir
),
Arg(AnsiString, "lpPassword", entrée),
Arg(AnsiString, "lpUserName", entrée),
Arg(Int32, "dwFlags", entrée),
Retours(Int32)
);
//Traitement de la fonction - lecteur de carte
/* Syntaxe d'appel de fonction DLL
dll_obj << Alias(
Structure (Chaque Arg),
Mot de passeArg,
Nom d'utilisateurArg,
DWFlagsArg
);
*/
résultat = dll_obj << MapNetworkDrive(
dwScope,
dwType,
dwTypeAffichage,
dwUsage,
lpNomLocal,
lpNomDistant,
lpComment,
lpProvider,
lpMot de passe,
lpUserName,
dwFlags
);
// Une connexion réussie doit renvoyer 0 (NO_ERROR)
// Décharger la DLL
dll_obj << DéchargerDll
Re : Mapper un lecteur réseau avec une DLLPour démapper le lecteur, cela fonctionne pour moi:
dll_obj << DeclareFunction(
"WNetCancelConnection2A",
Alias("UnmapNetworkDrive"),
Arg(AnsiString, "lpName", input),
Arg(Int32, "dwFlags", input),
Arg(Int32, "fForce", input),
Returns(Int32)
);
Appeler:
result = dll_obj << UnmapNetworkDrive(
lpLocalName,
0,
0, // 1=force connection closed even if files are opened
);
Re : Mapper un lecteur réseau avec une DLLJ'ai eu un certain succès en utilisant l'API que vous avez mentionnée avec quelques modifications. Voici mes modifications :
* Modifié pour utiliser WNetAddConnection2A, le 'A' signifie Ansi, vous devez donc appeler cette version. Vous pouvez utiliser WNetAddConnection2W si vous avez spécifié UnicodeString dans votre Args.
* Changement de lpProvider en Int64 pour pouvoir passer 0 (NULL) pour le fournisseur.
//Declare exported function and set alias
dll_obj << DeclareFunction(
"WNetAddConnection2A",
Alias("MapNetworkDrive"),
StructArg(
Arg(Int32, "dwScope"),
Arg(Int32, "dwType"),
Arg(Int32, "dwDisplayType"),
Arg(Int32, "dwUsage"),
Arg(AnsiString, "lpLocalName"),
Arg(AnsiString, "lpRemoteName"),
Arg(AnsiString, "lpComment"),
// Arg(AnsiString, "lpProvider"),
Arg(Int64, "lpProvider"),
"NETRESOURCE",
input
),
Arg(AnsiString, "lpPassword", input),
Arg(AnsiString, "lpUserName", input),
Arg(Int32, "dwFlags", input),
Returns(Int32)
);
Appel avec zéro pour que le fournisseur laisse le système d'exploitation sélectionner le fournisseur.
result = dll_obj << MapNetworkDrive(
dwScope,
dwType,
dwDisplayType,
dwUsage,
lpLocalName,
lpRemoteName,
lpComment,
0, // lpProvider = NULL
lpPassword,
lpUserName,
dwFlags
);
Une mise en garde que j'ai trouvée est qu'il renvoie 1219 (ERROR_SESSION_CREDENTIAL_CONFLICT) si j'ai déjà un lecteur mappé sur le serveur spécifié. Je ne sais pas ce dont il a besoin pour éviter cela, mais cela fonctionne bien si je me connecte à un serveur auquel je n'ai pas de connexion existante.
J'espère que cela t'aides,
John
Re : Mapper un lecteur réseau avec une DLLVous ne dites pas quelle version de JMP vous utilisez, mais si vous êtes en mesure d'utiliser JMP 11, vous pouvez le faire avec la nouvelle commande Exécuter le programme.
Run Program( Executable("net.exe"), Options("use z: \\myserver\share") );et pour démapper le lecteur
Run Program( Executable("net.exe"), Options("use z: /del") );Cela équivaut à exécuter "net use z : \\monserveur\partage " à partir d'une invite de commande.
John