10

Robocopy предустановлен с Windows 7. Я использовал это много раз в прошлом. Я пытался скопировать папку на удаленный ресурс с

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

В результате я получаю разрешение отказано. С помощью проводника я могу копировать файлы в эту папку. Я открыл командную строку с правами администратора с тем же результатом. Доля доступна для чтения / записи для общественности.

РЕДАКТИРОВАТЬ Я успешно сопоставил диск-буклет для общего ресурса, но robocopy по-прежнему не удается

РЕДАКТИРОВАТЬ Я добавил /B ключ без успеха. Точная ошибка:

2009/09/26 20:43:14 ERROR 5 (0x00000005) 
    Accessing Destination Directory \\drobo\Drobo\fotos\__NEW\Ericsson\

4 ответа4

12

Цитируется здесь :

В моем случае я начал с полного контроля над исходными и целевыми акциями. Проблема заключалась в том, что Robocopy сбрасывал ACL на целевом ресурсе в нулевое значение (никто не имеет разрешения) до того, как он начал рекурсивные подкаталоги. После нескольких быстрых тестов я пришел к выводу, что Robocopy не обрабатывает унаследованные разрешения. Скажем, вы копируете C:\Share1 в D:\, а C:\Share1 наследует свои разрешения из корневого каталога C:\, на самом деле у него нет явного ACL. Поэтому, когда вы копируете его ACL, вы на самом деле копируете ... ничего. При копировании пустого списка ACL в место назначения ваши разрешения удаляются на первом этапе копирования, и все последующие записи в общий ресурс завершаются с ошибкой 5.

Это только проблема, когда вы копируете из источника, к которому вы обращаетесь, с помощью унаследованных разрешений WITH, и к месту назначения, к которому вы обращаетесь, без унаследованных разрешений. Если вы копируете C:\ (в котором вы явно указаны в ACL), в D:\ проблем не возникает. Если это действительно ваша проблема, вы можете решить ее, добавив себя явно в ACL-источник с полным контролем. Когда копия запускается, ваша запись ACL дублируется к месту назначения, и последующие копии файла могут быть записаны. Вы можете отменить свои изменения (как для источника, так и для пункта назначения) после завершения копирования.

Если у вас по-прежнему возникают проблемы, несмотря на вышесказанное, вы можете попробовать использовать ключ /B, который пытается создать резервную копию файла, используя ваши привилегии в качестве оператора резервного копирования. Это позволит вам копировать файлы, которые в противном случае вы не смогли бы, например, если вы не в ACL на вашей целевой папке. По умолчанию Robocopy пытается перезапустить копию. При отказе от перезапускаемых копий в худшем случае вы теряете файл, передаваемый в данный момент, в случае сбоя. Следующий проход перезапустит этот файл с начала, а не на полпути.

Надеюсь, это поможет. Вот цитата из документа Microsoft Robocopy относительно параметра /B:

Цитата:

Если вы копируете информацию о безопасности NTFS (ACL) вместе с данными файла, можно копировать файлы, к которым у вас есть права на чтение, но нет прав на запись. После того, как такой файл будет скопирован один раз, и ACL будут применены, вы можете обнаружить, что возникает ошибка «Отказано в доступе» при попытке скопировать файл снова. В этой ситуации вы должны использовать ключ /B или /ZB для копирования файлов в режиме резервного копирования.

/B копирует все файлы с семантикой резервного копирования (Backup Mode). /ZB сначала пытается скопировать файлы в режиме перезапуска (для большей отказоустойчивости), но если это не удается с ошибкой «Отказано в доступе», он автоматически повторяет попытку копирования в режиме резервного копирования.

5

Попробуйте скопировать файлы, используя флаг Backup :

/B: копировать файлы в режиме резервного копирования.

2

В дополнение к предыдущим ответам я могу дополнить исправление, которое сработало для меня. В моем случае у меня были локальные папки и файлы, права на которые были заявлены другим пользователем системы. Я просто заявил, что владею всеми папками и подпапками, и все работало без выключателя резервного копирования.

Заявить право собственности на папку и ее подпапки: http://technet.microsoft.com/en-us/magazine/ff404240.aspx

1

Вы также можете написать скрипт, чтобы исправить это автоматически

# 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)

}

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .