Управляем сетевыми папками с помощью PowerShell
Создаем новые папки
Теперь давайте взглянем на то, как можно использовать PowerShell для создания файлов и папок и управления ими. Все, что я продемонстрирую, Вы можете использовать в PS 2.0 и 3.0 (хотя в PS 3.0 приводимые мною примеры можно упростить). Управление файловым сервером в PowerShell 2.0 требует обращения к WMI и написанию сложных скриптов. В PowerShell 3.0, особенно если у вас Windows Server 2012, этот тип управления значительно упрощен. Именно его я и собираюсь рассмотреть.
Все, что нам необходимо, уже имеется в модуле SMBShare, который по умолчанию установлен на моей машине Windows 8. Команды в этом модуле позволят нам локально и удаленно управлять папками. Я не собираюсь останавливаться на каждой команде подробно – они довольно однотипны; рекомендую прочитать справку и примеры. Мы же начнем с использования команды New-SMBShare, чтобы создать новую папку.
Сделать это нужно за пару шагов. Так как папка должна быть на удаленном сервере, я установлю удаленную сессию PowerShell:
$session=New-PSSession -ComputerName SRV2K12RC
Я, конечно, могу использовать интерактивную сессию, однако передо нами стоит задача автоматизации, так что использую команду Invoke-Command. Для начала я создам новую папку:
invoke-command -ScriptBlock {mkdir c:\shares\companyfiles}-Session $session
А сейчас сложная часть. Я хочу установить такие NTFS разрешения, чтобы JDHLAB\Domain Users имела разрешения на изменения (Change). Для этого необходимо создать новое правило доступа, изменяющего список правил доступа и заново применяющих их к папке. В примере 6 приведен пример скрипта:
Пример 6: Создание, изменение и применение правила доступа
$sb={
Param($path)
$du=new-object System.Security.AccessControl.FileSystem
AccessRule "jdhlab\domain users","Modify","allow"
$acl = Get-ACL $path
$acl.AddAccessRule($du)
Set-Acl -Path $path -AclObject $acl
}
В примере 6 я сделал так, чтобы параметр пути можно было заново использовать.
Invoke-Command -ScriptBlock $sb -Session $session -ArgumentList c:\shares\companyfiles
Существует способы упростить этот процесс, но для целей ясности мы сохраним все так как есть. Сейчас мы готовы создать новую папку.
Я могу использовать эту сессию, но я хочу продемонстрировать, как можно использовать команду New-SmbShare, чтобы удаленно подключиться к файловому серверу:
New-SmbShare -Name Files -Path c:\shares\companyfiles -CimSession SRV2K12RC -FullAccess "jdhlab\domain admins" -ChangeAccess Everyone -Description "Company files"
Право доступа к папке по умолчанию стоит “Только чтение” (ReadOnly). Я выдал доменным админам Полный контроль (Full Control) на папку, и всем остальным выдал права на изменение (Change). Этот путь относителен к удаленному компьютеру, который должен работать под PS 3.0.
Расширенные настройки папки
Получить информацию о папке можно в любое время, использовав команду Get-SMBShare, как вы можете видеть на рисунке 9. Можно сделать еще парочку вещей с нашими папками, например, зашифровать SMB соединение, какой режим перечисления (enumeration mode) и тип кеширования использовать для папки. Я собираюсь использовать Set-SMBShare, чтоб осуществить гибкую настройку для только что созданной папки. Посмотрим это на примере 7.
Пример 7: Гибкая настройка папки
PS C:\> Set-SmbShare -Name Files -EncryptData $True -FolderEnumerationMode AccessBased -CachingMode Documents -CimSession SRV2K12RC Confirm Are you sure you want to perform this action? SRV2K12RC: Performing operation 'Modify' on Target '*,Files'. [Y] Yes [A] Yes to All [N] No [L] No to All [S] Suspend [?] Help (default is "Y"):

