Odmowa zgody na robocopy

11

Robocopy jest fabrycznie zainstalowany w systemie Windows 7. W przeszłości używałem go wiele razy. Próbowałem skopiować folder do zdalnego udziału

robocopy c:\source "\\server\share\path" /s /r:2 /w:2` 

W rezultacie otrzymałem odmowę zgody. Za pomocą Eksploratora mogę kopiować pliki do tego udziału. Otworzyłem wiersz polecenia z uprawnieniami administratora z tym samym wynikiem. Udział jest przeznaczony do odczytu / zapisu publicznego.

EDYCJA Udało mi się zmapować sterownik do udziału, ale robocopy nadal nie działa

EDYCJA Dodałem przełącznik / B bez powodzenia. Dokładny błąd to:

2009/09/26 20:43:14 ERROR 5 (0x00000005) 
    Accessing Destination Directory \\drobo\Drobo\fotos\__NEW\Ericsson\
Edosoft
źródło
Czy próbowałeś zmapować folder współdzielony na literę dysku?
CGA
Tak, najpierw tego spróbowałem. Ten sam wynik
Edosoft
Czy próbowałeś przejąć na własność folder współdzielony? Czy jesteś w grupie roboczej lub w domenie Active Directory?
CGA
Korzystam z grupy roboczej. Wziąłem na własność.
Edosoft,
Jeśli użyjesz parametru / V, czy tryb Verbose daje jakieś inne informacje? Błąd 5 jest zwykle komunikatem o odmowie dostępu. Czy w wierszu polecenia można użyć polecenia KOPIUJ? Czy to działa z innymi UNC czy tylko Drobo zawodzi? Jeśli tak, ludzie Drobo mogą być najlepszym miejscem, w którym można uzyskać odpowiedzi.
Jeffery Hicks,

Odpowiedzi:

12

Cytowany stąd :

W moim przypadku zacząłem od pełnej kontroli udziałów źródłowych i docelowych. Problem polegał na tym, że Robocopy resetuje listę ACL udziału docelowego do wartości zerowej (nikt nie ma pozwolenia), zanim zaczęła rekursować podkatalogi. Po kilku szybkich testach doszedłem do wniosku, że Robocopy nie obsługuje odziedziczonych uprawnień. Załóżmy, że kopiujesz C: \ Share1 do D: \, a C: \ Share1 dziedziczy swoje uprawnienia z katalogu głównego C: \, w rzeczywistości nie ma wyraźnej listy ACL. Dlatego, kiedy kopiujesz jego ACL, w rzeczywistości kopiujesz ... nic. Kopiując pustą listę ACL do miejsca docelowego, uprawnienia są usuwane w pierwszym kroku kopiowania, a wszystkie kolejne zapisy do udziału kończą się błędem 5.

Jest to problem tylko w przypadku kopiowania ze źródła, do którego uzyskujesz dostęp Z odziedziczonymi uprawnieniami i miejsca docelowego, do którego masz dostęp BEZ odziedziczonych uprawnień. Jeśli skopiujesz C: \ (który ma cię wyraźnie w swojej ACL), do D: \, nie ma problemu. Jeśli to rzeczywiście jest twój problem, możesz go rozwiązać, dodając się jawnie do źródłowej listy ACL z pełną kontrolą. Po uruchomieniu kopii wpis ACL zostaje zduplikowany do miejsca docelowego, a kolejne kopie plików można zapisać. Możesz cofnąć zmiany (zarówno źródłowe, jak i docelowe) po zakończeniu kopiowania.

Jeśli pomimo powyższych problemów nadal występują problemy, możesz rozważyć użycie przełącznika / B, który próbuje wykonać kopię zapasową pliku przy użyciu uprawnień jako operatora kopii zapasowej. Umożliwi to kopiowanie plików, których w innym przypadku nie byłby możliwy, na przykład, jeśli nie ma na liście ACL udziału docelowego. Robocopy domyślnie próbuje podjąć próbę ponownego uruchomienia kopii. Porzucając kopie do ponownego uruchomienia najgorszym przypadkiem jest utrata aktualnie przesyłanego pliku w przypadku zakłócenia. Następne przejście uruchomi ponownie ten plik od początku zamiast w połowie.

Mam nadzieję, że to pomaga. Oto cytat z dokumentu Robocopy firmy Microsoft dotyczący przełącznika / B:

Zacytować:

Jeśli kopiujesz informacje o bezpieczeństwie NTFS (ACL) wraz z danymi pliku, możesz kopiować pliki, do których masz dostęp do odczytu, ale nie masz dostępu do zapisu. Po skopiowaniu takiego pliku i zastosowaniu list ACL może się okazać, że pojawia się błąd „Odmowa dostępu” przy ponownej próbie skopiowania pliku. W tej sytuacji należy użyć przełącznika / B lub / ZB, aby skopiować pliki w trybie kopii zapasowej.

/ B kopiuje wszystkie pliki z semantyką tworzenia kopii zapasowych (Tryb kopii zapasowej). / ZB najpierw próbuje skopiować pliki w trybie umożliwiającym ponowne uruchomienie (w celu zwiększenia odporności), ale jeśli to się nie powiedzie z błędem „Odmowa dostępu”, automatycznie spróbuje skopiować kopię w trybie kopii zapasowej.

harrymc
źródło
5

Spróbuj skopiować pliki przy użyciu Backupflagi:

/ B: Kopiuj pliki w trybie kopii zapasowej.

Andreas Grech
źródło
Dzięki, spróbuję tego.
Edosoft,
Czym różni się polecenie / ZB?
Starszy inżynier systemowy
2

Oprócz poprzednich odpowiedzi mogę rozszerzyć o poprawkę, która działała dla mnie. W moim przypadku miałem lokalne foldery i pliki, do których prawa własności zgłosił inny użytkownik w systemie. Po prostu zgłosiłam własność wszystkich folderów i podfolderów i wszystko działało dobrze bez przełącznika kopii zapasowej.

Zgłoś własność folderu i jego podfolderów: http://technet.microsoft.com/en-us/magazine/ff404240.aspx

Marcus
źródło
Czy w takim przypadku folder musi być własnością właściciela konta użytkownika skryptu wsadowego?
Starszy inżynier systemowy
1

Możesz także napisać skrypt, aby to naprawić automatycznie

# To run robocopy with logging which logs errors
robocopy source dest /MIR /NP /TEE /R:0 /W:1 /FFT /LOG+:log.txt 

# get errors from log and use set-content so it only writes if there are errors.
get-content log.txt | select-string "0x00000005" | set-content errors.log

#if statements to check if it even had errors.  only if errors go into if statement.
if (test-path errors.log) {

    #now capture the paths exactly.  Get-unique so it writes one error only once. 
    #Will assume you're using UNCs to copy vs. drive letters, please modify as necessary
    select-string -path errors.log -pattern "\\\\.*$" | %{ $_.Matches[0].captures[0].value} | get-unique > paths.log

    #just do foreach loop for each path.
    foreach ($path in $paths) { 

        #use subinacl to take ownership and assign permissions, it is better and faster 
        #than icacls and ps ways but you can use whatever works.  Report the changes you 
        #made.  if '$path' is a folder then you will need to modify subinacl command to 
        #inherit etc.  look it up.
        .\subinacl /file "$path" /setowner="YOUR ID" >> change-perms.log
        .\subinacl "$path" /grant="your ID"=F >> change-perms.log

    }

    #run your robocopy command again to copy missed file in previous step. 
    robocopy source dest /MIR /NP /TEE /R:0 /W:1 /FFT /LOG+:log.txt 

    #Delete the error log file so it does not go in to if loop next time you run.
    remove-item error.log (use force, erroraction etc as necessary)

}
N. Naik
źródło
Warto zauważyć, że ten skrypt jest przeznaczony do użycia z Windows Powershell.
Kevin Fegan