Найти тему
Steam Paul

chown в Windows на PowerShell

Вы когда-нибудь сталкивались с необходимостью в скрипте массово рекурсивно поменять владельца? И не на текущего, а на определенного? Моя задача была сложнее, поменять владельца только если владельцем является определенный пользователь. На помощь мне пришел Powershell.

$Path = $args[0];
$NewOwnerText = $args[1];
$NewOwnerObject = New-Object System.Security.Principal.NTAccount($NewOwnerText);
$TMPFiles = (Get-ChildItem $Path -Recurse).FullName;
foreach ($file In $TMPFiles){
$FileOwner = (Get-Acl $file).Owner;
if ($FileOwner -eq "BUILTIN\User"){
$Acl = Get-ACL $file;
$Acl.SetOwner($NewOwnerObject);
$acl | Set-Acl $file;
$file + " - " + $FileOwner + " - " + (Get-Acl $file).Owner;
}
}

Этот скрипт запускается с двумя параметрами; первый - путь до папки, которую обрабатываем, второй - на кого меняем владельца.

В 7-й строке указан BUILTIN\User, что это значит? это та самая учетка, которую мы ищем, чтобы её сменить на посту владельца. BUILTIN - означает, что ищем локальный объект, не член домена, User - логин пользователя, или имя группы.

Если Вам не нужно искать определенного пользователя, просто уберите это условие.

Недостатки

Если в пути, или имени файла используются символы регулярных выражений, такой файл PowerShell не найдет, так как примет за регулярку. Для обхода таких проблем существует параметр LiteralPath, но, к сожалению, с его помощью обратиться к параметру Владелец в ACL(списке контроля доступа) файла невозможно. Надеюсь, Microsoft это однажды пофиксят.

Мне не удалось обработать файлы, полный путь к которым превышает 256 символов. Слышал, что это ограничение убрали в некоторых сборках Windows10/Server2019, но не проверял, нет такой возможности.