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

Я делаю несколько утилит, которые используют функции 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

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

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


person kizill    schedule 05.07.2011    source источник


Ответы (3)


Соединение может сохраняться иногда даже более 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.

person Cosmin Rus    schedule 03.07.2017

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

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

person dlev    schedule 05.07.2011
comment
Я понимаю преимущества такого кэширования, но в моей текущей задаче мне нужно получить доступ к общим ресурсам на одном хосте с разными учетными данными, и такое кэширование делает переподключение большой проблемой - оно кэширует последние права учетных данных. - person kizill; 07.07.2011

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

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

person Jonathan Allon    schedule 24.04.2017