Как изменить владельца папки с помощью Powershell, когда Get-Acl возвращает «Отказано в доступе»? - PullRequest
6 голосов
/ 21 ноября 2011

У меня есть вопрос о 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?

Ответы [ 3 ]

8 голосов
/ 22 ноября 2011

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

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

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

4 голосов
/ 22 ноября 2011

У меня есть несколько сценариев конфигурации системы от нашего сборщика, и я вспоминаю заметку о том, что команда 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
0 голосов
/ 16 августа 2017

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

$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
}
...