适用于:Windows Server 2022、Windows Server 2019、Windows Server 2016、Windows Server 2012 R2、Windows Server 2012、Windows 11、Windows 10、Windows 8.1、Windows 8
本文介绍如何在 SMB 客户端与服务器组件上启用和禁用服务器消息块 (SMB) 版本 1 (SMBv1)、SMB 版本 2 (SMBv2) 和 SMB 版本 3 (SMBv3)。
虽然禁用或删除 SMBv1 可能会导致旧计算机或软件出现一些兼容性问题,但 SMBv1 存在重大安全漏洞,
我们强烈建议不要使用它
。
默认情况下,SMB 1.0 未安装在
任何版本的 Windows 11 或 Windows Server 2019 及更高版本中。 默认情况下,Windows 10 中也不会安装 SMB 1.0(家庭版和专业版)。 建议更新仍需要它的 SMB 服务器,而不是重新安装 SMB 1.0。 有关需要 SMB 1.0 的第三方及其移除该要求的更新信息,请查看
SMB1 产品信息交换所
。
禁用 SMBv2 或 SMBv3 以进行故障排除
我们建议保持启用 SMBv2 和 SMBv3,但你可能发现,暂时禁用其中一个版本可以方便进行故障排除。 有关详细信息,请参阅
如何在 SMB 服务器上检测 SMB 协议状态以及启用和禁用 SMB 协议
。
在 Windows 10、Windows 8.1、Windows Server 2019、Windows Server 2016、Windows Server 2012 R2 和 Windows Server 2012 中,禁用 SMBv3 会停用以下功能:
透明故障转移 – 在维护或故障转移期间,客户端在不中断群集节点的情况下重新进行连接
横向扩展 - 对所有文件群集节点上的共享数据进行并发访问
多通道 - 当客户端和服务器之间有多个可用路径时聚合网络带宽和容错
SMB 直通 - 添加 RDMA 网络支持以提高性能、降低延迟和降低 CPU 使用率
加密 - 提供端到端加密,并防止在不受信任的网络上窃听
目录租赁 - 通过缓存改善分支机构中的应用程序响应时间
性能优化 - 针对小型随机读/写 I/O 的优化
在 Windows 7 和 Windows Server 2008 R2 中,禁用 SMBv2 会停用以下功能:
请求复合 - 允许将多个 SMBv2 请求作为单个网络请求发送
更大规模的读取和写入 - 更好地利用更快的网络
文件夹和文件属性缓存 - 客户端保留文件夹和文件的本地副本
持久性句柄 - 允许在发生暂时性断开连接时以透明方式重新连接到服务器
改进的消息签名 - HMAC SHA-256 取代了 MD5 作为哈希算法
改进的文件共享可伸缩性 - 每个服务器的用户、共享和开放文件数量显著增加
支持符号链接
客户端 oplock 租赁模型 - 限制客户端和服务器之间传输的数据,改善高延迟网络的性能,并提高 SMB 服务器的可伸缩性
大 MTU 支持 - 充分利用 10 千兆以太网 (GbE)
提高能效 – 向服务器开放文件的客户端可以休眠
SMBv2 协议是在 Windows Vista 和 Windows Server 2008 中引入的,而 SMBv3 协议是在 Windows 8 和 Windows Server 2012 中引入的。 有关 SMBv2 和 SMBv3 功能的详细信息,请参阅以下文章:
服务器消息块概述
SMB 中的新增功能
如何通过 PowerShell 删除 SMBv1
下面是使用权限提升的 PowerShell 命令检测、禁用和启用 SMBv1 客户端和服务器的步骤。
运行 PowerShell 命令禁用或启用 SMBv1 后,计算机将重启。
Get-WindowsOptionalFeature -Online -FeatureName SMB1Protocol
Disable-WindowsOptionalFeature -Online -FeatureName SMB1Protocol
Enable-WindowsOptionalFeature -Online -FeatureName SMB1Protocol
可以运行 Get-SmbServerConfiguration | Format-List EnableSMB1Protocol
来检测 SMBv1 状态,而无需提升权限。
Windows Server 2012 Windows Server 2012 R2、Windows Server 2016、Windows Server 2019:服务器管理器方法
若要从 Windows Server 中删除 SMBv1,请执行以下操作:
在要删除 SMBv1 的服务器的服务器管理器仪表板上,在“配置此本地服务器”下,选择“添加角色和功能”。
在“开始之前”页上选择“启动‘删除角色和功能’向导”,然后在随后出现的页上选择“下一步”。
在“选择目标服务器”页上的“服务器池”下,确保已选择要从中删除该功能的服务器,然后选择“下一步”。
在“删除服务器角色”页上,选择“下一步”。
在“删除功能”页上,清除“SMB 1.0/CIFS 文件共享支持”对应的复选框,然后选择“下一步”。
在“确认删除所选内容”页上,确认已列出该功能,然后选择“删除”。
Windows 8.1、Windows 10 和 Windows 11:添加或删除程序方法
若要为上述操作系统禁用 SMBv1,请执行以下操作:
在“控制面板”中,选择“程序和功能”。
在“控制面板主页”下,选择“打开或关闭 Windows 功能”打开“Windows 功能”框。
在“Windows 功能”框中,向下滚动列表,清除“SMB 1.0/CIFS 文件共享支持”对应的复选框,然后选择“确定”。
在 Windows 应用更改后,在确认页上选择“立即重启”。
如何检测 SMB 协议状态以及启用和禁用 SMB 协议
在 Windows 8 或 Windows Server 2012 中启用或禁用 SMBv2 时,也会启用或禁用 SMBv3。 出现此行为是因为这些协议共享同一个堆栈。
Windows 8 和 Windows Server 2012 引入了新的 Set-SMBServerConfiguration Windows PowerShell cmdlet。 使用该 cmdlet 可以在服务器组件上启用或禁用 SMBv1、SMBv2 和 SMBv3 协议。
运行 Set-SMBServerConfiguration cmdlet 后,无需重启计算机。
SMBv1
Get-SmbServerConfiguration | Select EnableSMB1Protocol
Set-SmbServerConfiguration -EnableSMB1Protocol $false
Set-SmbServerConfiguration -EnableSMB1Protocol $true
有关详细信息,请参阅 Microsoft 中的服务器存储。
SMB v2/v3
Get-SmbServerConfiguration | Select EnableSMB2Protocol
Set-SmbServerConfiguration -EnableSMB2Protocol $false
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 或注册表编辑器。
其他 PowerShell 方法
此方法需要 PowerShell 2.0 或更高版本。
SMB 服务器上的 SMBv1
Get-Item HKLM:\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters | ForEach-Object {Get-ItemProperty $_.pspath}
默认配置 = 已启用(未创建注册表命名值),因此不会返回任何 SMB1 值
Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters" SMB1 -Type DWORD -Value 0 -Force
Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters" SMB1 -Type DWORD -Value 1 -Force
注意:进行这些更改后,必须重启计算机。
有关详细信息,请参阅 Microsoft 中的服务器存储。
SMB 服务器上的 SMBv2/v3
Get-ItemProperty HKLM:\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters | ForEach-Object {Get-ItemProperty $_.pspath}
Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters" SMB2 -Type DWORD -Value 0 -Force
Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters" SMB2 -Type DWORD -Value 1 -Force
进行这些更改后,必须重启计算机。
注册表编辑器
请认真遵循本部分所述的步骤。 如果注册表修改不正确,可能会发生严重问题。 在修改注册表之前,请备份注册表,以便在出现问题时可以还原。
若要在 SMB 服务器上启用或禁用 SMBv1,请配置以下注册表项:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters
Registry entry: SMB1
REG_DWORD: 0 = Disabled
REG_DWORD: 1 = Enabled
Default: 1 = Enabled (No registry key is created)
若要在 SMB 服务器上启用或禁用 SMBv2,请配置以下注册表项:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters
Registry entry: SMB2
REG_DWORD: 0 = Disabled
REG_DWORD: 1 = Enabled
Default: 1 = Enabled (No registry key is created)
进行这些更改后,必须重启计算机。
下面介绍如何在运行 Windows 10、Windows Server 2019、Windows 8.1、Windows Server 2016、Windows Server 2012 R2 和 Windows Server 2012 的 SMB 客户端上检测 SMB 协议状态以及启用和禁用 SMB 协议。
SMB 客户端上的 SMBv1
Detect
sc.exe qc lanmanworkstation
sc.exe config lanmanworkstation depend= bowser/mrxsmb20/nsi
sc.exe config mrxsmb10 start= disabled
sc.exe config lanmanworkstation depend= bowser/mrxsmb10/mrxsmb20/nsi
sc.exe config mrxsmb10 start= auto
有关详细信息,请参阅 Microsoft 中的服务器存储
SMB 客户端上的 SMB v2/v3
sc.exe qc lanmanworkstation
sc.exe config lanmanworkstation depend= bowser/mrxsmb10/nsi
sc.exe config mrxsmb20 start= disabled
sc.exe config lanmanworkstation depend= bowser/mrxsmb10/mrxsmb20/nsi
sc.exe config mrxsmb20 start= auto
SMBv1
此过程在注册表中配置以下新项:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters
注册表项:SMB1
REG_DWORD:0 = 禁用
若要使用组策略配置此配置,请执行以下步骤:
打开“组策略管理控制台”。 右键单击应该包含新首选项的组策略对象 (GPO),然后单击“编辑”。
在控制台树中的“计算机配置”下,展开“首选项”文件夹,然后展开“Windows 设置”文件夹。
右键单击“注册表”节点,指向“新建”,然后选择“注册表项”。
在“新建注册表属性”对话框中,选择以下各项:
操作:创建
配置单元:HKEY_LOCAL_MACHINE
项路径:SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters
值名称:SMB1
值类型:REG_DWORD
值数据:0
此过程禁用 SMBv1 服务器组件。 必须将此组策略应用于域中所有必要的工作站、服务器和域控制器。
还可以将 WMI 筛选器设置为排除不受支持的操作系统或选定的排除项,例如 Windows XP。
对于其中的旧 Windows XP 或较旧 Linux 和第三方系统(不支持 SMBv2 或 SMBv3)需要访问 SYSVOL 或其他禁用了 SMB v1 的文件共享的域控制器,请小心进行这些更改。
SMB v1
若要禁用 SMBv1 客户端,需要更新服务注册表项以禁用 MRxSMB10 的启动,然后需要从 LanmanWorkstation 对应的项中删除 MRxSMB10 的依赖项,使 LanmanWorkstation 可以正常启动,而无需先启动 MRxSMB10。
本指南将更新并替换注册表中以下两个项中的默认值:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\mrxsmb10
注册表项:Start REG_DWORD:4 = 禁用
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanmanWorkstation
注册表项:DependOnService REG_MULTI_SZ:"Bowser","MRxSmb20″,"NSI"
默认包含的 MRxSMB10,现已作为依赖项删除。
若要使用组策略配置此设置,请执行以下步骤:
打开“组策略管理控制台”。 右键单击应该包含新首选项的 GPO,然后单击“编辑”。
在控制台树中的“计算机配置”下,展开“首选项”文件夹,然后展开“Windows 设置”文件夹。
右键单击“注册表”节点,指向“新建”,然后选择“注册表项”。
在“新建注册表属性”对话框中,选择以下各项:
操作:更新
配置单元:HKEY_LOCAL_MACHINE
项路径:SYSTEM\CurrentControlSet\services\mrxsmb10
值名称:Start
值类型:REG_DWORD
值数据:4
然后删除已禁用的 MRxSMB10 的依赖项。
在“新建注册表属性”对话框中,选择以下各项:
操作:替换
配置单元:HKEY_LOCAL_MACHINE
项路径:SYSTEM\CurrentControlSet\Services\LanmanWorkstation
值名称:DependOnService
值类型:REG_MULTI_SZ
Bowser
MRxSmb20
在许多版本的 Windows 中,默认值包含 MRxSMB10,因此将它们替换为此多值字符串实际上是删除了作为 LanmanWorkstation 依赖项的 MRxSMB10,并将四个默认值减少为上述这三个值。
使用组策略管理控制台时,无需使用引号或逗号。 只需独行键入每个项即可。
重启目标系统以完成禁用 SMB v1。
审核 SMBv1 使用情况
若要确定哪些客户端正在尝试使用 SMBv1 连接到 SMB 服务器,可以在 Windows Server 2016、Windows 10 和 Windows Server 2019 上启用审核。 如果在 Windows 7 和 Windows Server 2008 R2 上安装了 2018 年 5 月每月更新,或者在 Windows 8.1 和 Windows Server 2012 R2 上安装了 2017 年 7 月每月更新,则也可以在这些操作系统上进行审核。
Set-SmbServerConfiguration -AuditSmb1Access $true
Set-SmbServerConfiguration -AuditSmb1Access $false
Get-SmbServerConfiguration | Select AuditSmb1Access
启用 SMBv1 审核后,事件 3000 会出现在“Microsoft-Windows-SMBServer\Audit”事件日志中,其中标识了每个尝试使用 SMBv1 进行连接的客户端。
如果所有设置都在同一个 GPO 中,则组策略管理会显示以下设置。
测试和验证
完成本文中的配置步骤后,允许策略进行复制和更新。 在测试期间,可以根据需要在命令提示符下运行 gpupdate /force,然后检查目标计算机以确保正确应用了注册表设置。 确保 SMBv2 和 SMBv3 可对环境中的所有其他系统正常运行。
不要忘记重启目标系统。