Server Message Block (SMB) โปรโตคอลเครือข่ายใช้สำหรับแชร์และเข้าถึงโฟลเดอร์ ไฟล์ เครื่องพิมพ์ และอุปกรณ์อื่นๆ ผ่านเครือข่าย (TCP port 445) ในบทความนี้ เราจะดูว่ามีเวอร์ชัน (Dialects) ของ SMB ใดบ้างใน Windows เวอร์ชันต่างๆ (และเกี่ยวข้องกับเวอร์ชัน Samba บน Linux อย่างไร) วิธีตรวจสอบเวอร์ชัน SMB ที่ใช้งานอยู่บนคอมพิวเตอร์ และวิธีเปิดหรือปิด Dialects ของ SMBv1, SMBv2, และ SMBv3
สารบัญ
- เวอร์ชันโปรโตคอล SMB ใน Windows
- วิธีตรวจสอบเวอร์ชัน SMB ใน Windows
- ตรวจสอบ Dialects SMB ที่ใช้งานด้วย Get-SMBConnection
- หยุดใช้โปรโตคอล SMBv1 ที่ไม่ปลอดภัย
- วิธีเปิดและปิด SMBv1, SMBv2, และ SMBv3 ใน Windows
เวอร์ชันโปรโตคอล SMB ใน Windows
มีหลายเวอร์ชันของโปรโตคอล SMB (Dialects) ที่ปรากฏใน Windows ใหม่ๆ ตามลำดับ (และ Samba):
- CIFS – Windows NT 4.0
- SMB 1.0 – Windows 2000
- SMB 2.0 – Windows Server 2008 และ Windows Vista SP1 (รองรับใน Samba 3.6)
- SMB 2.1 – Windows Server 2008 R2 และ Windows 7 (Samba 4.0)
- SMB 3.0 – Windows Server 2012 และ Windows 8 (Samba 4.2)
- SMB 3.02 – Windows Server 2012 R2 และ Windows 8.1 (ไม่รองรับใน Samba)
- SMB 3.1.1 – Windows Server 2016 และ Windows 10 (ไม่รองรับใน Samba)
Samba ใช้เพื่อนำโปรโตคอล SMB ไปใช้ใน Linux/Unix Samba 4.14 และใหม่กว่าใช้ SMB 2.1 โดยค่าเริ่มต้น
ในการสื่อสาร SMB ผ่านเครือข่าย ไคลเอนต์และเซิร์ฟเวอร์จะใช้เวอร์ชันโปรโตคอล SMB สูงสุดที่รองรับโดยทั้งไคลเอนต์และเซิร์ฟเวอร์
ตารางสรุปความเข้ากันได้ของเวอร์ชัน SMB ดูได้ดังนี้ จากตารางนี้ คุณสามารถกำหนดเวอร์ชันของโปรโตคอล SMB ที่เลือกเมื่อ Windows เวอร์ชันต่างๆ มีปฏิสัมพันธ์กัน:
| Operating System | Windows 10, Win Server 2016 | Windows 8.1, Win Server 2012 R2 | Windows 8, Server 2012 | Windows 7, Server 2008 R2 | Windows Vista, Server 2008 | Windows XP, Server 2003 and earlier |
|---|---|---|---|---|---|---|
| Windows 10, Windows Server 2016 | SMB 3.1.1 | SMB 3.02 | SMB 3.0 | SMB 2.1 | SMB 2.0 | SMB 1.0 |
| Windows 8.1, Server 2012 R2 | SMB 3.02 | SMB 3.02 | SMB 3.0 | SMB 2.1 | SMB 2.0 | SMB 1.0 |
| Windows 8, Server 2012 | SMB 3.0 | SMB 3.0 | SMB 3.0 | SMB 2.1 | SMB 2.0 | SMB 1.0 |
| Windows 7, Server 2008 R2 | SMB 2.1 | SMB 2.1 | SMB 2.1 | SMB 2.1 | SMB 2.0 | SMB 1.0 |
| Windows Vista, Server 2008 | SMB 2.0 | SMB 2.0 | SMB 2.0 | SMB 2.0 | SMB 2.0 | SMB 1.0 |
| Windows XP, 2003 and earlier | SMB 1.0 | SMB 1.0 | SMB 1.0 | SMB 1.0 | SMB 1.0 | SMB 1.0 |
ตัวอย่างเช่น หากไคลเอนต์ที่รัน Windows 8.1 เชื่อมต่อกับ File Server ที่รัน Windows Server 2016 จะใช้โปรโตคอล SMB 3.0.2
ตามตาราง Windows XP และ Windows Server 2003 สามารถใช้เพียง SMB 1.0 ในการเข้าถึงโฟลเดอร์และไฟล์แชร์ SMBv1 ถูกปิดใช้งานใน Windows Server รุ่นใหม่ (2012 R2/2016) ดังนั้น หากคุณยังใช้งานอุปกรณ์ Windows XP และ Windows Server 2003 บนเครือข่าย พวกเขาจะไม่สามารถเข้าถึงโฟลเดอร์แชร์บน File Server ที่รัน Windows Server 2016 ได้
หากใช้ Windows Server 2019/2016 ที่ปิด SMB v1.0 เป็น Domain Controller แล้ว ไคลเอนต์ Windows XP/Server 2003 จะไม่สามารถเข้าถึงโฟลเดอร์ SYSVOL และ NETLOGON บน Domain Controllers และยืนยันตัวตนกับ AD ได้
อาจได้รับข้อผิดพลาดต่อไปนี้เมื่อพยายามเชื่อมต่อกับโฟลเดอร์แชร์บน File Server ที่ปิด SMBv1:
The specified network name is no longer available
วิธีตรวจสอบเวอร์ชัน SMB ใน Windows
มาดูวิธีตรวจสอบว่า Dialects ต่างๆ ของโปรโตคอล SMB ไหนเปิดใช้งานอยู่บนอุปกรณ์ Windows ของคุณ
บน Windows 10/8.1 และ Windows Server 2019/2016/2012R2 สามารถตรวจสอบสถานะ Dialects ต่างๆ ของโปรโตคอล SMB ด้วย PowerShell:
Get-SmbServerConfiguration | select EnableSMB1Protocol,EnableSMB2Protocol

