Примечание: данный пост перепечатан в связи с закрытием бложиков на spaces.live.com, как имеющий какую-то ценность для автора и/или читателей.
В 3-й части стати Управление ACL в PowerShell я говорил, что не представляется возможным нативно через метод SetOwner изменить владельца объекта на кого-нибудь, кроме себя или группы Administrators (Администраторы). Эту операцию невозможно было сделать и в GUI в Windows 2000/XP. Но в Windows Server 2003 появилась возможность изменять владельца объекта на любого пользователя или группу из GUI. Для этой операции требуется лишь право Se_Restore - Restore directories and files в локальной политике безопасности, разделе User Rights Assignment. По умолчанию данное право дано администраторам (Administrators) и операторам архива (Backup Operators). Однако, данное право не включено по умолчанию. К сожалению .NET пока что не имеет "родного" метода, чтобы включить данное право, в результате чего используя скрипты PowerShell мы не сможем полноценно использовать новую в Windows Server 2003 функцию. Но не всё так плохо, как может показаться - есть обходное решение данной проблемы. Данную проблему решили в проекте PowerShell Community Extensions.
Для использования этой привилегии необходимо установить пакет PowerShell Community Extensions 1.1.1 (там же и описание возможностей, которые включены в эти расширения). После установки пакета можно начинать использовать данное расширение:
# считываем в переменную список ACL объекта $ACL = Get-Acl C:\Test # Переводим имя нового владельца в SID $Account = new-object System.Security.Principal.NTAccount("TestUser") # создаём необходимую привилегию для использования и записываем её в переменную $SeRestore = new-object Pscx.Interop.TokenPrivilege "SeRestorePrivilege", $true # здесь уже записываем созданную привилегию командой SetPrivilege Set-Privilege $SeRestore # запись нового владельца объекта стандартным методом SetOwner $ACL.SetOwner($Account) # запись нового ACL в папку $ACL | Set-Acl C:\Test
Это было в расширенном варианте. Данный скрипт можно смело упростить до:
$ACL = Get-Acl C:\Windows Set-Privilege (new-object Pscx.Interop.TokenPrivilege "SeRestorePrivilege", $true) $ACL.SetOwner((new-object System.Security.Principal.NTAccount("TestUser"))) $ACL | Set-Acl C:\Test
Решение в виде установки дополнительных расширений не является самым идеальным, но тем не менее позволяет использовать чистый PowerShell для операции (а ведь можно было из PowerShell запустить SubInacl и им уже сменить владельца).
Comments: