В разрешении на робокопию отказано

11

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\
Edosoft
источник
Вы пытались сопоставить общую папку с буквой диска?
CGA
Да, я попробовал это первым. Тот же результат
Edosoft
Вы пытались стать владельцем общей папки? Вы находитесь в рабочей группе или домене Active Directory?
CGA
Я использую рабочую группу. Я взял на себя ответственность.
Edosoft
Если вы используете параметр / V, дает ли Verbose режим какую-либо другую информацию? Ошибка 5 обычно является сообщением об отказе в доступе. Из командной строки вы можете использовать команду COPY? Работает ли это с другими UNC или Drobo не работает? Если это так, люди Дробо могут быть лучшим местом для ответов.
Джеффри Хикс

Ответы:

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:

Quote:

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

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

harrymc
источник
5

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

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

Андреас Греч
источник
Спасибо, я попробую это.
Edosoft
Чем отличается команда / ZB?
Старший системный инженер
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)

}
N.Naik
источник
Стоит отметить, что этот скрипт предназначен для использования с Windows Powershell.
Кевин Феган