2011-07-05 28 views
4

我正在做一些使用NetUseAdd和NetUseDel函數來連接/斷開連接的utils。在Windows 7中,我注意到在調用NetUseDel和真正的隔離之間差不多12秒。 我做了一些調查,發現淨使用\服務器/德爾也只在12秒後分離。這裏的小腳本和Wireshark輸出,相當於運行腳本:如何避免從Windows 7共享中分離12秒?

net use \\server "" /user:"" 
net use \\server /delete 

http://i.stack.imgur.com/5CyCw.png

設置最後一棵樹連接SMB命令作爲參考,我們可以看到,該樹斷開延遲12秒。

有誰知道如何削減此類超時?

回答

0

爲什麼要延遲斷開連接?由於Windows知道如果您訪問共享一次,您可能會再次這樣做,因此超時的整個目的就是實質上緩存共享。它不想浪費時間繼續設置並拆除可能容易打開的連接,因此它會延遲關閉連接。

如果您需要訪問該共享,那麼這幫助你。不要擔心刪除它,以便您可以重新創建它;只是用它。

+4

我理解這樣的緩存優勢,但在我當前的任務,我需要訪問共享單臺主機上有不同的憑據,而這樣做緩存重新連接了一個大麻煩 - 它緩存最後憑證的權利。 – kizill

0

由於SMB客戶端內核驅動程序處理這些請求,你無法控制時,它實際上將斷開連接,12秒延遲遇到實際上只是內核處理器走上殺底層TCP連接的時間。作爲解決方法,我將使用NetUseEnum來驗證連接是否在具有計數器的while循環中被實際刪除。

你可以看到我的回答here瞭解更多關於如何創建多個連接,使用其他smb實現或使用其他連接創建windows工作站的更多信息。

0

的connecion有時活路甚至超過12秒。 訣竅是在刪除後強制登錄失敗。

如果強制錯誤的登錄,則份額將立刻無法訪問。我們可以使用本地Guest帳戶(通常會給出錯誤「登錄失敗:帳戶當前禁用」,即使啓用它也不會訪問)。

而不只是:

net use \\server /delete 

我們將執行:

net use \\server /delete 
net use \\server "" /user:"Guest" 
net use \\server /delete 2>nul 

第三行,以防萬一執行訪客登錄succedes(它usses 2>錯誤流重定向NUL到無線設備,以避免顯示任何錯誤信息)。

這是使用「net use」命令的批處理版本,但在使用netapi32.dll中的NetUseAdd和NetUseDel,或使用mpr.dll中的WNetAddConnection和WNetCancelConnection時,可以應用相同的解決方案。