Vadims 的个人资料Vadims Podans's former b...照片日志列表更多 工具 帮助

日志


2008/5/21

Управление ACL в PowerShell (часть 1)

Время от времени администраторам приходится иметь дело с настройкой разрешений NTFS для объектов (файлов, папок, ключей реестра). Для этого, например, в CMD созданы специальные утилиты как XCACLS и ICACLS (более совершенная версия XCACLS). Однако, эти утилиты позволяют работать только с файловой системой, управление списками ACL в реестре данными утилитами невозможно. Для управления ACL списками доступа реестра из командной строки есть утилита REGINI и SubInACL. В PowerShell это уже есть всё внутри. Командлета по управлению ACL всего 2:

 

  • Get-ACL - командлет, который позволяет извлекать списки ACL (включая Owner) во внешний контейнер, будь то текстовый файл, *.csv или просто переменная, которую можно потом обработать в соответствии с задачами.
  • Set-ACL - командлет, который позволяет задавать новые/изменять старые списки ACL и контейнер Owner.

Здесь приведу простой пример использования командлета Get-ACL для папки Windows:

Get-Acl Windows | Format-List

Path   : Microsoft.PowerShell.Core\FileSystem::C:\Windows
Owner  : BUILTIN\Administrators
Group  : NT AUTHORITY\SYSTEM
Access : CREATOR OWNER Allow  268435456
         NT AUTHORITY\Authenticated Users Allow  -1610612736
         NT AUTHORITY\Authenticated Users Allow  ReadAndExecute, Synchronize
         NT AUTHORITY\SYSTEM Allow  268435456
         NT AUTHORITY\SYSTEM Allow  FullControl
         BUILTIN\Administrators Allow  268435456
         BUILTIN\Administrators Allow  FullControl
         BUILTIN\Server Operators Allow  -536805376
         BUILTIN\Server Operators Allow  Modify, Synchronize
Audit  :
Sddl   : O:BAG:SYD:PAI(A;OICIIO;GA;;;CO)(A;OICIIO;GXGR;;;AU)(A;;0x1200a9;;;AU)(A;OICIIO;GA;;;SY)(A;;FA;;;SY)(A;OICIIO;G
         A;;;BA)(A;;FA;;;BA)(A;OICIIO;SDGXGWGR;;;SO)(A;;0x1301bf;;;SO)

В результате вывода команды PowerShell покажет достаточно исчерпывающую информацию о списке ACL для указанной папки. Можно так же вывести список ACL в переменную, например я это сделаю на примере реестра:

cd HKLM:
$ACL = Get-Acl
$ACL | Format-List

Path   : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE
Owner  : BUILTIN\Administrators
Group  : NT AUTHORITY\SYSTEM
Access : Everyone Allow  ReadKey
         NT AUTHORITY\RESTRICTED Allow  ReadKey
         NT AUTHORITY\SYSTEM Allow  FullControl
         BUILTIN\Administrators Allow  FullControl
Audit  :
Sddl   : O:BAG:SYD:(A;CI;KR;;;WD)(A;CI;KR;;;RC)(A;CI;KA;;;SY)(A;CI;KA;;;BA)

Командой cd HKLM: я переключился с файловой системы на реестр. И используя те же самые приёмы могу управлять списками ACL в реестре. Экспортировав список ACL в переменную дальше уже можно управлять ею как заблагорассудится. Сейчас я покажу несколько вариантов применения такого способа при помощи уже команды Set-Acl.

Предположим, есть папка Test и папка Test1. И мы хотим скопировать разрешения папки Test на Test1 без копирования содержимого папок. Для этого нужно выполнить 2 операции:

 

  • чтение ACL из папки Test в переменную
  • запись ACL в папку Test1 из переменной.

Выглядеть это будет следующим образом:

$ACL=Get-Acl -path "Test"                   # здесь я скопировал список ACL в переменную $ACL
Set-Acl -path "Test2" -AclObject $ACL   # в этой строке я уже применил переменную для команды Set-Acl.

