2014-06-06 36 views
8

Mam skrypt, który napisałem, który zastępuje pliki. Przesyłam do niego parametry dla nazwy pliku i lokalizacji bazowej do wyszukiwania. Linie pracownika są:Get-ChildItem - liczba raportów "Odmowa dostępu" w folderze Moje dokumenty i innych punktach połączenia

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

ustawić $ startLocation „C: \ Users”, jednak otrzymuję odmowa dostępu podczas próby recurse przez innych użytkowników folderów. Jestem pełnoprawnym administratorem komputera i już próbowałem uruchamiać powershell jako administrator. Mogę uzyskać dostęp do wszystkich plików za pomocą Eksploratora Windows bez problemu. Dowolny pomysł?

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

Chociaż nie byłem w stanie dostać pracy przez GCI, byłem w stanie wykorzystać WMI, aby rozwiązać mój problem. Dla zainteresowanych:

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

Czy UAC jest włączony? Próbowałem na systemie Windows 7 non-UAC z wieloma użytkownikami i nie napotkałem odmowy dostępu podczas próby uzyskania dostępu do katalogów innych użytkowników. Jakiej wersji OS/Powershell używasz? – mcating

+0

UAC jest wyłączony, ale jestem również w domenie. Nie pamiętam, czy to coś zmieni, czy nie. Uruchamianie wersji Pro 64-bitowej i Powershell 2 –

Odpowiedz

2

udało mi się odtworzyć to na Windows 7 maszynie za pomocą następującego polecenia zalogowany jako o nazwie „admin” użytkownikowi administratora, bieganie PowerShell z podwyższonymi uprawnieniami i UAC wyłączone:

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

i

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

na podstawie artykułu here, wygląda na to Moje dokumenty, Moja muzyka, etc., są definiowane jako punktów węzłowych dla wstecznej compatibilit y z oprogramowaniem pre-Vista. Powershell nie radzi sobie dobrze natywnie z punktami skrzyżowania. Wygląda na to, że istnieje kilka opcji:

1) Usuń opcję -force z komendy Get-ChildItem. To jest prawdopodobnie twój najlepszy zakład.

get-childitem c:\users -recurse 

działa bezbłędnie i pomija punkty połączenia i katalogi systemowe, takie jak AppData.

2) Jeśli z jakiegoś powodu konieczne będzie użycie siły, można programowo powtórzyć każdy podkatalog, pomijając punkty połączenia. This article opisuje mechanizm identyfikacji punktów połączenia. Szkielet tego w pliku skryptu .ps1 może wyglądać następująco:

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 $_ } 
+0

To nie zadziała w mojej sytuacji, ponieważ próbowałem zastąpić elementy w aplikacji Appdata innych użytkowników. Bez -Force nawet nie próbowałby znaleźć folderu Appdata. –

+0

Siła usuwania nie pomaga i nie ma nic wspólnego z punktami skrzyżowania. Mam taki sam problem z plikami tymczasowymi. – Suncatcher