четверг, 16 февраля 2012 г.

PowerShell: Работаем с ACL

Покажу пример, как с помощью PowerShell можно управлять настройками безопасности для файлов и каталогов (т.е. как работать с ACL).

Добавляем правило для каталога:

# Экспериментальный каталог
$dir = "C:\000"
 
# Если каталог существует - удаляем его со всем содержимым
if ([System.IO.Directory]::Exists($dir)) {
    Remove-Item -Path $dir -Recurse
}
# Создаём каталог
New-Item -Path $dir -ItemType Directory | Out-Null
 
# Получаем значение ACL каталога
$acl = Get-Acl -Path $dir
 
# Запретим пользователю "Host\Вася" права на создание файлов в этом каталоге:
 
# Аккаунт, для которого хотим добавить запись в ACL каталога
$account = "Host\Вася"
 
# Интересующие нас права доступа к объекту
$rights = [System.Security.AccessControl.FileSystemRights]::CreateFiles
 
# Перечисление разрешающее, или запрещающее доступ. Доступные варианты: Allow, Deny. 
# Мы хотим запретить, поэтому - Deny
$controlType = [System.Security.AccessControl.AccessControlType]::Deny
 
# Получаем текущий ACL каталога (объект класса 
# System.Security.AccessControl.DirectorySecurity)
$dirSec = [System.IO.Directory]::GetAccessControl($dir);
 
# Создаём новое правило доступа
$rule = New-Object -TypeName System.Security.AccessControl.FileSystemAccessRule `
-ArgumentList $account, $rights, $controlType
 
# Добавляем созданное нами правило доступа к набору уже имеющихся правил
$dirSec.AddAccessRule($rule)
 
# Назначаем каталогу модифицированные нами настройки доступа
[System.IO.Directory]::SetAccessControl($dir, $dirSec);

Полный перечень доступных вариантов перечисления System.Security.AccessControl.FileSystemRights смотреть здесь.
Удаляем добавленное нами ранее правило:

# Теперь удаляем добавленную нами ранее запись из ACL
# Получаем значение ACL каталога
$acl = Get-Acl -Path $dir
 
# Интересующие нас права доступа к объекту
$rights = [System.Security.AccessControl.FileSystemRights]::CreateFiles
 
# Перечисление разрешающее, или запрещающее доступ. Доступные варианты: Allow, Deny. 
# Мы хотим запретить, поэтому - Deny
$controlType = [System.Security.AccessControl.AccessControlType]::Deny
 
# Получаем текущий ACL каталога (объект класса 
# System.Security.AccessControl.DirectorySecurity)
$dirSec = [System.IO.Directory]::GetAccessControl($dir);
 
# Создаём новое правило доступа
$rule = New-Object -TypeName System.Security.AccessControl.FileSystemAccessRule `
-ArgumentList $account, $rights, $controlType
 
# Добавляем созданное нами правило доступа к набору уже имеющихся правил
$dirSec.RemoveAccessRule($rule)
 
# Назначаем каталогу модифицированные нами настройки доступа
[System.IO.Directory]::SetAccessControl($dir, $dirSec);
 
# Вот собственно и всё...

Для файлов всё выполняется по аналогии, с той лишь разницей, что вместо класса DirectorySecurity нужно использовать FileSecurity.

Комментариев нет: