I'm trying to delete files like desktop.ini, Thumbs.db, etc, using the following powershell command to recurse over a root directory on an external hard drive:
Get-ChildItem -Path . -Include Thumbs.db, Picasa.ini, .picasa.ini, AlbumArt_*.jpg, AlbumArtSmall.jpg, desktop.ini, Folder.jpg -Recurse -Name -Force | Remove-Item -ForceBut I keep getting the following error:
Get-ChildItem : Access is denied
At line:1 char:1
+ Get-ChildItem -Path . -Include Thumbs.db, Picasa.ini, .picasa.ini, Al ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : NotSpecified: (:) [Get-ChildItem], UnauthorizedAccessException + FullyQualifiedErrorId : System.UnauthorizedAccessException,Microsoft.PowerShell.Commands.GetChildItemCommandThe command prompt in which I start powershell (to run the above command) is run as an administrator, so I don't know why I'm getting 'Access Denied' still.
Even if I remove the Remove-Item part to just list the files matching those filenames, I still get the above error.
I also tried adding -Verbose tag to see if the folder which is throwing 'Access Denied' gets listed, but it does not.
Any ideas how I can get the above command to work ?
21 Answer
Access Control can be set so tight that even a user with Admin privileges can view the contents of some folders. Under a UserProfile, the following paths will throw AccessDenied errors:
- $Env:UserProfile\AppData\Local\Application Data
$Env:UserProfile\AppData\Local\History
$Env:UserProfile\AppData\Local\Microsoft\Windows\INetCache\Content.IE5
$Env:UserProfile\AppData\Local\Microsoft\Windows\INetCache\Low\Content.IE5 $Env:UserProfile\AppData\Local\Microsoft\Windows\Temporary
Internet Files
$Env:UserProfile\AppData\Local\Temporary Internet Files
$Env:UserProfile\Application Data
$Env:UserProfile\Cookies
$Env:UserProfile\Documents\My Music
$Env:UserProfile\Documents\My Pictures
$Env:UserProfile\Documents\My Videos
$Env:UserProfile\Local Settings
$Env:UserProfile\My Documents
$Env:UserProfile\NetHood
$Env:UserProfile\PrintHood
$Env:UserProfile\Recent
$Env:UserProfile\SendTo
$Env:UserProfile\Start Menu
$Env:UserProfile\Templates
These happen to be junctions, but ultimately, the behavior is due to permissions.
I generated the above list with the following bit of PowerShell code. It collects all the paths that throw an error when recursive iteration is attempted, along with the folder's attributes and Access Control List (ACL).
gci -ad -Force -Recurse -ev AccessErrors -ea silent | out-null
( $ForbiddenFolderInfo = $AccessErrors.TargetObject | get-acl | %{ [PSCustomObject]@{ 'Path' = ( $_.Path -split '::' )[-1] 'Attributes' = ( gi $_.Path -Force ).Attributes 'Access' = $_.AccessToString
}} ) | flWhen run from the root of the System Drive, the first couple of items will be:
Path : C:\Documents and Settings
Attributes : Hidden, System, Directory, ReparsePoint, NotContentIndexed
Access : Everyone Deny ReadData Everyone Allow ReadAndExecute, Synchronize NT AUTHORITY\SYSTEM Allow FullControl BUILTIN\Administrators Allow FullControl
Path : C:\ProgramData\Application Data
Attributes : Hidden, System, Directory, ReparsePoint, NotContentIndexed
Access : Everyone Deny ReadData Everyone Allow ReadAndExecute, Synchronize NT AUTHORITY\SYSTEM Allow FullControl BUILTIN\Administrators Allow FullControl
Path : C:\ProgramData\Desktop
Attributes : Hidden, System, Directory, ReparsePoint, NotContentIndexed
Access : Everyone Deny ReadData Everyone Allow ReadAndExecute, Synchronize NT AUTHORITY\SYSTEM Allow FullControl BUILTIN\Administrators Allow FullControl
Path : C:\ProgramData\Documents
Attributes : Hidden, System, Directory, ReparsePoint, NotContentIndexed
Access : Everyone Deny ReadData Everyone Allow ReadAndExecute, Synchronize NT AUTHORITY\SYSTEM Allow FullControl BUILTIN\Administrators Allow FullControl
Path : C:\ProgramData\Microsoft\Windows\SystemData
Attributes : Directory
Access : NT AUTHORITY\SYSTEM Allow FullControl NT SERVICE\TrustedInstaller Allow FullControl