คำสั่งนี้คืนค่าว่าโปรโตคอล SMB1 ถูกปิดใช้งาน (EnableSMB1Protocol = False) และโปรโตคอล SMB2 และ SMB3 เปิดใช้งาน (EnableSMB2Protocol = True)
โปรดทราบว่าโปรโตคอล SMBv3 และ SMBv2 เกี่ยวข้องกันอย่างใกล้ชิด ไม่สามารถปิดหรือเปิด SMBv3 หรือ SMBv2 แยกกันได้ พวกมันจะเปิด/ปิดไปพร้อมกันเสมอ เพราะใช้ Stack เดียวกัน
บน Windows 7, Vista, และ Windows Server 2008 R2/2008:
Get-Item HKLM:\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters | ForEach-Object {Get-ItemProperty $_.pspath}
หากไม่มีพารามิเตอร์ชื่อ SMB1 หรือ SMB2 ในคีย์รีจิสทรีนี้ แสดงว่าโปรโตคอล SMBv1 และ SMBv2 เปิดใช้งานโดยค่าเริ่มต้น

ยังสามารถตรวจสอบได้ว่า Dialects ของ SMB Client ใดได้รับอนุญาตให้เชื่อมต่อกับโฮสต์ระยะไกลบน Windows เวอร์ชันเหล่านี้:
sc.exe query mrxsmb10
SERVICE_NAME: mrxsmb10 TYPE : 2 FILE_SYSTEM_DRIVER STATE : 4 RUNNING (STOPPABLE, NOT_PAUSABLE, IGNORES_SHUTDOWN) WIN32_EXIT_CODE : 0 (0x0) SERVICE_EXIT_CODE : 0 (0x0) CHECKPOINT : 0x0 WAIT_HINT : 0x0
sc.exe query mrxsmb20
SERVICE_NAME: mrxsmb20 TYPE : 2 FILE_SYSTEM_DRIVER STATE : 4 RUNNING (STOPPABLE, NOT_PAUSABLE, IGNORES_SHUTDOWN) WIN32_EXIT_CODE : 0 (0x0) SERVICE_EXIT_CODE : 0 (0x0) CHECKPOINT : 0x0 WAIT_HINT : 0x0
ในทั้งสองกรณี บริการกำลังทำงาน (STATE = 4 Running) หมายความว่าอุปกรณ์ Windows ปัจจุบันสามารถเชื่อมต่อกับโฮสต์ SMBv1 และ SMBv2 ได้
ตรวจสอบ Dialects SMB ที่ใช้งานด้วย Get-SMBConnection
เมื่อสื่อสารผ่าน SMB คอมพิวเตอร์จะใช้เวอร์ชัน SMB สูงสุดที่รองรับโดยทั้งไคลเอนต์และเซิร์ฟเวอร์ คำสั่ง PowerShell Get-SMBConnection ใช้ตรวจสอบเวอร์ชัน SMB ที่ใช้เข้าถึงคอมพิวเตอร์ระยะไกล:

