Как избежать 12-секундной задержки при отключении от общего ресурса в Windows 7? - PullRequest
5 голосов
/ 05 июля 2011

Я делаю некоторые утилиты, которые используют функции NetUseAdd и NetUseDel для подключения / отключения для совместного использования.В Windows 7 я заметил, что между вызовом NetUseDel и реальным отключением проходит почти 12 секунд.Я провел некоторые исследования и обнаружил, что net use \ server / del также отключается только через 12 секунд.Вот небольшой вывод скрипта и Wireshark, соответствующий запуску скрипта:

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

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

Установка последней команды подключения дерева smb в качестве ссылки, мы видим, что отключение дерева отложено на 12секунд.

Кто-нибудь знает, как сократить такой тайм-аут?

Ответы [ 3 ]

1 голос
/ 03 июля 2017

Связь может оставаться в живых иногда даже более 12 секунд. Хитрость заключается в том, чтобы принудительно ввести неверный логин после удаления.

Если вы введете неверный логин, то ресурс будет немедленно недоступен. Для этого мы можем использовать локальную гостевую учетную запись (обычно она выдает ошибку «Ошибка входа: учетная запись в настоящее время отключена.» И даже если она включена, у нее не будет доступа).

Вместо просто:

net use \\server /delete

Мы выполним:

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

Третья строка выполняется на случай, если гостевой логин преуспеет (используется 2> nul для перенаправления потока ошибок на устройство nul, чтобы избежать отображения сообщений об ошибках).

Это пакетная версия, в которой используется команда «net use», но то же решение можно применять при использовании NetUseAdd и NetUseDel из netapi32.dll или WNetAddConnection и WNetCancelConnection из mpr.dll.

0 голосов
/ 24 апреля 2017

Так как драйвер ядра клиента SMB обрабатывает этот запрос, вы не можете контролировать, когда он фактически отключится, 12-секундная задержка, которую вы испытываете, фактически равна времени, которое обработчик ядра потребовал, чтобы разорвать лежащее в основе соединение tcp.В качестве обходного пути я бы использовал NetUseEnum , чтобы убедиться, что соединение действительно было удалено в цикле while со счетчиком.

мой ответ здесь для получения дополнительной информации.о том, как создать несколько соединений, если не использовать другую реализацию smb или создать рабочую станцию ​​Windows для каждого соединения, вам не повезло.

0 голосов
/ 05 июля 2011

Почему вы хотите отложить отключение? Весь смысл тайм-аута заключается в том, чтобы по существу кэшировать общий ресурс, поскольку Windows знает, что если вы один раз получите доступ к общему ресурсу, вы, вероятно, сделаете это снова. Он не хочет тратить время на постоянную настройку и разрыв соединения, которое можно легко оставить открытым, поэтому затягивает его закрытие.

Если вам нужен доступ к общему ресурсу, тогда этот поможет вам . Не беспокойтесь об удалении, чтобы вы могли восстановить его; просто используйте его.

...