获得删除 windows 个个人资料文件夹的权限
Get permission to delete windows profile folder
我需要制作一个可以删除未使用的 windows 配置文件文件夹的脚本。
我在获取使用 PowerShell 删除 windows 配置文件文件夹的权限时遇到问题。使用 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 对象。不知道有没有不使用takeown.exe
:
获取ACL对象的方法
$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
我仍然不确定应该采用哪种技术。
AFAIK icacls
没有参数 /inheritance
。您指定继承设置以及权限:
icacls $path /grant 'administrators:(OI)(CI)F' /t /c /q
请注意,您需要在 user/permissions 参数周围加上引号,这样 PowerShell 就不会将括号计算为分组表达式。
为了安全起见,我可能还会重置子对象的权限:
icacls "$path\*" /reset /t /c /q
为了简单起见,我会坚持使用 takeown
和 icacls
。您可以使用 PowerShell 完成这两项操作,但代码量会多得多。
我需要制作一个可以删除未使用的 windows 配置文件文件夹的脚本。
我在获取使用 PowerShell 删除 windows 配置文件文件夹的权限时遇到问题。使用 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 对象。不知道有没有不使用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
我仍然不确定应该采用哪种技术。
AFAIK icacls
没有参数 /inheritance
。您指定继承设置以及权限:
icacls $path /grant 'administrators:(OI)(CI)F' /t /c /q
请注意,您需要在 user/permissions 参数周围加上引号,这样 PowerShell 就不会将括号计算为分组表达式。
为了安全起见,我可能还会重置子对象的权限:
icacls "$path\*" /reset /t /c /q
为了简单起见,我会坚持使用 takeown
和 icacls
。您可以使用 PowerShell 完成这两项操作,但代码量会多得多。