เวอร์ชัน SMB ที่ใช้เชื่อมต่อกับเซิร์ฟเวอร์ระยะไกล (ServerName) แสดงในคอลัมน์ Dialect
สามารถแสดงข้อมูลเกี่ยวกับเวอร์ชัน SMB ที่ใช้เข้าถึงเซิร์ฟเวอร์เฉพาะ:
Get-SmbConnection -ServerName srvfs01
หากต้องการแสดงว่าการเข้ารหัส SMB ใช้งานอยู่หรือไม่ (นำเข้ามาใน SMB 3.0):
Get-SmbConnection | ft ServerName,ShareName,Dialect,Encrypted,UserName
บน Linux สามารถแสดงรายการการเชื่อมต่อ SMB และ Dialects ที่ใช้ใน Samba ด้วยคำสั่ง:
$ sudo smbstatus
ฝั่ง Windows SMB Server สามารถแสดงรายการเวอร์ชันโปรโตคอล SMB ที่ไคลเอนต์กำลังใช้งานอยู่ รันคำสั่ง:
Get-SmbSession | Select-Object -ExpandProperty Dialect | Sort-Object -Unique
ในตัวอย่างนี้ มีไคลเอนต์ 898 ตัวเชื่อมต่อกับเซิร์ฟเวอร์ด้วย SMB 2.1 (Windows 7/Windows 2008 R2) และ 8 ไคลเอนต์ SMB 3.02
สามารถใช้ PowerShell เปิดใช้งานการตรวจสอบ SMB versions ที่ใช้สำหรับการเชื่อมต่อ:
Set-SmbServerConfiguration –AuditSmb1Access $true
เหตุการณ์การเชื่อมต่อ SMB จึงสามารถส่งออกจาก Event Viewer logs:
Get-WinEvent -LogName Microsoft-Windows-SMBServer/Audit
หยุดใช้โปรโตคอล SMBv1 ที่ไม่ปลอดภัย
ในไม่กี่ปีที่ผ่านมา Microsoft ได้ปิดใช้งานโปรโตคอล SMB 1.0 รุ่นเก่าในผลิตภัณฑ์ทั้งหมดเพื่อเหตุผลด้านความปลอดภัย เนื่องจากช่องโหว่สำคัญจำนวนมากในโปรโตคอลนี้ (จำได้ไหมเหตุการณ์ WannaCrypt และ Petya ransomware ที่ใช้ประโยชน์จากช่องโหว่ในโปรโตคอล SMBv1) Microsoft และบริษัท IT อื่นๆ แนะนำอย่างยิ่งให้หยุดใช้ SMBv1 ในเครือข่ายของคุณ
อย่างไรก็ตาม การปิดใช้งาน SMBv1 อาจทำให้เกิดปัญหาการเข้าถึงไฟล์และโฟลเดอร์แชร์บน Windows 10 รุ่นใหม่ (Windows Server 2016/2019) จากไคลเอนต์รุ่นเก่า (Windows XP, Windows Server 2003) OS ของบุคคลที่สาม (Mac OSX 10.8 Mountain Lion, Snow Leopard, Mavericks, Linux distros เก่า) อุปกรณ์ NAS เก่า
หากไม่มีอุปกรณ์รุ่นเก่าเหลืออยู่บนเครือข่ายที่รองรับเฉพาะ SMBv1 ให้ปิดใช้งาน Dialect SMB นี้ใน Windows แน่นอน
หากมีไคลเอนต์ที่รัน Windows XP, Windows Server 2003 หรืออุปกรณ์อื่นๆ ที่รองรับเฉพาะ SMBv1 ควรอัปเดตหรือแยกออกจากเครือข่าย
วิธีเปิดและปิด SMBv1, SMBv2, และ SMBv3 ใน Windows
มาดูวิธีเปิดและปิดเวอร์ชัน SMB ต่างๆ ใน Windows เราจะครอบคลุมการจัดการ SMB Client และ Server (เป็นคอมโพเนนต์ Windows ที่ต่างกัน)
Windows 10, 8.1, และ Windows Server 2019/2016/2012R2
ปิด SMBv1 Client และ Server:
Disable-WindowsOptionalFeature -Online -FeatureName smb1protocol
ปิด SMBv1 Server เท่านั้น:
Set-SmbServerConfiguration -EnableSMB1Protocol $false
เปิด SMBv1 Client และ Server:
Enable-WindowsOptionalFeature -Online -FeatureName smb1protocol
เปิด SMBv1 Server เท่านั้น:
Set-SmbServerConfiguration -EnableSMB1Protocol $true
อ่านเพิ่มเติมเกี่ยวกับโปรโตคอล SMBv1 บน Windows 10 และ Windows Server 2016/2019
ปิด SMBv2 และ SMBv3 Server:
Set-SmbServerConfiguration -EnableSMB2Protocol $false
เปิด SMBv2 และ SMBv3 Server:
Set-SmbServerConfiguration -EnableSMB2Protocol $true

