我正在制作一些使用NetUseAdd和NetUseDel函数连接/断开共享的工具。在Windows 7中,我注意到在调用NetUseDel和真正的disconnnection之间通过将近12秒。 我做了一些调查,发现net use \ server / del也只在12秒后断开连接。这是一个小脚本和Wireshark输出,对应于脚本运行:
net use \\server "" /user:""
net use \\server /delete
http://i.stack.imgur.com/5CyCw.png
设置last tree connect smb命令作为参考,我们可以看到,树断开延迟了12秒。
有谁知道如何减少这种超时?
答案 0 :(得分:1)
连接可以保持活力有时甚至超过12秒。 诀窍是删除后强制登录。
如果您强行登录错误,则该份额将立即无法访问。我们可以使用本地Guest帐户(它通常会出现错误"登录失败:帐户当前已禁用。"即使启用它也无法访问)。
而不仅仅是:
net use \\server /delete
我们将执行:
net use \\server /delete
net use \\server "" /user:"Guest"
net use \\server /delete 2>nul
执行第三行是为了防止Guest登录成功(它使用 2> nul 将错误流重定向到nul设备,以避免显示任何错误消息)。
这是使用" net use"的批量版本。命令,但是当使用来自netapi32.dll的NetUseAdd和NetUseDel,或者来自mpr.dll的WNetAddConnection和WNetCancelConnection时,可以应用相同的解决方案。
答案 1 :(得分:0)
为什么要延迟断线?超时的重点是从根本上缓存共享,因为Windows知道如果你访问一次共享,你可能会再次这样做。它不想浪费时间不断设置和拆除一个很容易被打开的连接,因此它会延迟关闭它。
如果您需要访问共享,那么可以帮助您。不要担心删除它,以便您可以重新创建它;只是使用它。
答案 2 :(得分:0)
由于SMB客户端内核驱动程序处理这些请求,您无法控制它何时实际断开连接,您遇到的12秒延迟实际上只是内核处理程序用于终止底层tcp连接的时间。作为一种解决方法,我会使用NetUseEnum来验证在带有计数器的while循环中实际删除了连接。
您可以看到我的答案here,了解有关如何创建多个连接的更多信息,不使用其他smb实现或每个连接创建一个Windows工作站,但运气不佳。