Mappatura di un'unità di rete con una DLL<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Ciao,
Mi piacerebbe essere in grado di mappare (e quindi annullare la mappatura) su una specifica unità di rete come parte di un file JSL usando una DLL. Parlando con alcune persone IT interne mi hanno indicato le funzioni mpr.dll e WNetAddConnection2 e WNetCancelConnection2. Tuttavia, non sono un programmatore esperto e quindi, anche se ho esaminato gli esempi nella guida di scripting e gli esempi su questo forum (che fanno cose incredibili) non riesco a far funzionare il mio. Inoltre, non ho mai chiamato una DLL prima in nessuna programmazione che ho fatto ... C'è qualcuno che può darmi una mano?
Il codice che ho messo insieme fino a quel momento (da un collega IT che ha letto il file della guida ma non conosce JMP) è sotto. Qualcuno può vedere errori evidenti? Apprezzerei molto l'aiuto ...
Grazie
Colin
(Scusa non si è formattato bene. Ho provato alcune opzioni ma sembravano strane)
// username, password, posizione della mappa di rete sono stati tutti modificati per incollare qui
// Carica la DLL richiesta
dll_obj = Carica Dll ("mpr.dll");
// Assegna costanti ai membri della struttura: consulta l'elenco delle costanti di seguito per riferimento
// Questi sono definiti nella DLL come DWORD (interi positivi senza segno)
dwScope = HexToNumber ("00000002"); // & H2;
dwType = HexToNumber ("00000001"); // & H1;
dwDisplayType = HexToNumber ("00000003"); // & H3;
dwUsage = HexToNumber ("00000001"); // & H1;
dwFlags = HexToNumber ("00000004"); // & H4;
lpLocalName = "Z:";
lpRemoteName = " \\ 10.254.1.1 \! Unità \ ";
lpComment = "";
lpProvider = "";
lpPassword = "password"; // Password di rete
lpUserName = "dominio \ nome utente";
// Dichiara la funzione esportata e imposta l'alias
dll_obj << DeclareFunction (
"WNetAddConnection2",
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"),
"NETRESOURCE",
ingresso
),
Arg (AnsiString, "lpPassword", input),
Arg (AnsiString, "lpUserName", input),
Arg (Int32, "dwFlags", input),
Returns (Int32)
);
// Elaborazione delle funzioni: unità mappa
/ * Sintassi della chiamata della funzione DLL
dll_obj << Alias (
Struttura (ogni Arg),
PasswordArg,
UsernameArg,
DWFlagsArg
);
* /
risultato = dll_obj << MapNetworkDrive (
dwScope,
dwType,
dwDisplayType,
dwUsage,
lpLocalName,
lpRemoteName,
lpComment,
lpProvider,
lpPassword,
lpUserName,
dwFlags
);
// La connessione riuscita dovrebbe restituire 0 (NO_ERROR)
// Scarica DLL
dll_obj << UnloadDll
Oggetto: mappatura di un'unità di rete con una DLLPer rimuovere il mapping dell'unità, questo funziona per me:
dll_obj << DeclareFunction(
"WNetCancelConnection2A",
Alias("UnmapNetworkDrive"),
Arg(AnsiString, "lpName", input),
Arg(Int32, "dwFlags", input),
Arg(Int32, "fForce", input),
Returns(Int32)
);
Chiamalo:
result = dll_obj << UnmapNetworkDrive(
lpLocalName,
0,
0, // 1=force connection closed even if files are opened
);
Oggetto: mappatura di un'unità di rete con una DLLHo avuto un certo successo usando l'API che hai citato con alcune modifiche. Ecco le mie modifiche:
* Cambiato per utilizzare WNetAddConnection2A il 'A' significa Ansi quindi è necessario chiamare questa versione. È possibile utilizzare WNetAddConnection2W se è stato specificato UnicodeString in Args.
* Modificato lpProvider in un Int64 per poter passare 0 (NULL) per il provider.
//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)
);
Chiamare con zero affinché il provider consenta al sistema operativo di selezionare il provider.
result = dll_obj << MapNetworkDrive(
dwScope,
dwType,
dwDisplayType,
dwUsage,
lpLocalName,
lpRemoteName,
lpComment,
0, // lpProvider = NULL
lpPassword,
lpUserName,
dwFlags
);
Un avvertimento che ho trovato è che restituisce 1219 (ERROR_SESSION_CREDENTIAL_CONFLICT) se ho già un'unità mappata al server specificato. Non sono sicuro di cosa ha bisogno per evitarlo, ma funziona bene se mi collego a un server a cui non ho una connessione esistente.
Spero che questo ti aiuti,
John
Oggetto: mappatura di un'unità di rete con una DLLNon si specifica la versione di JMP che si sta utilizzando, ma se si è in grado di utilizzare JMP 11 a rilascio semplice, è possibile farlo con il nuovo comando Esegui programma.
Run Program( Executable("net.exe"), Options("use z: \\myserver\share") );e per annullare la mappatura dell'unità
Run Program( Executable("net.exe"), Options("use z: /del") );Questo è equivalente all'esecuzione di "net use z: \\ myserver \ share "da un prompt dei comandi.
John