Поддерживает ли Windows 7 основной протокол SMB?
Я начал разработку сервера SMB для старой машины на базе Z80. Эта машина работает с очень простой операционной системой MS-DOS (без многозадачности, без концепции пользователей, только с файловой системой FAT, без юникода, только с именами файлов 8.3) и имеет ограниченную память, поэтому моя первая идея - реализовать только основной протокол SMB, Я буду использовать TCP-транспорт.
На данный момент у меня есть очень короткий код тестирования, который просто отвечает команде SMB_COM_NEGOTIATE, указывая, что основным протоколом ( "PC NETWORK PROGRAM 1.0" ) является желаемый диалект. Чтобы проверить его, я пытаюсь подключиться к машине с Windows 7, открыв окно проводника и набрав "\\<server IP>"
в адресной строке. Я проверил с Wireshark, что сервер принимает команду согласования и отправляет (по-видимому) правильный ответ.
Проблема:, как только клиент Windows получит ответ, он показывает общее сообщение об ошибке "Не удается получить доступ" (с кодом ошибки 0x80004005), а затем ничего не происходит (никаких дополнительных SMB сообщения отправляются). Я ожидал получить SMB_COM_TREE_CONNECT или аналогичную команду.
Я думал, что, возможно, Windows 7 не поддерживает основной протокол (он очень старый, и в нем нет какой-либо функции безопасности), но почему, почему он перечисляет имя основного диалекта в запросе на переговоры? Может, я упустил какой-то шаг? Должен ли сервер отправлять дополнительный пакет после ответа на переговоры?
Клиентская ОС - это 64-разрядные версии Windows 7 Ultimate, и здесь дампы Wireshark как запроса, так и ответа в случае, если кто-то может обнаружить что-то неправильное в этом процессе:
Запрос:
![SMB dialect negotiate request]()
Ответ:
![SMB dialect negotiate response]()
UPDATE: Если я выбираю диалект NT LM 0.12 вместо основного диалекта, я получаю от клиента команду SESSION_SETUP_AND_REQUESTX. По-видимому, похоже, что основной протокол не поддерживается Windows 7. В любом случае, любая дополнительная информация будет оценена.
Ответы
Ответ 1
Я считаю, что Windows 7 поддерживает Core Protocol. Он понижает до SMB 1.0 при подключении к старым серверам по здесь.
Основываясь на проблемах, которые Windows 7 имеет при подключении к серверам Samba, я считаю, что проблема с указанием основного протокола связана с параметрами рабочей станции/клиента LANMAN на компьютере под управлением Windows 7.
Рекомендуемые изменения:
- включение хешей LM и NTLM в качестве части политики безопасности:
Network security: LAN Manager authentication level Send LM & NTLM responses
- изменение значения
【HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa \【LmCompatibilityLevel 】
ключа реестра на 0 по здесь
-
Добавление следующих параметров в LanmanWorkStation и NetLogon в реестр
HKLM\System\CCS\Services\LanmanWorkstation\Parameters
DWORD DomainCompatibilityMode = 1
DWORD DNSNameResolutionRequired = 0
HKLM\System\CCS\Services\Netlogon\Parameters
DWORD RequireSignOnSeal = 0
DWORD RequireStrongKey = 0
Возможные изменения этих параметров как с помощью реестра, так и с помощью политики безопасности перечислены здесь
Эти изменения должны гарантировать, что LanmanWorkstation не использует безопасность сеанса NTLMv2.
Ответ 2
Эта информация в основном такая же, как @Appleman1234 предоставляется (спасибо!), немного проще применять.
- Экспортируйте текущие настройки reg, чтобы вы могли восстановить то, что у вас было, если необходимо. Поместите следующий код в файл
.bat
, и он будет экспортировать в ваш диск C:
3 ключа reg, которые мы готовим для изменения.
reg export HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa HKEY_LOCAL_MACHINE.SYSTEM.CurrentControlSet.Control.Lsa.reg
reg export HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\LanmanWorkstation\Parameters HKEY_LOCAL_MACHINE.SYSTEM.CurrentControlSet.services.LanmanWorkstation.Parameters.reg
reg export HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\Netlogon\Parameters HKEY_LOCAL_MACHINE.SYSTEM.CurrentControlSet.services.Netlogon.Parameters.reg
- Отмените необходимые настройки реестра. Ниже приведено почти то, что предложил @Appleman1234, за исключением того, что он также позволяет использовать простые текстовые пароли и отключает подписи безопасности. Поместите следующий код в файл
.reg
и импортируйте его в свой реестр.
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa]
"lmcompatibilitylevel"=dword:00000000
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\LanmanWorkstation\Parameters]
"EnablePlainTextPassword"=dword:00000001
"EnableSecuritySignature"=dword:00000000
"RequireSecuritySignature"=dword:00000000
"DomainCompatibilityMode"=dword:00000001
"DNSNameResolutionRequired"=dword:00000000
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\Netlogon\Parameters]
"RequireSignOrSeal"=dword:00000000
"RequireStrongKey"=dword:00000000
"RequireSignOnSeal"=dword:00000000