使用 DLL 映射网络驱动器<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />你好,
我希望能够映射(然后取消映射)到特定的网络驱动器,作为使用 DLL 的 JSL 文件的一部分。 通过与一些内部 IT 人员交谈,他们向我指出了 mpr.dll 以及 WNetAddConnection2 和 WNetCancelConnection2 函数。 然而,我不是一个专业的程序员,所以即使我查看了脚本指南中的示例和这个讨论板上的示例(它们做了很棒的事情),我也无法让我的工作。 此外,我以前从未在我做过的任何编程中调用过 DLL... 有人可以帮助我吗?
到目前为止,我拼凑的代码(来自阅读帮助文件但不了解 JMP 的 IT 同事)如下。 任何人都可以看到明显的错误吗? 我真的很感激你的帮助......
谢谢
科林
(对不起,它没有很好地格式化。 我尝试了一些选项,但它们看起来很奇怪)
// 用户名、密码、网络地图位置都已更改,以便粘贴到此处
//加载需要的DLL
dll_obj = 加载 Dll("mpr.dll");
//将常量分配给结构成员 - 请参阅下面的常量列表以供参考
// 这些在 dll 中定义为 DWORD(无符号正整数)
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\!驱动器\ ";
lpComment = "";
lpProvider = "";
lpPassword = "密码"; // 网络密码
lpUserName = "域\用户名";
//声明导出函数并设置别名
dll_obj << 声明函数(
"WNetAddConnection2",
别名(“MapNetworkDrive”),
结构参数(
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(AnsiString,“lpPassword”,输入),
Arg(AnsiString,“lpUserName”,输入),
Arg(Int32,“dwFlags”,输入),
返回(Int32)
);
//函数处理-地图驱动
/* DLL 函数调用语法
dll_obj <<别名(
结构(每个 Arg),
密码参数,
用户名Arg,
DWFlagsArg
);
*/
结果 = dll_obj << MapNetworkDrive(
dwScope,
dwType,
dwDisplayType,
dw用法,
lpLocalName,
lp远程名称,
lp评论,
lp提供者,
lp密码,
lp用户名,
dwFlags
);
// 成功的连接应该返回 0 (NO_ERROR)
// 卸载 DLL
dll_obj << UnloadDll
回复:使用 DLL 映射网络驱动器要取消映射驱动器,这对我有用:
dll_obj << DeclareFunction(
"WNetCancelConnection2A",
Alias("UnmapNetworkDrive"),
Arg(AnsiString, "lpName", input),
Arg(Int32, "dwFlags", input),
Arg(Int32, "fForce", input),
Returns(Int32)
);
叫它:
result = dll_obj << UnmapNetworkDrive(
lpLocalName,
0,
0, // 1=force connection closed even if files are opened
);
回复:使用 DLL 映射网络驱动器使用您提到的 API 并进行了一些更改,我取得了一些成功。 这是我的更改:
* 更改为使用 WNetAddConnection2A,“A”表示 Ansi,因此您需要调用此版本。 如果您在 Args 中指定了 UnicodeString,则可以使用 WNetAddConnection2W。
* 将 lpProvider 更改为 Int64,以便能够为提供程序传递 0 (NULL)。
//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)
);
使用零调用提供程序以让操作系统选择提供程序。
result = dll_obj << MapNetworkDrive(
dwScope,
dwType,
dwDisplayType,
dwUsage,
lpLocalName,
lpRemoteName,
lpComment,
0, // lpProvider = NULL
lpPassword,
lpUserName,
dwFlags
);
我发现的一个警告是,如果我已经有一个驱动器映射到指定的服务器,它会返回 1219 (ERROR_SESSION_CREDENTIAL_CONFLICT)。 不知道它需要什么来避免这种情况,但如果我连接到我没有现有连接的服务器,它工作正常。
希望这可以帮助,
约翰
回复:使用 DLL 映射网络驱动器您没有说明您使用的是哪个版本的 JMP,但如果您能够使用刚刚发布的 JMP 11,您可以使用新的运行程序命令来执行此操作。
Run Program( Executable("net.exe"), Options("use z: \\myserver\share") );并取消映射驱动器
Run Program( Executable("net.exe"), Options("use z: /del") );这相当于运行“net use z: \\我的服务器\共享" 在命令提示符下。
约翰