Указанное выше применяется к одной единственной папке, но вы с легкостью можете использовать Get-SMBShare для извлечение всех папок и их последующей передачи в Set-SMBShare и применения изменений к ним всем:
Get-SMBShare -CimSession SRV2K12RC -Special $False | Set-SmbShare -EncryptData $True -Confirm:$false
Эта команда извлечет все папки (кроме административных папок) на компьютере SRV2K12RC и установим свойство EncryptData в значении True. Мне не хочется подтверждать каждое действие, поэтому переключатель Confirm установлен в значение False. Set-SMBshare не запишет ничего в конвейер, в том случае если вы не используете –Passthru. Как видите, я смог изменить все с помощью одной единственной команды.
Удаление сетевых папок
Напоследок удалим сетевую папку. Код в примере 8 полностью отключает совместный доступ к папке, которую я только что создал. Можно ли это сделать проще? Конечно, структура папок до сих пор на файловом сервере.
Пример 8: Удаляем сетевую папку
PS C:\> Remove-SmbShare -Name Files -CimSession SRV2K12RC Confirm Are you sure you want to perform this action? SRV2K12RC: Performing operation 'Remove-Share' on Target '*,Files'. [Y] Yes [A] Yes to All [N] No [L] No to All [S] Suspend [?] Help (default is "Y"):
Сводим воедино
А теперь давайте сведем все в одном скрипте. Не вдаваясь с детали кода, отмечу, что команды могут быть запущены параллельно. Например, после создания папки, создаю сетевую папку и устанавливаю NTFS разрешения в то же время, см. пример 9.
Пример 9: Создаем сетевую папку и устанавливаем NTFS разрешения
Workflow New-FileShare {
Param(
[string]$Name,
[string]$Path,
[string]$Principal,
[string]$Right="Modify"
)
#Это делаем в первую очередь.
Sequence {
#создаем папку
Write-Verbose -Message "Creating new folder $path on
$pscomputername"
$newfolder = New-Item -Path $path -ItemType Directory
}
#Идем дальше.
Sequence {
Parallel {
#эти команды могут быть запущены параллельно
InlineScript {
Write-Verbose -Message "Modifying NTFS permissions"
Write-Verbose -Message "Creating entry for
$using:principal with a right of $using:Right"
$entry=New-Object -typename System.Security
.AccessControl.FileSystemAccessRule -argumentlist
$using:Principal,$using:Right,"allow"
#получаем существующий ACL
$acl = Get-ACL -path $using:path
#добавляем новую запись
$acl.AddAccessRule($entry)
Write-Verbose -Message "Applying the new ACL"
Set-Acl -Path $using:path -AclObject $acl
} #inline
#Создаем сетевую папку.
Write-Verbose -message "Creating the file share $name"
$newshare = New-SmbShare -Name $name -Path $path
-Description "File share for $principal" -EncryptData $True
-FolderEnumerationMode AccessBased -CachingMode
Documents -FullAccess "$env:userdomain\domain admins"
-ChangeAccess $Principal
} #Parallel
} #sequence
#Получаем результаты.
Sequence {
Parallel {
Write-Verbose -Message "Getting the new share"
Get-SmbShare -Name $name
Write-Verbose -Message "Getting the new share access"
Get-SmbShareAccess -Name $name
}
}
Этот скрипт создает новую сетевую папку, присваивает разрешения пользователю или группе. Я могу запустить ее из-под Windows 8 или на файловом сервере Windows Server 2012, использовав следующую команду (которая должна быть введена в одну строчку):
New-FileShare -Name adeco -Path c:\shares\adeco -Principal jdhlab\adeco -Right "FullControl" -PSComputerName SRV2K12RC
Процесс займет пару секунд. Результаты на скриншоте ниже.

Нет ничего плохого в том, чтобы использовать обыкновенный графический интерфейс для того же самого. Однако если Вам нужны специализированные отчеты или же вы желаете автоматизировать этот процесс, PowerShell подойдет как нельзя лучше.