Публикуем вторую часть перевода статьи File Server Management with Windows PowerShell. В первой части мы рассматривали как с помощью 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:sharescompanyfiles}-Session $session
А сейчас сложная часть. Я хочу установить такие NTFS разрешения, чтобы JDHLABDomain Users имела разрешения на изменения (Change). Для этого необходимо создать новое правило доступа, изменяющего список правил доступа и заново применяющих их к папке. В примере 6 приведен пример скрипта:
Пример 6: Создание, изменение и применение правила доступа
$sb={
Param($path)
$du=new-object System.Security.AccessControl.FileSystem
AccessRule "jdhlabdomain 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:sharescompanyfiles
Существует способы упростить этот процесс, но для целей ясности мы сохраним все так как есть. Сейчас мы готовы создать новую папку.
Я могу использовать эту сессию, но я хочу продемонстрировать, как можно использовать команду New-SmbShare, чтобы удаленно подключиться к файловому серверу:
New-SmbShare -Name Files -Path c:sharescompanyfiles
-CimSession SRV2K12RC -FullAccess "jdhlabdomain 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:userdomaindomain 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:sharesadeco -Principal jdhlabadeco -Right "FullControl" -PSComputerName SRV2K12RC
Процесс займет пару секунд. Результаты на скриншоте ниже.
Нет ничего плохого в том, чтобы использовать обыкновенный графический интерфейс для того же самого. Однако если Вам нужны специализированные отчеты или же вы желаете автоматизировать этот процесс, PowerShell подойдет как нельзя лучше.
Все примеры можно скачать здесь. Автор также рекомендует посетить форумы на сайте PowerShell.org по всем вопросам, связанным с PowerShell.
Автор: AMarkin