之前一直通过 macOS 连接到 Windows Server 2012 的 Samba 上正常使用,自从系统自动升级到macOS High Sierra 10.13.2 后,操作连接的共享时 Finder 反复卡死提示未响应,然后连软重启都无效。实在是不能忍受。本以为是和上次文件夹花屏一样的问题,“.DS_Store” 文件坏掉了,结果删除了共享中所有的 .DS_Store 文件仍然不行。于是怀疑是否是10.13.2的新系统版本对 Samba 做了版本更新导致的新 Bug,并尝试在 Windows Server 2012 中尝试关闭SMBv3。

Windows 8 和 Windows Server 2012 引入了新的 Set-SMBServerConfiguration
Windows PowerShell cmdlet。 通过此 cmdlet,你可以在服务器组件上启用或禁用 SMBv1、SMBv2 和
SMBv3 协议。

注意 在 Windows 8 或 Windows Server 2012 中启用或禁用 SMBv2 时,也会启用或禁用 SMBv3。
之所以会出现此行为是因为这些协议共享同一个堆叠。

运行 Set-SMBServerConfiguration cmdlet 后,无须重启计算机。 SMB v2/v3
检测:Get-SmbServerConfiguration | Select EnableSMB2Protocol
禁用:Set-SmbServerConfiguration -EnableSMB2Protocol $false
启用:Set-SmbServerConfiguration -EnableSMB2Protocol $true

在Windows Server 2012 的 PowerShell 中执行

Set-SmbServerConfiguration -EnableSMB1Protocol $false

命令将会立即生效。回到 macOS 中尝试重新连接Samba共享,在命令行中执行smbutil statshares -a查看当前共享连接状态,已经变成了SMB v1,然后在Finder中操作,果不其然,不再卡死。

毕竟把 Windows Server 2012 服务器的Samba 设置为 1.0 版本非常不安全。但又不能仅屏蔽SMBv3。所以只好动手将 macOS 的 Samba 协议强制降低到SMBv2上(系统会出于安全角度默认自协商选用最高版本的协议进行连接)。

于是在 macOS 命令行中执行:

sudo sh -c "echo '[default]' >> /etc/nsmb.conf; echo 'protocol_vers_map=2' >> /etc/nsmb.conf"

此处的2代表设置为SMBv2,1就等于SMBv1(低版本的 Mac 系统曾经是使用“smb_neg=smb2_only”,现在失效了)。这会在 /etc 目录中添加一个 nsmb.conf 文件,系统检测到这个文件后就会默认通过 SMBv2 对外连接。修改后需要重启才能生效。(如果需要回到默认连接,只需要rm /etc/nsmb.conf即可)。