Встроенный PowerShell модуль SMBShare позволяет создавать, тонко настраивать и управлять общими сетевыми папками в Windows. В этой статье рассмотрим особенности управления сетевыми SMB папками Windows с помощью PowerShell. Вы можете использовать эти примеры для простого и быстрого управления настройками ваших файловых SMB серверов и сетевых папкок в различных сценариях автоматизации.
В модуле SMBShare доступно 42 команлета PowerShell для управления сетевыми папками. Их полный список можно вывести так:
Get-Command -Module SMBShare
Вывести текущую конфигурацию SMB сервера Windows:
Get-SmbServerConfiguration
AnnounceServer : False AsynchronousCredits : 64 AuditSmb1Access : False AutoDisconnectTimeout : 15 AutoShareServer : True AutoShareWorkstation : True CachedOpenLimit : 10 DurableHandleV2TimeoutInSeconds : 180 EnableAuthenticateUserSharing : False EnableDownlevelTimewarp : False EnableForcedLogoff : True EnableLeasing : True EnableMultiChannel : True EnableOplocks : True EnableSecuritySignature : False EnableSMB1Protocol : False EnableSMB2Protocol : True EnableStrictNameChecking : True EncryptData : False IrpStackSize : 15 KeepAliveTime : 2 MaxChannelPerSession : 32 MaxMpxCount : 50 MaxSessionPerConnection : 16384 MaxThreadsPerQueue : 20 MaxWorkItems : 1 NullSessionPipes : NullSessionShares : OplockBreakWait : 35 PendingClientTimeoutInSeconds : 120 RejectUnencryptedAccess : True RequireSecuritySignature : False ServerHidden : True Smb2CreditsMax : 2048 Smb2CreditsMin : 128 SmbServerNameHardeningLevel : 0 TreatHostAsStableStorage : False ValidateAliasNotCircular : True ValidateShareScope : True ValidateShareScopeNotAliased : True ValidateTargetName : True
Чтобы изменить эти параметры используйте командлет Set-SmbServerConfiguration:
Например, чтобы отключить использование устаревшего протокола SMB 1, выполните:
Set-SmbServerConfiguration -EnableSMB1Protocol $false -Force
Вывести список версий протокола SMB, использующихся активными клиентами для подключения к общим папкам на этом файловом сервере:
Get-SmbConnection
Чтобы ограничить пропускную способность для файлового SMB трафика, можно настроить политику QoS для SMB сервера. Например, следующая команда ограничит максимальную используемую ширину канала для SMB трафика до 10 Мб:
Set-SmbBandwidthLimit -Category Default -BytesPerSecond 10MB
Создать сетевую папку Windows с помощью PowerShell
Чтобы вывести полный список сетевых папок, доступных на компьютере, выполните:
Get-SmbShare
На этом компьютере открыт доступ к административным общим ресурсам и к каталогу Distr.
Чтобы создать новую общую сетевую папку, выполните команду:
New-SmbShare -Name Scripts -Path C:\PS -FullAccess winitpro\spb_admins, winitpro\msk-man01$ -ChangeAccess "winitpro\msk-man01_script_rw" -ReadAccess “$env:USERDOMAIN\domain users” –description “Collection of management PowerShell scripts”
В этом примере мы создали сетевую папку и предоставили права доступа доменным группам и одному компьютеру.
Дополнительно при создании папки можно использовать такие параметры:
-
-CachingMode [None|Manual|Programs|Documents|BranchCache]
– задать режим кэширования для офлайн доступа (автономных файлов); -
-EncryptData $True
– включить шифрование SMB трафика; -
-FolderEnumerationMode [AccessBased | Unrestricted]
– включить опцию перечисления на основании доступа (Access-based Enumeration). Позволяет скрыть в сетевой папке объекты, на которых у пользователя нет доступа; -
-CompressData $True
– включить сжатие при передаче файлов по SMB; -
-ConcurrentUserLimit 50
– позволяет ограничить количество одновременных подключений к папке (по умолчанию 0, не ограничено); -
-Temporary
– создать временную сетевую папку (пропадет после следующей перезагрузки Window).
Полный список настроек сетевой папки можно вывести:
Get-SmbShare -Name scripts| select *
Чтобы удалить сетевую папку:
Remove-SmbShare Scripts
Добавить в список доступа сетевой папки разрешения на запись для указанного пользователя:
Grant-SmbShareAccess -Name Scripts -AccountName "winitpro\kbuldogov" -AccessRight Change –force
Вывести текущий список доступа к общей папке:
Get-SmbShareAccess scripts
Удалить группу из списка доступа:
Revoke-SmbShareAccess -Name Scripts -AccountName Everyone –Force
Принудительный запрет на доступ к общей папке (запрещающее разрешение имеет более высокий приоритет):
Block-SmbShareAccess -Name Scripts -AccountName winitpro\ExtUsers -Force
Текущий NTFS ACL для сетевой папки можно получить с помощью команды:
(get-acl \\msk-man01\scripts).access
Чтобы изменить права доступа, используйте Set-Acl (подробнее про управление NTFS разрешениями с помощью PowerShell).
Управление открытыми файлами в сетевой папке
Командлеты модуля SMBShare можно использовать для просмотра списка файлов, открытых клиентами в сетевой папке на файловом сервере.
Вывести список открытых файлов с именами пользователей, именами компьютеров (IP адресами), и путями к файлам:
Get-SmbOpenFile|select ClientUserName,ClientComputerName,Path,SessionID
Вывести список файлов, открытых определённым пользователем:
Get-SMBOpenFile –ClientUserName "corp\kbuldogov" |select ClientComputerName,Path
Закрыть файл, открытый и заблокированный пользователем:
$sessn = New-CIMSession –Computername msk-fs01
Get-SMBOpenFile -CIMSession $sessn | where {$_.Path –like "*godovoy_otchet_2021.docx"} | Close-SMBOpenFile -CIMSession $sessn
Подключение сетевых дисков с помощью командлетов SmbMapping
Командлеты форматы SbmMapping используются для управления сетевыми дисками.
Чтобы подключить удаленную сетевую папку в сетевой диск U:, выполните команду:
New-SmbMapping -LocalPath U: -RemotePath \\msk-man01\scripts -UserName kbuldogov -Password mypass –Persistent $true -SaveCredential
- Без параметра Persistent сетевой диск будет доступен только до перезагрузки компьютера;
- Параметр SaveCredential позволяет сохранить учетные данные пользователя для подключения в диспетчер учетных данных Windows Credential Manager
Вывести список подключенных сетевых папок:
Get-SmbMapping
Для удаления сетевого диска:
Remove-SmbMapping U: -force
Спасибо за статью, а будет ли статья на тему мониторинг AD/win серверов?
бредятина какая то.
Чтобы создать новую общую сетевую папку, выполните команду:
New-SmbShare -Name Scripts -Path C:\PS -FullAccess winitpro\spb_admins, winitpro\msk-man01$ -ChangeAccess «winitpro\msk-man01_script_rw» -ReadAccess “$env:USERDOMAIN\domain users” –description “Collection of management PowerShell scripts”- ГДЕ ТУТ КОМАНДА?
«New-SmbShare» является командой (командлетом), все, что начинается с минуса = параметры, что после них = их значения.
Забыли указать что при Подключение сетевых дисков с помощью командлетов SmbMapping и указания параметра
-SaveCredentia
l он выдаст ошибкуNew-SmbMapping : Параметр задан неверно.
И очень странно я нигде не нашел как это обойти чтобы подключить сетевой диск с сохранением учетных данных, может кто знает?
Надо пароль в безопасную строку сконвертировать
Здравствуйте. Спасибо за статью! Напишите, пожалуйста, пример:
1. Как удалить конкретного пользователя из шары?
2. Как удалить конкретного пользователя из шары на всех ПК в домене.
1) Речь об NTFS правах на папки или права на шары.
Вообще об этом есть отдельная статья:
https://winitpro.ru/index.php/2019/04/22/ntfs-razresheniya-na-papki-powershell/
2) Скрипт foreach для всех компьютеров домена, полученных с помощью Get-ADComputer. Для каждого применить команду из пункта 1)
А как можно при уже имеющейся шаре поменять права в сторону уменьшения?
Т.е. на сотне компов есть папка Share на диске C:\ с полными правами на шару: Группа или Пользователи — Все, Разрешения — Полные, Изменение, Чтение. Требуется урезать разрешения на сетевую шару, например, до всех пользователей домена и только на чтение.
Или проще удалить шару совсем и тут-же создать такую-же, но уже с нужными правами?
NTFS права и сам каталог не трогаем.
Оба варианта возможны, оба они свободно реализуются через скрипт powershell.
Вот вариант — очистить текущий ACL доступа папки и добавить Domain users с правами на read:
$shareName = "Share"
$domainGroup = "domain users"
$Accounts = Get-SmbShareAccess -Name $ShareName | Select-Object -ExpandProperty AccountName
foreach ($Account in $Accounts) {
Revoke-SmbShareAccess -Name $ShareName -AccountName $Account -Force
}
Grant-SmbShareAccess -Name $shareName -AccountName $domainGroup -AccessRight Read -Force