我已经开始为旧的基于Z80的机器开发SMB服务器.这台机器运行一个非常简单的,类似MS-DOS的操作系统(没有多任务,没有用户的概念,只有FAT文件系统,没有unicode,只有8.3文件名)并且内存有限,因此我的第一个想法就是只实现SMB核心协议.我将使用TCP传输.
至于现在,我只有一个非常短的测试代码,只是回复SMB_COM_NEGOTIATE命令,表明核心协议("PC NETWORK PROGRAM 1.0")是所需的方言.为了测试它,我尝试通过打开资源管理器窗口并输入"\\<server IP>"地址栏从Windows 7计算机连接.我已经与Wireshark验证了服务器收到协商命令并发送(显然)正确的响应.
问题:一旦Windows客户端收到响应,它就会显示一个通用的"无法访问资源"错误消息(错误代码为0x80004005),然后没有任何反应(不再发送SMB消息).我期待收到SMB_COM_TREE_CONNECT或类似的命令.
我在想,也许Windows 7不支持核心协议(它很老,而且它没有任何安全功能),但是,为什么它会在协商请求中列出核心方言名称?也许我错过了一些步骤?服务器必须在协商响应后发送任何其他数据包吗?
客户端操作系统是Windows 7 Ultimate 64位,以下是请求和响应的Wireshark转储,以防任何人在此过程中发现任何错误:
请求:

响应:

更新:如果我选择NT LM 0.12方言而不是核心方言,我会从客户端收到一个SESSION_SETUP_AND_REQUESTX命令.显然,似乎确实,Windows 7不支持核心协议.无论如何,任何额外的信息都将受到赞赏.
我相信 Windows 7 确实支持核心协议。当连接到较旧的服务器时,它会降级到 SMB 1.0(按照此处)。
\n\n根据 Windows 7 连接到 Samba 服务器时遇到的问题,我认为指定核心协议的问题是由于 Windows 7 计算机上的 LANMAN 工作站/客户端设置造成的。
\n\n建议的更改是
\n\nNetwork security: LAN Manager authentication level Send LM & NTLM responses\xe3\x80\x90HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Control\\Lsa \\\xe3\x80\x90LmCompatibilityLevel \xe3\x80\x91将注册表项的值更改为 0将以下参数添加到注册表中的 LanmanWorkStation 和 NetLogon \n HKLM\\System\\CCS\\Services\\LanmanWorkstation\\Parameters\n    DWORD  DomainCompatibilityMode = 1\n   DWORD  DNSNameResolutionRequired = 0
HKLM\\System\\CCS\\Services\\Netlogon\\Parameters\n    DWORD  RequireSignOnSeal = 0\n   DWORD  RequireStrongKey = 0
此处列出了通过注册表和安全策略对这些设置可能进行的更改
这些更改应确保 LanmanWorkstation 不使用 NTLMv2 会话安全性。
\n| 归档时间: | 
 | 
| 查看次数: | 5810 次 | 
| 最近记录: |