Как избежать 12-секундной задержки при отключении от общего ресурса в Windows 7?
Я делаю некоторые утилиты, которые используют функции NetUseAdd и NetUseDel для подключения / отключения, чтобы поделиться. В Windows 7 я заметил, что между вызовом NetUseDel и реальным отключением проходит почти 12 секунд. Я провел некоторые исследования и обнаружил, что net use \server /del также отключается только через 12 секунд. Вот небольшой скрипт и вывод Wireshark, соответствующий запуску скрипта:
net use \\server "" /user:""
net use \\server /delete
Задав команду last tree connect smb в качестве ссылки, мы видим, что отключение дерева задерживается на 12 секунд.
Кто-нибудь знает, как сократить такой тайм-аут?
3 ответа
Связь может оставаться в живых иногда даже более 12 секунд. Хитрость заключается в том, чтобы принудительно ввести неверный логин после удаления.
Если вы введете неверный логин, то ресурс будет немедленно недоступен. Для этого мы можем использовать локальную гостевую учетную запись (обычно она выдает ошибку "Ошибка входа: учетная запись в настоящее время отключена", и даже если она включена, доступ к ней не будет).
Вместо просто:
net use \\server /delete
Мы выполним:
net use \\server /delete
net use \\server "" /user:"Guest"
net use \\server /delete 2>nul
Третья строка выполняется на случай, если гостевой логин преуспеет (для перенаправления потока ошибок на устройство nul используется 2>nul, чтобы избежать отображения сообщений об ошибках).
Это пакетная версия, в которой используется команда "net use", но то же решение можно применить при использовании NetUseAdd и NetUseDel из netapi32.dll или WNetAddConnection и WNetCancelConnection из mpr.dll.
Так как драйвер ядра клиента SMB обрабатывает этот запрос, вы не можете контролировать, когда он фактически отключится, 12-секундная задержка, которую вы испытываете, фактически равна времени, которое обработчик ядра потребовал, чтобы разорвать лежащее в основе соединение tcp. В качестве обходного пути я бы использовал NetUseEnum, чтобы убедиться, что соединение было действительно удалено в цикле while со счетчиком.
Вы можете увидеть мой ответ здесь для получения дополнительной информации о том, как создать несколько соединений, за исключением использования другой реализации smb или создания рабочей станции Windows для каждого соединения, которое вам не повезло.
Почему вы хотите отложить отключение? Весь смысл тайм-аута заключается в том, чтобы по существу кэшировать общий ресурс, поскольку Windows знает, что если вы получите один доступ к общему ресурсу, вы, вероятно, сделаете это снова. Он не хочет тратить время на постоянную настройку и разрыв соединения, которое можно легко оставить открытым, поэтому затягивает его закрытие.
Если вам нужен доступ к общему ресурсу, это поможет вам. Не беспокойтесь об удалении, чтобы вы могли восстановить его; просто используйте это.