После выполнения этих двух строк  можно будет убедиться, что разрешения обеих папок будут полностью идентичны.

Внимание: данный скрипт может вернуть ошибку, если пользователь, из под которого выполняется скрипт не является владельцем исходного ресурса (в нашем примере это папка Test) и не обладает правом локальной политики Take Ownership. Дело в том, что при переносе разрешений нельзя перенести другого владельца. Если владельцем папки Test является текущий пользователь и он обладает правом Take Ownership, то все разрешения и Owner будут скопированы на папку Test2. Если же одно из условий не выполняется, то скрипт выдаст ошибку переноса Owner на другой ресурс.

Но если нам нужно создать с нуля структуру разрешений? Тогда всё решается через Set-Acl. Для установки разрешений NTFS используется .NET класс, который называется: FileSystemAccessRule и список прав перечислен в FileSystemRights Enumeration. Чтобы посмотреть какие разрешения мы можем задавать для ACL достаточно в PowerShell выоплнить команду:

[system.enum]::getnames([System.Security.AccessControl.FileSystemRights])

там же в списке будут указаны и составные разрешения как Read, Write, Modify, которые состоят из набора более детальных разрешений (они обычно показываются в основной вкладке Security для файла или папки). Итак, попробуем для начала дать пользователю TestUser право Modify для папки C:\Test, на которую по умолчанию он имеет лишь право Read (через группу Users). Для этого мы сначала считаем текущий список ACL с папки Test:

$ACL = Get-ACL C:\Test

Теперь создадим переменную с указанием пользователя, прав доступа и типа разрешения (Allow или Deny):

$Setting = "TestUser","Modify","Allow"

Теперь необходимо передать эту переменную в класс FileSystemAccessRule для создания объекта:

$AccessRule = new-object System.Security.AccessControl.FileSystemAccessRule $Setting

Ну и теперь, собственно, можно уже применять объект с параметрами (пользователь, тип доступа) в ACL целевой папки:

$ACL.SetAccessRule($AccessRule)
$ACL | Set-Acl C:\Test

После выполнения этого простенького скрипта пользователь TestUser получит разрешение Modify на папку C:\Test. Конечно же, нельзя сказать, что данный вариант является более предпочтительным, чем XCACLS или ICACLS, но тем не менее это интергрированное рабочее решение, которое может быть легко модифицировано для других задач управления списками ACL объектов.

В следующей статье (это будет вторая часть) я усложню задачу для командлетов Get-Acl/Set-Acl - а именно, расскажу, как работать с наследованием разрешений и управлением глубиной действия наследования.

评论 (2)

请稍候...
很抱歉,您输入的评论太长。请缩短您的评论。
您没有输入任何内容,请重试。
很抱歉,我们当前无法添加您的评论。请稍后重试。
若要添加评论,需要您的家长授予您相应权限。请求权限
您的家长禁用了评论功能。
很抱歉,我们当前无法删除您的评论。请稍后重试。
您已超过了一天之内允许提供的评论数上限。请在 24 小时后重试。
因为我们的系统表明您可能在向其他用户提供垃圾评论,您的帐户已禁用了评论功能。如果您认为我们错误地禁用了您的帐户,请联系 Windows Live 支持部门
完成下面的安全检查,您提供评论的过程才能完成。
您在安全检查中键入的字符必须与图片或音频中的字符一致。
PodānsVadi​ms 在此页禁用了评论功能。
Отлично! :)
Масенькая придирка :) -
$AccessRule = new-object System.Security.AccessControl.FileSystemAccessRule "TestUser","Modify","Allow"
можно без временной переменной :)

Жду продолжения.

5 月 23 日
AndreyR发表:
должно пригодиться , спасибо большое
5 月 22 日

引用通告

此日志的引用通告 URL 是:
http://vpodans.spaces.live.com/blog/cns!BB1419A2CFC1E008!149.trak
引用此项的网络日志