Windows 7, Vista, และ Windows Server 2008 R2/2008
ปิด SMBv1 Server:
Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters" SMB1 -Type DWORD -Value 0 –Force

เปิด SMBv1 Server:
Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters" SMB1 -Type DWORD -Value 1 –Force
ปิด SMBv1 Client:
sc.exe config lanmanworkstation depend= bowser/mrxsmb20/nsi
sc.exe config mrxsmb10 start= disabled
เปิด SMBv1 Client:
sc.exe config lanmanworkstation depend= bowser/mrxsmb10/mrxsmb20/nsi
sc.exe config mrxsmb10 start= auto
ปิด SMBv2 Server:
Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters" SMB2 -Type DWORD -Value 0 -Force
เปิด SMBv2 Server:
Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters" SMB2 -Type DWORD -Value 1 –Force
ปิด SMBv2 Client:
sc.exe config lanmanworkstation depend= bowser/mrxsmb10/nsi
sc.exe config mrxsmb20 start= disabled
เปิด SMBv2 Client:
sc.exe config lanmanworkstation depend= bowser/mrxsmb10/mrxsmb20/nsi
sc.exe config mrxsmb20 start= auto
สามารถปิด SMBv1 Server บนคอมพิวเตอร์ที่เข้าร่วมโดเมนได้โดยการปรับใช้พารามิเตอร์รีจิสทรีต่อไปนี้ผ่าน GPO:
- Key: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters
- Name: SMB1
- Type: REG_DWORD
- Value: 0
ตั้งค่าพารามิเตอร์รีจิสทรี SMB2=0 เพื่อปิด SMBv2 Server
เพื่อปิด SMBv1 Client ต้องเผยแพร่การตั้งค่ารีจิสทรีต่อไปนี้:
- Key: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\mrxsmb10
- Name: Start
- Type: REG_DWORD
- Value: 4
เมื่อปิดใช้งาน SMB 1.0/CIFS File Sharing Support ใน Windows อาจพบข้อผิดพลาด 0x80070035 network path not found, ข้อผิดพลาดเมื่อเข้าถึงโฟลเดอร์แชร์ SMB และปัญหา Network Discovery ในกรณีนี้ ต้องใช้ Discovery Service แทน Computer Browser service