本文介绍如何在SMB客户端和服务器组件上启用/禁用服务器消息块SMBv1、SMBv2和SMBv3。
注意
建议由专业技术工程师完成本文的操作。
我们建议不要禁用SMBv2或SMBv3。禁用SMBv2或SMBv3只能作为临时故障排除措施。请勿使 SMBv2或SMBv3保持禁用状态。
禁用SMBv2的影响
在Windows 7和Windows Server 2008 R2中,禁用SMBv2会停用以下功能:
请求复合:允许发送多个SMB 2请求作为单个网络请求
大型读写:更好地利用更快速的网络
文件夹和文件属性缓存:客户端保留文件夹和文件的本地副本
持久句柄:如果临时断开连接,则允许连接以透明方式重新连接到服务器
改进的消息签名:HMAC SHA-256代替MD5作为哈希算法
改进的文件共享扩展性:每个服务器的用户数量、共享数量和打开文件数量大大增加
支持符号链接
客户端oplock租赁模式:限制在客户端和服务器之间传输的数据,从而提高高延迟网络性能并增强SMB 服务器的扩展性
大型MTU支持:可充分利用10千兆字节 (GB) 以太网
改进的能效:向服务器打开文件的客户端可以睡眠
禁用SMBv3的影响
在Windows 8、Windows 8.1、Windows 10、Windows Server 2012和Windows Server 2016中,禁用 SMBv3会停用以下功能(以及以上列表中所述的SMBv2功能):
透明故障转移 :在维护或故障转移期间,客户端会重新连接,不会干扰集群节点
扩展:并发访问所有文件集群节点上的共享数据
多通道:如果客户端和服务器之间有多个路径可用时,则聚合网络带宽和容错
SMB直通:增加RDMA网络支持,实现极高的性能、低延迟和低CPU利用率
加密:提供端到端加密,并防止不可靠网络上的窃听
目录租赁:通过缓存改进分支机构中应用程序的响应时间
性能优化:对小型I/O随机读/写的优化
在SMB服务器上启用/禁用SMB协议
Windows 8和 Windows Server 2012
Windows 8和Windows Server 2012引入了新的Set-SMBServerConfiguration Windows PowerShell cmdlet。 通过此cmdlet,你可以在服务器组件上启用或禁用SMBv1、SMBv2 和 SMBv3协议。
说明
因为SMBv2和SMBv3共用一个堆叠,所以在Windows 8或Windows Server 2012中启用或禁用 SMBv2时,也会启用或禁用SMBv3。
使用PowerShell cmdlet
运行Set-SMBServerConfigurationcmdlet后,无须重启计算机。
若要获取SMB服务器协议配置的当前状态,请运行以下cmdlet:
Get-SmbServerConfiguration | Select EnableSMB1Protocol, EnableSMB2Protocol
若要在SMB服务器上禁用SMBv1,请运行以下cmdlet:
Set-SmbServerConfiguration -EnableSMB1Protocol $false
若要在SMB服务器上禁用SMBv2和SMBv3,请运行以下cmdlet:
Set-SmbServerConfiguration -EnableSMB2Protocol $false
若要在SMB服务器上启用SMBv1,请运行以下cmdlet:
Set-SmbServerConfiguration -EnableSMB1Protocol $true
若要在SMB服务器上启用SMBv2和SMBv3,请运行以下cmdlet:
Set-SmbServerConfiguration -EnableSMB2Protocol $true
Windows 7、Windows Server 2008 R2、Windows Vista和 Windows Server 2008
若要在运行Windows 7、Windows Server 2008 R2、Windows Vista或Windows Server 2008的SMB服务器上启用或禁用SMB协议,请使用Windows PowerShell或注册表编辑器。
使用Windows PowerShell 2.0或更高版本的PowerShell
若要在SMB服务器上禁用SMBv1,请运行以下cmdlet:
Set-ItemProperty -Path "HKLM:SYSTEMCurrentControlSetServicesLanmanServerParameters" SMB1 -Type DWORD -Value 0 -Force
若要在SMB服务器上禁用SMBv2和SMBv3,请运行以下cmdlet:
Set-ItemProperty -Path "HKLM:SYSTEMCurrentControlSetServicesLanmanServerParameters" SMB2 -Type DWORD -Value 0 -Force
若要在SMB服务器上启用SMBv1,请运行以下cmdlet:
Set-ItemProperty -Path "HKLM:SYSTEMCurrentControlSetServicesLanmanServerParameters" SMB1 -Type DWORD -Value 1 -Force
若要在SMB服务器上启用SMBv2和SMBv3,请运行以下cmdlet:
Set-ItemProperty -Path "HKLM:SYSTEMCurrentControlSetServicesLanmanServerParameters" SMB2 -Type DWORD -Value 1 -Force
注意
进行这些更改后,必须重启计算机。
使用注册表编辑器
以下内容包含有关如何修改注册表的信息。
注意
修改注册表之前,一定要先对其进行备份。并且一定要知道在发生问题时如何还原注册表。有关如何备份、还原和修改注册表的更多信息,请查看 如何在 Windows 中备份和还原注册表。
若要在SMB服务器上启用或禁用SMBv1,请配置以下注册表项:
注册表子项:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters 注册表项: SMB1
REG_DWORD: 0 = 已禁用
REG_DWORD: 1 = 已启用
默认值: 1 = 已启用
若要在 SMB 服务器上启用或禁用SMBv2,请配置以下注册表项:
注册表子项:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters 注册表项: SMB2
REG_DWORD: 0 = 已禁用
REG_DWORD: 1 = 已启用
默认值: 1 = 已启用
在SMB客户端上启用/禁用SMB协议
Windows Vista、Windows Server 2008、Windows 7、Windows Server 2008 R2、Windows 8和Windows Server 2012
注意
因为SMBv2和SMBv3共用一个堆叠,所以在Windows 8或Windows Server 2012中启用或禁用SMBv2 时,也会启用或禁用SMBv3。
若要在SMB客户端上禁用SMBv1,请运行以下命令:
sc.exe config lanmanworkstation depend= bowser/mrxsmb20/nsi
sc.exe config mrxsmb10 start= disabled
若要在SMB客户端上启用SMBv1,请运行以下命令:
sc.exe config lanmanworkstation depend= bowser/mrxsmb10/mrxsmb20/nsi
sc.exe config mrxsmb10 start= auto
若要在SMB客户端上禁用SMBv2和SMBv3,请运行以下命令:
sc.exe config lanmanworkstation depend= bowser/mrxsmb10/nsi
sc.exe config mrxsmb20 start= disabled
若要在SMB客户端上启用SMBv2和SMBv3,请运行以下命令:
sc.exe config lanmanworkstation depend= bowser/mrxsmb10/mrxsmb20/nsi
sc.exe config mrxsmb20 start= auto
注意
必须在提升的命令提示符中运行这些命令。
进行这些更改后,必须重启计算机。
使用组策略禁用SMBv1服务器
这将在注册表中配置以下新项:
HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesLanmanServerParameters 注册表项: SMB1 REG_DWORD: 0 = Disabled
使用组策略配置流程
打开组策略管理控制台。右键单击应包含新首选项的组策略对象 (GPO),然后单击编辑。
在计算机配置下的控制台树中,展开首选项文件夹,然后展开Windows 设置文件夹。
右键单击注册表节点,指向新建,然后选择注册表项。
sg1
在新建注册表属性对话框中,选择以下内容:
操作: 创建
Hive: HKEY_LOCAL_MACHINE
注册表项路径: SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters
值名称: SMB1
值类型: REG_DWORD
值数据: 0
sg2
将此组策略应用到域中所有必需的工作站、服务器和域控制器,以禁用 SMBv1 服务器组件。也可以将 WMI 筛选器设置为不包含不受支持的操作系统或选中的排除项(如 Windows XP)。
注意
在旧版Windows XP或Linux早期版本以及第三方系统(不支持SMBv2或SMBv3)需要访问 SYSVOL或其他文件共享(已启用SMB v1)的域控制器上进行这些更改时要谨慎小心。
使用组策略禁用SMBv1客户端
若要禁用SMBv1客户端,需要将服务注册表项更新为禁止MRxSMB10启动,然后还需要将MRxSMB10的依赖项从LanmanWorkstation项中删除,以便它可以正常启动(无需首先启动MRxSMB10)。
这将更新和替换注册表以下2个项中的默认值:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\mrxsmb10 注册表项: Start REG_DWORD: 4 = Disabled
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanmanWorkstation 注册表项: DependOnService REG_MULTI_SZ: “Bowser”,”MR
默认包含的 MRxSMB10 现已作为依赖项删除。
使用组策略配置流程
打开组策略管理控制台。右键单击应包含新首选项的组策略对象 (GPO),然后单击编辑。
在计算机配置下的控制台树中,展开首选项文件夹,然后展开Windows 设置文件夹。
右键单击注册表节点,指向新建,然后选择注册表项。
sg3
在新建注册表属性对话框中,选择以下内容:
操作: 更新
Hive: HKEY_LOCAL_MACHINE
注册表项路径: SYSTEM\CurrentControlSet\services\mrxsmb10
值名称: Start
值类型: REG_DWORD
值数据: 4
sg4
然后删除刚刚禁用的 MRxSMB10 的依赖项
在新建注册表属性对话框中,选择以下内容:
操作: 替换
Hive: HKEY_LOCAL_MACHINE
注册表项路径: SYSTEM\CurrentControlSet\Services\LanmanWorkstation
值名称: DependOnService
值类型 REG_MULTI_SZ
值数据:
Bowser
MRxSmb20
NSI
这 3 个字符串不带项目符号(具体如下):
在Windows的多个版本中,默认值包括MRxSMB10,通过将其替换为此多值字符串,实际上就删除了作为 LanmanServer依赖项的MRxSMB10,结果是从四个默认值减少为上述这三个值。
使用组策略管理控制台时,无需使用引号或逗号。只需在各行键入每个项,如上面所示。
需要重新启动
应用策略且正确设置注册表后,必须重新启动目标系统,然后才能禁用SMB v1。
摘要
如果所有设置均在同一组策略对象 (GPO) 中,组策略管理将显示以下设置。
sg6
测试和验证
配置完成后即允许策略进行复制和更新。作为测试的必要步骤,请从 CMD.EXE 提示符处运行 gpupdate/force,然后查看目标计算机,以确保注册表设置得以正确应用。确保 SMBv2 和 SMBv3 在环境中的所有其他系统中正常运行。
注意
请务必重新启动目标系统。
如何在 Windows 8.1、Windows 10、Windows 2012 R2和 Windows Server 2016中删除SMBv1
Windows Server:使用PowerShell (Remove-WindowsFeature FS-SMB1)
sg8
Windows客户端:使用 “添加或删除程序”
sg9
Windows客户端:使用PowerShell (Disable-WindowsOptionalFeature -Online -FeatureName smb1protocol)
sg10
参考与适用性
本文来源自微软官方技术文档:如何在 Windows 和 Windows Server 中启用和禁用 SMBv1、SMBv2 和 SMBv3。
如有变化,以微软官方为准。
这篇文章中的信息适用于:
Windows 10 Pro released in July 2015,
Windows 10 Enterprise released in July 2015
Windows Vista Enterprise
Windows Vista Business
Windows Vista Home Basic
Windows Vista Home Premium
Windows Vista Ultimate
Windows 7 Enterprise
Windows 7 Home Basic
Windows 7 Home Premium
Windows 7 Professional
Windows 7 Ultimate
Windows Server 2008 Datacenter
Windows Server 2008 Enterprise
Windows Server 2008 Standard
Windows Server 2008 R2 Datacenter
Windows Server 2008 R2 Enterprise
Windows Server 2008 R2 Standard
Windows 8
Windows 8 Enterprise
Windows 8 Pro
Windows Server 2012 Datacenter
Windows Server 2012 Essentials
Windows Server 2012 Foundation
Windows Server 2012 Standard
Windows Server 2016