Asignación de una unidad de red con una DLL<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Hola,
Me gustaría poder asignar (y luego desasignar) a una unidad de red específica como parte de un archivo JSL usando una DLL. Al hablar con algunas personas internas de TI, me indicaron mpr.dll y las funciones WNetAddConnection2 y WNetCancelConnection2. Sin embargo, no soy un programador experto y aunque he mirado los ejemplos en la Guía de secuencias de comandos y los ejemplos en este foro de discusión (que hacen cosas asombrosas) no puedo hacer que el mío funcione. Además, nunca antes había llamado a una DLL en ninguna programación que haya hecho... ¿Hay alguien que pueda ayudarme?
El código que he improvisado hasta ahora (de un colega de TI que leyó el archivo de ayuda pero no conoce JMP) se encuentra a continuación. ¿Alguien puede ver errores obvios? Agradecería mucho la ayuda...
Gracias
colin
(Lo siento, no se formateó bien. Probé algunas opciones pero se veían raras)
// el nombre de usuario, la contraseña y la ubicación del mapa de red se han cambiado para pegarlos aquí
//Cargar la DLL requerida
dll_obj = Cargar Dll("mpr.dll");
//Asigne constantes a los miembros de la estructura; consulte la lista de constantes a continuación como referencia
// Estos se definen en la dll como DWORD (enteros positivos sin signo)
dwScope = HexToNumber("00000002"); //&H2;
dwType = HexToNumber("00000001"); //&H1;
dwDisplayType = HexToNumber("00000003"); //&H3;
dwUsage = HexToNumber("00000001"); //&H1;
dwFlags = HexToNumber("00000004"); //&H4;
lpNombreLocal = "Z:";
lpRemoteName = " \\10.254.1.1\!unidad\ ";
lpComentario = "";
lpProvider = "";
lpPassword = "contraseña"; // Contraseña de red
lpUserName = "dominio\nombre de usuario";
//Declarar función exportada y establecer alias
dll_obj << DeclararFunción(
"WNetAddConnection2",
Alias("MapNetworkDrive"),
EstructuraArg(
Arg(Int32, "dwScope"),
Arg(Int32, "tipodw"),
Arg(Int32, "dwDisplayType"),
Arg(Int32, "usodw"),
Arg(AnsiString, "lpNombreLocal"),
Arg(AnsiString, "lpRemoteName"),
Arg(AnsiString, "lpComentario"),
Arg(AnsiString, "lpProvider"),
"RECURSO DE RED",
aporte
),
Arg(AnsiString, "lpContraseña", entrada),
Arg(AnsiString, "lpUserName", entrada),
Arg(Int32, "dwFlags", entrada),
Devoluciones (Int32)
);
//Procesamiento de funciones - unidad de mapa
/* Sintaxis de llamada de función DLL
dll_obj << Alias(
Estructura (cada argumento),
Contraseña Arg,
nombre de usuario Arg,
DWFlagsArg
);
*/
resultado = dll_obj << MapNetworkDrive(
alcance,
tipo dw,
tipo de pantalla dw,
uso de dw,
lpNombreLocal,
lpNombreRemoto,
lpComentario,
proveedor de lp,
contraseña lp,
lpUsuarioNombre,
dwFlags
);
// La conexión exitosa debe devolver 0 (NO_ERROR)
// Descargar DLL
dll_obj << DescargarDll
Re: Asignación de una unidad de red con una DLLPara desasignar la unidad, esto funciona para mí:
dll_obj << DeclareFunction(
"WNetCancelConnection2A",
Alias("UnmapNetworkDrive"),
Arg(AnsiString, "lpName", input),
Arg(Int32, "dwFlags", input),
Arg(Int32, "fForce", input),
Returns(Int32)
);
Llámalo:
result = dll_obj << UnmapNetworkDrive(
lpLocalName,
0,
0, // 1=force connection closed even if files are opened
);
Re: Asignación de una unidad de red con una DLLTuve cierto éxito al usar la API que mencionaste con algunos cambios. Aquí están mis cambios:
* Cambiado para usar WNetAddConnection2A, la 'A' significa Ansi, por lo que debe llamar a esta versión. Podría usar WNetAddConnection2W si especificó UnicodeString en sus Args.
* Cambió lpProvider a un Int64 para poder pasar 0 (NULL) para el proveedor.
//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)
);
Llame con cero para que el proveedor permita que el sistema operativo seleccione el proveedor.
result = dll_obj << MapNetworkDrive(
dwScope,
dwType,
dwDisplayType,
dwUsage,
lpLocalName,
lpRemoteName,
lpComment,
0, // lpProvider = NULL
lpPassword,
lpUserName,
dwFlags
);
Una advertencia que encontré es que devuelve 1219 (ERROR_SESSION_CREDENTIAL_CONFLICT) si ya tengo una unidad asignada al servidor especificado. No estoy seguro de lo que necesita allí para evitar eso, pero funciona bien si me conecto a un servidor al que no tengo una conexión existente.
Espero que esto ayude,
John
Re: Asignación de una unidad de red con una DLLNo dice qué versión de JMP está usando, pero si puede usar el JMP 11 recién lanzado, puede hacerlo con el nuevo comando Ejecutar programa.
Run Program( Executable("net.exe"), Options("use z: \\myserver\share") );y para desasignar la unidad
Run Program( Executable("net.exe"), Options("use z: /del") );Esto es equivalente a ejecutar "net use z: \\miservidor\compartir " desde un símbolo del sistema.
John