Получить разрешение на удаление папки профиля 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, но это будет значительно больше кода.