webentwicklung-frage-antwort-db.com.de

Get-ChildItem -force meldet "Zugriff verweigert" im Ordner "Eigene Dateien" und an anderen Knotenpunkten

Ich habe ein Skript, das ich geschrieben habe, das Dateien ersetzt. Ich übergebe Params für den Namen der Datei und den Basisort, aus dem gesucht werden soll. Die Arbeiterlinien sind:

$SubLocations = Get-ChildItem -Path $Startlocation -Recurse -include $Filename -Force  | 
                Where { $_.FullName.ToUpper().contains($Filter.ToUpper())}

Ich habe $ Startlocation auf "C:\Users" gesetzt, jedoch wird mir der Zugriff verweigert, wenn versucht wird, durch andere Benutzerordner zu rekursieren. Ich bin Volladministrator auf dem Computer und habe bereits versucht, Powershell als Administrator auszuführen. Ich kann ohne Probleme auf alle Dateien über den Windows Explorer zugreifen. Irgendeine Idee?

Get-ChildItem : Access to the path 'C:\Users\jepa227\Documents\My Music' is denied.
At C:\Users\krla226\Google Drive\Documents\PowerShell\Replace-File.ps1:35 char:46
+ $SubLocations = Get-ChildItem <<<<  -Path $Startlocation -Recurse -    include $Filename -Force | 
    + CategoryInfo          : PermissionDenied: (C:\Users\jepa227\Documents\My     Music:String) [Get-ChildItem], Una 
   uthorizedAccessException
+ FullyQualifiedErrorId :  DirUnauthorizedAccessError,Microsoft.PowerShell.Commands.GetChildItemCommand

UPDATE

Obwohl ich es nicht über GCI zum Laufen bringen konnte, konnte ich WMI verwenden, um mein Problem zu lösen. Für Interessierte:

$SubLocations = Get-WmiObject -Class cim_datafile -Filter "fileName = '$filename' AND Extension = '$extension'" | 
                            Where { $_.Name.ToUpper().contains($Filter.ToUpper()) }
11
Kevin_

Ich konnte dies auf einem Windows 7-Computer reproduzieren, wobei der folgende Befehl als Administratorbenutzer mit dem Namen "admin" angemeldet war, Powershell mit erhöhten Berechtigungen ausgeführt und die UAC deaktiviert war:

get-childitem "c:\users\Admin\my documents"

und

cd "c:\users\admin\my documents"
get-childitem

Basierend auf dem Artikel hier , sieht es so aus, als wären "Eigene Dateien", "Meine Musik" usw. als Knotenpunkte für die Abwärtskompatibilität mit Pre-Vista-Software definiert. Powershell macht sich mit Verbindungspunkten nicht gut. Es scheint so, als gäbe es hier ein paar Möglichkeiten:

1) Entfernen Sie die Option -force aus dem Befehl Get-ChildItem. Dies ist wahrscheinlich die beste Wahl.

get-childitem c:\users -recurse

arbeitet fehlerfrei und überspringt Knotenpunkte und Systemverzeichnisse wie AppData.

Anmerkung des Herausgebers: Das Auslassen von -Force löst das unmittelbare Problem, überspringt jedoch alle ausgeblendeten Elemente, nicht nur die ausgeblendeten Knotenpunkte, die die durch den Zugriff verweigerten Fehler verursachen.

2) Wenn Sie den -Force aus irgendeinem Grund unbedingt verwenden müssen, können Sie jedes Unterverzeichnis programmgesteuert rekursieren und Verzweigungspunkte überspringen. Dieser Artikel beschreibt den Mechanismus zum Identifizieren von Knotenpunkten. Ein Skelett davon in einer .ps1-Skriptdatei könnte folgendermaßen aussehen:

Param( [Parameter(Mandatory=$true)][string]$startLocation )

$errorActionPreference = "Stop"

function ProcessDirectory( $dir )
{
  Write-Host ("Working on " + $dir.FullName)

  # Work on the files in this folder here
  $filesToProcess = ( gci | where { ($_.PsIsContainer -eq 0) } ) # and file matches the requested pattern
  # process files

  $subdirs = gci $dir.FullName -force | where {($_.Attributes -band [IO.FileAttributes]::ReparsePoint) -eq 0 -and ($_.PsIsContainer -eq 1) -and (![string]::IsNullOrEmpty($_.FullName))}

  foreach( $subdir in $subdirs )
  {
      # Write-Host( $subdir.Name + ", " + $subdir.FullName )
     if ( $subdir -ne $null )
     {
       ProcessDirectory -dir $subdir
     }
  }
}

$dirs = get-childitem $startLocation -force
$dirs | foreach { ProcessDirectory -dir $_ }
4
mcating

die hilfreiche Antwort von mcating erklärt das Problem gut.

Die von ihm vorgeschlagene schnelle Lösung besteht darin, -Force wegzulassen, was funktioniert, da PowerShell ignoriert ausgeblendete Elemente, sofern -Force nicht verwendet wird und diese systemdefinierten Knotenpunkte das Attribut Hidden (neben den Attributen ReparsePoint und System) besitzen.

Wenn Sie -Force für die Verarbeitung versteckter Elemente im Allgemeinen benötigen und nur diese systemdefinierten Knotenpunkte ignorieren möchten , können Sie den Get-ChildItem-Parameter von -Attributes wie folgt verwenden:

Get-ChildItem -Force -Recurse -Attributes !Hidden, !System, !ReparsePoint

Der -Attributes-Wert schließt aus alle Elemente, für die all der folgenden Attribute festgelegt ist: Hidden, System, ReparsePoint, die für alle systemdefinierten Knotenpunkte gilt.
Obwohl es technisch möglich ist, mit diesen Attributen eigene Verbindungspunkte (oder symbolische Links) zu erstellen, ist dies in der Praxis unwahrscheinlich.

1
mklement0