Получить разрешение на удаление папки профиля Windows

Мне нужно сделать скрипт, который может удалить неиспользуемые папки профиля Windows.

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

Я пытался решить эту проблему с помощью takeown.exe а также icacls вместе, и когда это никуда меня не привело, я попытался использовать takeown.exe с Set-Acl,

Этот код, когда я пытался использовать takeown.exe а также icacls:

$folderPath = "\\profileserver\ProfileWin8\ro1.V2"

# Take ownership and set permissions
function takeOwnership($path) {
    takeown.exe /F $path /A /r /d Y
    icacls $path /grant administrators:F /q /c /t /inheritance:e 
}

#Delete folder
function deleteFolder($path) { 
    Remove-Item $path -Force -Recurse -ErrorAction SilentlyContinue -Confirm:$false
}

takeOwnership($folderPath)
deleteFolder($folderPath)

Тогда я попробовал с Set-Acl который тоже не работает. Я должен использовать takeown.exe для папки, так как у меня нет владельца и, следовательно, не получит объект ACL в противном случае. Я не знаю, есть ли другой способ получить объект ACL без использования takeown.exe:

$folderPath = "\\profileserver\ProfileWin8\ro1.V2"

takeown.exe /F $folderPath /R /D Y

$acl = Get-Acl -Path $folderPath

$acl.Access | Write-Output

$colRights = [System.Security.AccessControl.FileSystemRights]"FullControl" 
$permission = "DOMAIN\user", $colRights, "ContainerInherit,ObjectInherit", "None", "Allow" 
$accessRule = New-Object System.Security.AccessControl.FileSystemAccessRule $permission  
$acl.AddAccessRule($accessRule)

$acl.SetAccessRuleProtection($false, $false)

$acl | Set-Acl $folderPath

Remove-Item $folderPath -Force -Recurse

Я все еще не уверен, с какой техникой я должен двигаться вперед.

1 ответ

Решение

Насколько мне известно icacls не имеет параметра /inheritance, Вы указываете параметры наследования вместе с разрешениями:

icacls $path /grant 'administrators:(OI)(CI)F' /t /c /q

Обратите внимание, что вам нужны кавычки вокруг аргумента user / permissions, чтобы PowerShell не оценивал скобки как выражения группировки.

Я бы, вероятно, также сбросил разрешения для дочерних объектов, чтобы быть в безопасности:

icacls "$path\*" /reset /t /c /q

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

Другие вопросы по тегам