一、问题来源:



  dell5460笔记本上一个winxp系统虚拟机,访问一台lenovoT470笔记本win10教育版系统上的共享资源(使用命令行方式:net use s: \\172.18.45.105\d),总是提示“发生系统错误 64。指定的网络名不再可用。”,而dell5460笔记本的win10企业版访问其共享资源却正常。


二、处理过程:



  在win10教育版和winxp系统中调了很多参数都无法解决问题,后来经仔细思考,认为应该与smb协议的版本相关。在win10教育版机上安装wireshark抓包工具,分别抓取从winxp和win10企业版机访问其共享目录的数据包,明显看到win10企业版的数据包主要是SMB2协议的数据包,而winxp的数据包只有SMB数据包。由此,基本确定猜想方向正确。检查“控制面板”——“程序和功能”——“启用或关闭Windows功能”中“SMB 1.0/CIFS文件共享支持”的“SMB 1.0/CIFS服务器”的确没有勾选,勾选后,仍然没有共享成功。分析,因为win10同时支持smb1,smb2和smb3,虽然smb1的支持已打开,但是不能保证机器就会以smb1相应访问请求。继续查找网上资料,发现在微软官网上有一篇关于侦测、启用和停用smb1、2、3的方法,按照这篇文章的指示,修改win10教育版的注册表,在“HKLM:\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters”中新建“DWORD (32位)值”,命名为“SMB1”,其数值设为十六进制“1”,表示强制响应SMBv1协议。注册表修改后必须重启电脑使其生效。重启后,再从winxp访问win10教育版共享资源,成功!!!




三、小结:


1、按理说,在启用和关闭windows功能中勾选SMB 1.0/CIFS服务器后应该启用了对SMBv1的响应功能,但是,该win10教育版却没有对smbv1给予响应,只有通过修改注册表强制响应smbv1协议。这说明win10教育版应存在一定的bug或限制。配置smbv1强制响应后,再测win10企业版访问win10教育版的共享目录,不受影响,观察抓包,win10企业版的数据包的确是SMBv2协议包。这说明,win10教育版虽然强制了对smbv1的响应,对于收到的smbv2数据包也能正常响应。



2、受修改注册表方法的启发,观察win10企业版的注册表与win10教育版的注册表情况,在“HKLM:\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters”中发现win10企业版多两个DWORD值,如下图所示:

win10 教育版系统 安装docker 教育版的win10_企业版


试着在win10教育版机的注册表相同位置添加上述这两个值,重启电脑后再作winxp对win10教育版的共享访问测试,成功!这说明AdjustedNullSessionPipes这个项目就是调整如何接收SMB各个版本的数据包的关键选项。



3、在win10教育版机器上,用管理员权限启动powershell,输入命令:Get-WindowsOptionalFeature -Online -FeatureName SMB1Protocol 或 Get-SmbServerConfiguration | Select EnableSMB1Protocol, EnableSMB2Protocol,可看到smbv1的协议情况,如下:

PS C:\Windows\system32>  Get-WindowsOptionalFeature -Online -FeatureName SMB1Protocol

FeatureName      : SMB1Protocol

DisplayName      : SMB 1.0/CIFS 文件共享支持

Description      : 支持 SMB 1.0/CIFS 文件共享协议和计算机浏览器协议。

RestartRequired  : Possible

State            : Enabled

CustomProperties :

            ServerComponent\Description : 支持 SMB 1.0/CIFS 文件共享协议和计算机浏览器协议。

            ServerComponent\DisplayName : SMB 1.0/CIFS 文件共享支持

            ServerComponent\Id : 487

            ServerComponent\Type : Feature

            ServerComponent\UniqueName : FS-SMB1

            ServerComponent\Deploys\Update\Name : SMB1Protocol