web-dev-qa-db-ja.com

Robocopy許可が拒否されました

RobocopyはWindows 7にプリインストールされています。私はこれまで何度も使用しました。フォルダーをリモート共有にコピーしようとしました

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

その結果、私は許可が拒否されます。 Explorerを使用して、この共有にファイルをコピーできます。同じ結果で、管理者権限でコマンドプロンプトを開きました。共有は一般公開されます。

[〜#〜] edit [〜#〜]ドライブレターを共有に正常にマップしましたが、robocopyはまだ失敗します

[〜#〜] edit [〜#〜]/Bスイッチを追加しましたが、うまくいきませんでした。正確なエラーは次のとおりです。

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

here から引用:

私の場合、ソースと宛先の両方の共有を完全に制御することから始めました。問題は、Robocopyがサブディレクトリの再帰を開始する前に、宛先共有のACLをnull値(誰にも権限がない)にリセットしていたことでした。いくつかの簡単なテストの後、私の結論は、Robocopyは継承されたアクセス許可を処理しないということです。 C:\ Share1をD:\にコピーしていて、C:\ Share1がC:\ルートディレクトリから権限を継承しているとします。実際には明示的なACLはありません。したがって、そのACLをコピーすると、実際にはコピーされます...何も。空のACLを宛先にコピーすると、コピーの最初のステップでアクセス許可が削除され、その後の共有への書き込みはすべてエラー5で失敗します。

これは、継承された権限を使用してアクセスしているソースと継承された権限を使用せずにアクセスしている宛先からコピーする場合にのみ問題になります。 C:\(ACLで明示的に指定)をD:\にコピーしても、問題はありません。これが本当に問題である場合は、フルコントロールでソースACLに自分を明示的に追加することで解決できます。コピーが実行されると、ACLエントリが宛先に複製され、後続のファイルコピーを書き込むことができます。コピーが完了したら、(ソースと宛先の両方で)変更を元に戻すことができます。

上記にもかかわらず問題が解決しない場合は、/ Bスイッチを試してみることをお勧めします。これは、バックアップオペレーターとしての権限を使用してファイルをバックアップしようとします。これにより、コピー先の共有のACLにアクセスしていない場合など、他の方法では作成できなかったファイルをコピーできます。 Robocopyはデフォルトで再起動可能なコピーを試みます。再起動可能なコピーを放棄することによる最悪のケースは、中断の場合に現在転送中のファイルを失うことです。次のパスでは、途中からではなく、最初からファイルを再起動します。

お役に立てば幸いです。/Bスイッチに関するMicrosoftのRobocopyドキュメントからの引用は次のとおりです。

見積もり:

NTFSセキュリティ情報(ACL)をファイルデータと共にコピーすると、読み取りアクセス権はあるが書き込みアクセス権がないファイルをコピーすることができます。このようなファイルが1回コピーされ、ACLが適用された後、ファイルを再度コピーしようとすると、「アクセス拒否」エラーが発生する場合があります。この状況では、/ Bまたは/ ZBスイッチを使用して、バックアップモードでファイルをコピーする必要があります。

/ Bは、すべてのファイルをバックアップセマンティクスでバックアップします(バックアップモード)。/ZBは最初に(回復力を高めるために)再起動可能なモードでファイルをコピーしようとしますが、「アクセスが拒否されました」エラーで失敗すると、バックアップモードを使用して自動的にコピーを再試行します。

12
harrymc

Backupフラグを使用してファイルをコピーしてみてください:

/ B:バックアップモードでファイルをコピーします。

5
Andreas Grech

以前の回答に加えて、私のために働いた修正で拡張できます。私の場合、ローカルフォルダーとファイルがあり、システムの別のユーザーが所有権を主張していました。私は単にすべてのフォルダーとサブフォルダーの所有権を主張し、すべてがバックアップスイッチなしで正常に機能しました。

フォルダーとそのサブフォルダーの所有権を要求します。 http://technet.Microsoft.com/en-us/magazine/ff404240.aspx

2
Marcus

これを自動的に修正するスクリプトを書くこともできます

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

}
1
N.Naik