Robocopy权限被拒绝


11

Robocopy已预装Windows7。过去,我已经使用过很多次。我试图将文件夹复制到远程共享

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\

您是否尝试过将共享文件夹映射到驱动器号?
CGA

是的,我先尝试了。同样的结果
Edosoft

您是否尝试过拥有共享文件夹的所有权?您是在工作组还是Active Directory域上?
CGA

我正在使用工作组。我确实拥有所有权。
Edosoft

如果使用/ V参数,详细模式是否还会提供其他信息?错误5通常是拒绝访问消息。您可以在命令提示符下使用COPY命令吗?这是否可以与其他UNC一起使用,还是Drobo是唯一失败的Drobo?如果是这样,Drobo人可能是寻求答案的最佳场所。
Jeffery Hicks,2009年

Answers:


12

这里引用:

就我而言,我一开始就完全控制了源共享和目标共享。问题在于Robocopy在开始递归子目录之前将目标共享上的ACL重置为空值(没有人允许)。经过一些快速测试,我的结论是Robocopy不处理继承的权限。假设您要将C:\ Share1复制到D:\,并且C:\ Share1从C:\根目录继承其权限,则它实际上没有显式的ACL。因此,当您复制其ACL时,实际上是在复制……什么也没有。通过将空的ACL复制到目标位置,您的权限将在复制的第一步中删除,并且随后对该共享的所有所有写操作都会因错误5而失败。

仅当从要访问的具有继承权限的源和要访问的没有继承权限的目标中复制时,这才是问题。如果将C:\(在ACL中有明确的名称)复制到D:\,则没有问题。如果确实是您的问题,则可以通过完全控制将自己明确添加到源ACL中,从而解决此问题。运行副本时,您的ACL条目将复制到目标位置,并且可以写入后续文件副本。复制完成后,您可以撤消更改(在源和目标上)。

如果上述情况仍然存在问题,则可能需要考虑尝试使用/ B开关,该开关将尝试使用您作为备份操作员的特权来备份文件。这将允许您复制原本无法复制的文件,例如,如果您不在目标共享的ACL上。Robocopy默认为尝试重新启动副本。通过放弃可重新启动的副本,最坏的情况是,如果发生中断,您将丢失当前正在传输的文件。下一遍将从该文件的开头而不是途中重新启动该文件。

希望能有所帮助。以下是Microsoft Robocopy文档中有关/ B开关的报价:

引用:

如果将NTFS安全信息(ACL)与文件数据一起复制,则可以将具有读取访问权限但没有写入访问权限的文件复制到其中。将此类文件复制一次并应用ACL后,当您尝试再次复制文件时,可能会发现此错误并出现“访问被拒绝”错误。在这种情况下,您应该使用/ B或/ ZB开关在备份模式下复制文件。

/ B使用备份语义(备份模式)复制所有文件。/ ZB首先尝试以可重新启动的模式复制文件(以提高弹性),但是如果失败并出现“访问被拒绝”错误,它将自动使用备份模式重试该复制。



2

除了以前的答案,我还可以扩展对我有用的修复程序。在我的情况下,我有本地文件夹和文件,但所有权是系统上的另一个用户声明的。我只是声称拥有所有文件夹和子文件夹的所有权,并且在没有备份开关的情况下一切正常。

声明文件夹及其子文件夹的所有权:http : //technet.microsoft.com/zh-cn/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)

}

值得注意的是,该脚本与Windows Powershell一起使用。
凯文·费根
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.