Клиент-серверный сетевой протокол SMB (Server Message Block) используется в сетях Windows для предоставления общего удаленного доступа к файлам (общие сетевые папки), принтерам, другим сетевым ресурсам и межпроцессорного взаимодействия. Для коммуникации между клиентом и сервером SMB используется порт TCP 445. В этой статье мы рассмотрим какие версии протокола SMB доступны в различных версиях Windows (и как они соотносятся с версиями samba в Linux); как определить версию SMB на вашем компьютере; и как включить/отключить протокол SMBv1, SMBv2 и SMBv3 на Windows компьютере (клиенте или сервере).
Версии протокола SMB в Windows
Есть несколько версии протокола SMB (диалектов), которые появлялись в новых версиях Windows:
- 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 4.3 и на данный момент используется по-умолчанию)
- SMB 3.1.1 (*) – эта версия SMB в Windows 11 и Windows Server 2022 получила поддержку SMB over QUIC, сжатие файлового трафика SMB, шифрование с поддержкой AES-256-GCM и AES-256-CCM. Также, начиная с Windows 11 24H2 включено обязательное подписывание SMB пакетов.
SMB это клиент-серверный протокол, в котором SMB сервер предоставляет общий ресурс, а SMB клиент получает к нему доступ.
При сетевом взаимодействии по протоколу SMB между клиентом и сервером используется максимальная версия протокола, поддерживаемая одновременно и клиентом, и сервером.
Ниже представлена сводная таблица, по которой можно определить версию протокола SMB, которая выбирается при взаимодействии разных версий Windows:
Операционная система | Win 10/11, Server 2016/2019/2022/2025 | Windows 8.1, Server 2012 R2 | Windows 8, Server 2012 | Windows 7, Server 2008 R2 | Windows Vista, Server 2008 | Windows XP, Server 2003 и ниже |
Windows 10 и 11, Windows Server 2016/2019/2022/2025 | 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 и ниже | SMB 1.0 | SMB 1.0 | SMB 1.0 | SMB 1.0 | SMB 1.0 | SMB 1.0 |
Например, если клиентский компьютер с Windows 8.1 подключается к файловому серверу с Windows Server 2016, то для коммуникации будет использоваться протокол SMB 3.0.2.
Согласно этой таблице, Windows XP и Windows Server 2003 для доступа к общим файлам и папкам на сервере могут использовать только SMB 1.0 (эта версия протокола по-умолчанию отключена в современных версиях Windows). Таким образом, если в вашей инфраструктуре остались компьютеры с Windows XP (снятой с поддержки) или Windows Server 2003/R2, то с этих хостов не получиться получить доступ к общим папкам на машинах с более новыми версиями Windows.
Так, например, если Windows Server 2012R2+ используется в качестве контроллера домена, то устаревшие клиенты с Windows XP/Server 2003 не смогут получить доступ к каталогам SYSVOL и NETLOGON на контроллерах домена и авторизоваться в AD.
На старых клиентах при попытке подключиться к ресурсу на файловом сервере с отключенным SMB v1 появляется ошибка:
The specified network name is no longer available
Как проверить поддерживаемые версии SMB в Windows?
Чтобы определить какие версии протокола SMB доступны на вашем компьютере, выполните PowerShell команду:
Get-SmbServerConfiguration | select EnableSMB1Protocol,EnableSMB2Protocol
Данная команда вернула, что протокол SMB1 отключен (
EnableSMB1Protocol=False
), а протоколы SMB2 и SMB3 включены (
EnableSMB1Protocol=False
).
Функционал SMB клиента реализуется службой LanmanWorkstation, а SMB-сервера – LanmanServer. Проверьте, что эти службы запущены:
Get-Service LanmanServer,LanmanWorkstation
В старых версиях Windows (Windows 7, Vista, Windows Server 2008 R2/2008) проверить включенные SMB протоколы можно через реестр:
Get-Item HKLM:\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters | ForEach-Object {Get-ItemProperty $_.pspath}
Если в данной ветке реестра нет параметров с именами SMB1 или SMB2, значить оба этих протокола включены (по умолчанию для этих версий Windows).
В старых версиях версиях Windows проверить, какие диалекты SMB разрешено использовать в качестве клиентов, можно с помощью команд:
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 серверам.
Вывести используемые версии SMB с помощью Get-SMBConnection
При сетевом взаимодействии по протоколу SMB клиент и сервер используют максимальную версию диалекта, поддерживаемую одновременно ими обоими. Можно вывести версии протокола SMB, с помощью которых клиенты подключаются к SMB серверу с помощью PowerShell командлета:
Get-SMBConnection
:
Версия SMB, используемая для подключения к удаленному серверу (ServerName) указана в столбце Dialect.
Если нужно узнать, используется ли SMB шифрование (появилось в SMB 3.0), выполните:
Get-SmbConnection -ServerName servername
Если нужно отобразить, используется ли SMB шифрование (появилось в SMB 3.0), выполните:
Get-SmbConnection | ft ServerName,ShareName,Dialect,Encrypted,UserName
$ sudo smbstatus
Вывести статистику об диалектах SMB, которые используются активными клиентами для подключения к серверу, и количество коннектов:
Get-SmbSession | Select-Object -ExpandProperty Dialect | Sort-Object -Unique
В нашем примере имеется 825 клиентов, подключенных к серверу с помощью SMB 2.1 (Windows 7/Windows Server 2008 R2) и 12 клиентов SMB 3.02.
С помощью PowerShell можно включить аудит версий SMB, используемых для подключения:
Set-SmbServerConfiguration –AuditSmb1Access $true
События подключения затем можно извлечь из журналов Event Viewer с помощью PowerShell:
Get-WinEvent -LogName Microsoft-Windows-SMBServer/Audit
Почему SMBv1 отключен в новых версиях Windows?
Версия протокола SMB 1.0 отключена по-умолчанию в современных версиях Windows из-за серьёзных проблем с безопасностью и критических уязвимостей (вспомните историю с эпидемиями вирусов-шифровальщиков wannacrypt и petya, которые использовали уязвимость именно в протоколе SMBv1). Устаревший SMB1 замен более новыми и безопасными версиями SMB2 и SMB3.
Начиная с Windows 10 1809 клиентская и серверная службы SMB1 отключены при чистой установке ОС.
Проверить, что SMB 1.0 отключен можно с помощью команды:
Get-WindowsOptionalFeature -Online -FeatureName SMB1Protocol
Несмотря, на то, что в Windows все еще можно принудительно включить устаревший протокол SMB 1.0, делать это не рекомендуется по соображениям безопасности. Отключенный SMB 1 может вызывать проблемы с доступом из Windows к общим папкам на устаревших системах (старые версии NAS, сетевые принтеры, устройства с Windows XP/Server 2003, старые версии Linux и т.д.), которые не поддерживают более новые версии протокола.
Если в вашей сети не осталось legacy устройств с поддержкой только SMBv1, обязательно отключайте эту версию диалекта в Windows.
Включение и отключение SMBv1, SMBv2 и SMBv3 в Windows
Рассмотрим способы включения, отключения различных версий SMB в Windows. Мы рассматриваем отдельно включение клиента и сервера SMB (это разные компоненты).
Windows 11, 10, 8.1, Windows Server 2025/2022/2019/2016/2012R2:
Отключить клиент и сервер SMBv1:
Disable-WindowsOptionalFeature -Online -FeatureName smb1protocol
Отключить только SMBv1 сервер:
Set-SmbServerConfiguration -EnableSMB1Protocol $false
Включить клиент и сервер SMBv1:
Enable-WindowsOptionalFeature -Online -FeatureName smb1protocol
Включить только SMBv1 сервер:
Set-SmbServerConfiguration -EnableSMB1Protocol $true
Включить только SMBv1 сервер:
Set-SmbServerConfiguration -EnableSMB1Protocol $true
Отключить сервер SMBv2 и SMBv3:
Set-SmbServerConfiguration -EnableSMB2Protocol $false
Включить сервер SMBv2 и SMBv3:
Set-SmbServerConfiguration -EnableSMB2Protocol $true
Windows 7, Vista, Windows Server 2008 R2/2008:
Отключить SMBv1 сервер:
Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters" SMB1 -Type DWORD -Value 0 –Force
Включить SMBv1 сервер:
Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters" SMB1 -Type DWORD -Value 1 –Force
Отключить SMBv1 клиент:
sc.exe config lanmanworkstation depend= bowser/mrxsmb20/nsi
sc.exe config mrxsmb10 start= disabled
Включить SMBv1 клиент:
sc.exe config lanmanworkstation depend= bowser/mrxsmb10/mrxsmb20/nsi
sc.exe config mrxsmb10 start= auto
Отключить SMBv2 сервер:
Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters" SMB2 -Type DWORD -Value 0 -Force
Включить SMBv2 сервер
Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters" SMB2 -Type DWORD -Value 1 –Force
Отключить SMBv2 клиент:
sc.exe config lanmanworkstation depend= bowser/mrxsmb10/nsi
sc.exe config mrxsmb20 start= disabled
Включить SMBv2 клиент:
sc.exe config lanmanworkstation depend= bowser/mrxsmb10/mrxsmb20/nsi
sc.exe config mrxsmb20 start= auto
Для отключения SMBv2 нужно в этой же ветке установить параметр SMB2=0.
Для отключения SMBv1 клиента нужно распространить такой параметр реестра:
- Key: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\mrxsmb10
- Name: Start
- Type: REG_DWORD
- Value: 4
При отключении SMB 1.0/CIFS File Sharing Support в Windows вы можете столкнуться с ошибкой “0x80070035, не найден сетевой путь”, ошибкой при доступе к общим папкам, и проблемами обнаружения компьютеров в сетевом окружении. В этом случае вместо служба обозревателя компьютеров (Computer Browser) нужно использовать службы обнаружения (линк).
Как определить версии SMB на устройствах в сети?
Для поиска в сети устройств, на которых включен небезопасный протокол SMBv1 можно выполнить сканирование сети с помощью nmap. Следущая команда просканирует указанную IP подсеть и выведет версии SMB на устройствах:
nmap -p445 --script smb-protocols 192.168.22.0/24 -Pn
Для доменной среды Active Directory можно использовать следующий PowerShell скрипт, который выведет информацию о версиях SMB включенных на компьютерах:
$serverList = Get-ADComputer -Filter {(OperatingSystem -like "Windows Server*") -and (Enabled -eq $true)} | Select-Object -ExpandProperty Name
$results = @()
foreach ($server in $serverList) {
$serverStatus = Test-Connection -ComputerName $server -Count 1 -Quiet
if ($serverStatus) {
$smbStatus = Invoke-Command -ComputerName $server -ScriptBlock {
Get-SmbServerConfiguration | Select-Object EnableSMB1Protocol, EnableSMB2Protocol
}
$results += [PSCustomObject]@{
ServerName = $server
IsOnline = $true
SMBv1Enabled = $smbStatus.EnableSMB1Protocol
SMBv2Enabled = $smbStatus.EnableSMB2Protocol
}
}
else {
# Если сервер недоступен
$results += [PSCustomObject]@{
ServerName = $server
IsOnline = $false
SMBv1Enabled = $null
SMBv2Enabled = $null
}
}
}
$results | Format-Table -AutoSize
# Сохранение результатов в CSV-файл
$results | Export-Csv -Path "C:\SMB_Status.csv" -NoTypeInformation
Коллеги, у меня файл-сервер и КД на 2012R2. Машины с XP без проблем подключаются к обоим, как через Сетевое окружение в проводнике, так и сетевым диском. Единственно бывают проблемы если комп из рабочей группы пытается лезть на доменные сервера, но там скорее с ОС на компе косяки (предыдущий админ любил всякие сборки). Как это происходит тогда? Может на XP SMB патчем каким обновили?
В зависимостях службы Server (LanmanServer) есть упоминание SMB 1.x драйвера (как на втором скриншоте)?
Нет (не знаю как скрин приклеить), там только Server SMB 2.xxx Driver
с 2003 сервер без всяких шаманств шары на 2012R2 видны и доступны.
How to enable and disable SMBv1, SMBv2, and SMBv3 in Windows and Windows Server
https://support.microsoft.com/en-gb/help/2696547
может у вас есть инструкция как защитится используя smb 1?
Инструкции нет. Если без smbv1 никак, нужно постараться ограничить число хостов с включенным SMBv1 сервером до одного. На нем на WIndows Firewall нарезать правила, фильтрующие доступ по 445 потру только ограниченному диапазону доверенных устройств по IP.
В идеале убрать такой сервер из домена, чтобы при наличии заражения не пошло распространятся по домену.
Странная проблема: есть два клиента Windows 10 (возможно немного разные) и есть два сервера Windows 2012R2 c немного разным набором Updates.
С сервера1 открывается шара C$ клиента1, но не открывается шара С$ клиента2.
С сервера2 наоборот: открывается шара C$ клиента2, но не открывается шара С$ клиента1.
Надо чтобы шары с обоих серверов открывались. Серверы обновлять не хочется, мало ли вдруг пропадет доступ у других клиентов.
Обновить клиента1 и клиента2 с Wsus? У нас особенность: с Wsus ставятся только обновления безопасности. Дополнительно найти файлы Upgradе-ов и тоже ими обновить клиентов? Ставить подряд, всё что поставится?
Проверьте текущие версии SMB клиентов и серверов на всех компьютерах. Я думаю, где-то какая-то версия отключена или не доступна.
В локалке три ПК. На ПК-1 и ПК-2 установлена оригинальная финальная сборка Windows 10 19045.2965. После активации ПК-1 ключом Windows 10 education на нём вылезла ошибка 0x80070035.
Под микроскопом сравнивал настройки на ПК-1 и ПК-2:
1. Get-SMBServerConfiguration — 100% идентичны работает SMBv2 и выше. SMBv1 выключен.
2. NetBIOS через TCP/IP — по умолчанию на обоих.
3. Параметры общего доступа 100% одинаковы в том числе для текущего профиля «Частные». Отключен доступ с парольной защитой и включено сетевое обнаружение.
4. Network security: LAN Manager authentication level — не задано для обоих.
5. Group Policy AllowInsecureGuestAuth — не задано для обоих.
6. Windows Defender Firewall — настройки идентичны. Включал/выключал.
7. Настройки служб (Хост поставщика функции обнаружения. Публикация ресурсов обнаружения функции. Служба обнаружения SSDP. Узел универсальных PNP-устройств. DNS клиент) — идентичны. Автоматический/ручной запуск этих служб менял — роли не играет.
8. Делал сброс сети в настройках.
9. С драйверами адаптера на ПК-1 всё нормально, т. к. при разрешении AllowInsecureGuestAuth всё работает.
10. Сбрасывал локальные политики безопасности, восстанавливал по умолчанию.
11. Чистил DHCP настройки
ipconfig /release
ipconfig /flushdns
ipconfig /renew
и
ipconfig /flushdns
nbtstat –r
netsh int ip reset
netsh winsock reset
12. Удалял все учетные данные Windows и выставлял новые.
13. На ПК-2(Win 10 19045.2965) и ПК-3(Win 7) с доступом к расшаренным на всех трёх ПК папкам в локалке проблем нет.
Куда ещё копать? До активации всё работало.
а можно ли обновить версию smb 3.0.2 в 2012r2 до 3.1.1
можно ли обновить смб в 2012р2 до 3.1.1
где в AD на серверах включен smbv1 и smbv2
$serverList = Get-ADComputer -Filter {OperatingSystem -like "Windows Server*"} | Select-Object -ExpandProperty Name
# Создание массива для результатов
$results = @()
# Проход по каждому серверу
foreach ($server in $serverList) {
$serverStatus = Test-Connection -ComputerName $server -Count 1 -Quiet
if ($serverStatus) {
$smbStatus = Invoke-Command -ComputerName $server -ScriptBlock {
Get-SmbServerConfiguration | Select-Object EnableSMB1Protocol, EnableSMB2Protocol
}
# Добавление результатов в массив
$results += [PSCustomObject]@{
ServerName = $server
IsOnline = $true
SMBv1Enabled = $smbStatus.EnableSMB1Protocol
SMBv2Enabled = $smbStatus.EnableSMB2Protocol
}
}
else {
# Если сервер недоступен
$results += [PSCustomObject]@{
ServerName = $server
IsOnline = $false
SMBv1Enabled = $null
SMBv2Enabled = $null
}
}
}
# Вывод результатов
$results | Format-Table -AutoSize
# Сохранение результатов в CSV-файл
$results | Export-Csv -Path "C:\SMB_Status.csv" -NoTypeInformation