Как изменить владельца папки с помощью Powershell, когда Get-Acl возвращает отказ в доступе?

У меня вопрос о Get-Acl в Powershell. Я все время получаю сообщение об ошибке «Доступ к пути запрещен». Я хочу изменить владельца папки на себя, а затем предоставить себе полные права доступа к папке с помощью Powershell. Вот строка кода, выдающая ошибку:

$acl = Get-Acl "C:\SomeFolder"

Я использую Windows Explorer, чтобы установить разрешения для SomeFolder перед запуском скрипта. Вот они:

  • нет записей в списке контроля доступа
  • владелец не я

Я не получаю сообщение об ошибке, если сделаю себя владельцем с помощью графического интерфейса Windows Explorer перед запуском сценария Powershell. Я не понимаю, почему мне разрешено менять владельца с помощью проводника Windows, но не с помощью Powershell? У меня есть полные права администратора на этой машине. Windows 7, Powershell 2.0, .NET 3.5.

Я предполагаю, что единственный способ изменить владельца - это использовать Get-Acl, установить владельца в ACL, а затем использовать Set-Acl, чтобы записать его обратно в папку. Если есть другой способ, дайте мне знать? Как я могу изменить владельца папки с помощью Powershell?


person ajh4    schedule 21.11.2011    source источник


Ответы (3)


Windows Vista и более поздние версии включают инструмент командной строки takeown.exe, который можно использовать из командной строки с повышенными привилегиями (или консоли PowerShell с повышенными привилегиями) для изменения владельца объекта файловой системы.

takeown /F "C:\SomeFolder" /R /D Y

должен предоставить вам право собственности на C: \ SomeFolder и содержащиеся в нем объекты файловой системы.

person jon Z    schedule 21.11.2011
comment
Вы также можете использовать icacls в Windows 7 с переключателем / setowner. Просто упомяну альтернативу takeown.exe. - person Paolis; 17.08.2017

У меня есть несколько сценариев конфигурации системы от нашего разработчика, и я помню замечание о команде Get-Acl, которая "не работает на определенных путях".

# NOTE: This method does not work well?
#$acl = Get-Acl -Path $Path

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

$acl = (Get-Item $path).GetAccessControl("Access")

О, и это становится очень непонятным, когда у вас есть объект ACL. Я не знаю, лучший ли это способ сделать это, но это фрагмент того же сценария, о котором я упоминал выше.

$acl = (Get-Item $path).GetAccessControl("Access")

# Setup the access rule.
$allInherit = [System.Security.AccessControl.InheritanceFlags]"ContainerInherit", "ObjectInherit"
$allPropagation = [System.Security.AccessControl.PropagationFlags]"None"
$AR = New-Object System.Security.AccessControl.FileSystemAccessRule $user, $permissions, $allInherit, $allPropagation, "Allow"

# Check if Access already exists.
if ($acl.Access | Where { $_.IdentityReference -eq $User}) 
{
    $accessModification = New-Object System.Security.AccessControl.AccessControlModification
    $accessModification.value__ = 2
    $modification = $false
    $acl.ModifyAccessRule($accessModification, $AR, [ref]$modification) | Out-Null
} 
else 
{
    $acl.AddAccessRule($AR)
}

Set-Acl -AclObject $acl -Path $Path
person Anthony Mastrean    schedule 22.11.2011
comment
Спасибо за ответ. Я все еще получаю сообщение об отказе в доступе в первой строке кода. $acl = (Get-Item $path).GetAccessControl("Access") Я даже перепробовал все возможные аргументы, которые принимает метод GetAccessControl (Нет, Аудит, Владелец, Доступ, Владелец, Группа, Все). Но все равно не повезло, доступ запрещен. - person ajh4; 22.11.2011
comment
У вас должна быть фундаментальная проблема с разрешениями пользователей. Начните пробовать команду в разных каталогах (каталогах в Windows \, ​​каталогах, созданных одним и тем же пользователем и т. Д.). - person Anthony Mastrean; 22.11.2011
comment
Ты прав. У меня проблема с разрешением. Спасибо! Я использовал командлет whoami /priv. Я обнаружил, что у меня не включен SeTakeOwnershipPrivilege. Включать его с помощью PowerShell очень непросто. Вот пример того, как его включить ссылка После включения привилегии я создал новый ACL, установил владельца для этого нового ACL и, наконец, использовал set-acl для сохранения ACL обратно в папку. Спасибо за вашу помощь - person ajh4; 23.11.2011
comment
Пожалуйста, будьте либеральны в своих голосах. Это помогает указать опоздавшим на то, что вы получили некоторую помощь в этом ответе. - person Anthony Mastrean; 24.11.2011

приведенный выше код отлично работал. хотел опубликовать настройку для рекурсивного просмотра каталога и заполнения некоторых "отсутствующих"

$HomeFolders = Get-ChildItem "put your directory root here" -Directory -recurse
foreach ($HomeFolder in $HomeFolders) {
    $Path = $HomeFolder.FullName
    $acl = (Get-Item $Path).GetAccessControl('Access')
    $allInherit = [System.Security.AccessControl.InheritanceFlags]"ContainerInherit", "ObjectInherit"
    $allPropagation = [System.Security.AccessControl.PropagationFlags]"None"
    $permissions = "FullControl"
    $Username = "<put your name here>"
    $AR = New-Object System.Security.AccessControl.FileSystemAccessRule($Username, $permissions, $allInherit, $allPropagation, "Allow")
    if ($acl.Access | Where { $_.IdentityReference -eq $Username}) 
    {
        $accessModification = New-Object System.Security.AccessControl.AccessControlModification
        $accessModification.value__ = 2
        $modification = $false
        $acl.ModifyAccessRule($accessModification, $AR, [ref]$modification) | Out-Null
    } 
    else 
    {
        $acl.AddAccessRule($AR)
    }
    Set-Acl -path $Path -AclObject $Acl
}
person ldevin    schedule 16.08.2017