Robocopy の使い方、オプションについて
robocopy の基本的なつい買い方、オプションについては以下をご参照ください。
Windowsは管理者(admin)権限でもアクセス権が無ければアクセス拒否される
Windows は Linux とは異なり、administrator であってもアクセス権が付与されていないファイル/フォルダについてはアクセス拒否されます。
robocopy においても同様ですが、robocopy には /B オプションが用意されており、これを使うことでアクセス権無視でコピーが可能になります。
robocopy /B とは
robocopy で /B オプションを使うと『バックアップモード』と呼ばれるモードで実行します。このモードで動作させた場合、アクセス権を無視したファイルコピーが可能となります。
ただし条件があります。それは『SeBackupPrivilege』と呼ばれる権限を持つユーザで実行することです。この権限は Administrator の他、ビルトイングループの『BackupOperators』に与えられています。
なので robocopy をバックアップモードで動作させるためには、Administrator、もしくは BackupOperators グループに所属しているユーザでログインし、そのユーザ権限で実行する必要があります。
バックアップモードで『アクセスが拒否されました』と出るケースは?
バックアップモードで動作しても『アクセスが拒否されました』『0x00000005』『ERROR_ACCESS_DENIED』といったエラーが表示されることがあります。バックアップモードが正しく動作すれば、理論上はこのエラーは発生しません。何が足りないのでしょうか?
実際の挙動を確認したところ、CIFS 共有を使って roboopy /B をする場合は、以下2つの条件が必要なようです。
- CIFS 共有に使うユーザでも『SeBackupPrivilege』権限のあるユーザで実行する必要がある
- ユーザ名はローカルとリモートで同じアカウント名を使う必要がある(つまりローカルでのログインユーザとCIFS共有で使うユーザが同じ綴りである)
パスワードは異なっていても良いようです。
もし上記エラーが出た場合は、Local Administrator にログインし、CIFS 共有接続でもリモートサーバの Local Administrator で接続してみると良いでしょう。
それでもダメな場合はファイルが特殊かも?
例えば EFS(Encrypted File System)により暗号化されたファイルは、暗号化した本人の権限でないとリモートへコピーできません。
これは、EFS がリモートコピー時に自動的に復号化を試みる動きをするためです。本人でないユーザが行うとアクセス拒否されます(adminであってもダメ)。
このケースでは /EFSRAW オプションにより暗号化されたままコピーすることが出来ます。ただし、移動先ボリュームには復号化のための鍵が無いので、根本的な解決にならない場合があります(本人がEFSの鍵をバックアップしていればセーフ)。
回復エージェントを設定していれば、admin権限にて復号可能です。
また、その他のケースとしては Linux ベースで作成した SymbolicLinkファイルを Windows へコピーしようとする場合や、Windows 固有のもの(代替データストリーム等)の含まれたファイルやフォルダを Linux へコピーしようとする場合に、上記エラーを吐くことがあるようです。
その場合は個別対処となりますが、Linux ベースのファイルやフォルダについては rsync を使ってコピーするか、バックアップ製品のボリューム単位での復元を行う方法があります。一方、Windows 固有のものが代替データストリームである場合は、この代替データストリームを引き継がないようにする(/DCOPY に D を付けない)か、事前にスクリプトで全検索・削除します。
コメント
コマンドの説明をしているサイトは山ほどあれど(みんな同じ説明)、記載の具体例を書いてくれているサイトは少ない。特にRobocopyなんぞ、マニアックなコマンドなので、機能は知っているし、まぁ書けるけど、あれ何が先だっけ?どうだっけ?でちょい具体例を見て安心したい、、、人が多いはず。
説明も大事だが各オプションの具体的記載例が有ったらよかったのになぁッ と思う人は多いはず。