Contents of this directory is archived and no longer updated.

Примечание: данный пост перепечатан в связи с закрытием бложиков на 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 и им уже сменить владельца).


Share this article:

Comments:

Comments are closed.