« 2011年9月のコミックス | メイン | 2011年10月のコミックス »

2011年9月25日 (日)

 Robocopy.exeを用いてバックアップからアクセス権のみをコピーする方法

NTFSのアクセス権設定で「下位に継承しているアクセス権」を削除するオペレーションを行う(※)場合、自分が行おうとしている操作の意味を正確に理解していないと、大きなトラブルを引き起こす場合があります。

(※ フォルダアクセス権の「詳細設定」で、「適用先」を変更する時が危険)

ひどい場合にはすべてのユーザのACLがなくなってしまうことも。
こうなってしまうと、上位フォルダのアクセス権を再度「下位に継承する」に戻しても、下位のオブジェクトの「所有者」でない限り、アクセス権を変更する権限がないため元に戻りません。
takeown コマンドで所有権を奪ってしまえば済む場合もあるかもしれませんが、アクセス権管理をフォルダの作成者(所有者)に移譲してる場合や、クォータ等でユーザごとのデータ量を集計している場合などでは支障が出るため、実環境への適用は難しいでしょう。

となるとバックアップから復旧させることになるわけですが、バックアップ後に更新したファイルが先祖がえりしたり、削除したはずのファイルが復活してしまったりするので、単純に置き換えればよいというわけにはいきません。
(短い周期でスナップショットを取っている環境では大丈夫かもしれませんが)

そんなわけで、このトラブルの対応は意外と面倒なのですが、そんな状況に陥ることが少ないからか(笑)、まとまった情報が少ないみたい。
せっかくなので、今回トラブル対応で調べた結果をまとめておきます。


サードパーティのツールを使わない場合、タイトル通りRobocopy.exeを使う方法がベストだと思うのですが、検索すると出てくるMicrosoftの一次情報

Robocopy を使用して、ファイルのデータをコピーせずにセキュリティ情報をコピーする方法

は、内容が古く(NT/2000時代の遺物)、おまけに意味がよく分かりません。
仕方ないので、よく分からないままとりあえずテストしようとしても、Vista/2003では「/SECFIX というオプションはない」と言われ、Windows 7 では「エラー: /コピーする WHICH セキュリティ情報を指定せずに SECFIX が指定されました。」という意味不明のエラーが表示されてお手上げ状態になってしまいます(笑)。

これについて、sunvisorさんの力作Robocopy.docの日本語版(2003のResurce Kitを元にしたもの)で調べると、

/TIMFIX と /SECFIX はサポートされなくなりました。これらのスイッチを使用しているスクリプトがある場合は,その代わりに/COPY: を使って修正する必要があります。元の /TIMFIX は /COPY:T に,/SECFIX は /COPY:S に変更します。

とあるので、以下のような流れになっているようです。

  1. 2000時代のRobocopy.exeには、/SECFIXオプションがあった。
  2. Vista/2003時代のRobocopy.exeから/SECFIXオプションがなくなり、代わりに/COPYオプションが強化され、S(ACL)やO(所有者)を指定してコピーできるようになった。
  3. 7/2008のRobocopy.exeには/SECFIXオプションが復活したが、明示的にACLのコピーを指定(/COPY:S)しないと動作しなくなった。

この/SECFIXというオプションが何者なのか、Windows 7付属のRobocopy.exeの/?オプションやヘルプで調べてみると、以下のようになっています。

/SECFIX :: スキップしたファイルも含むすべてのファイルのファイル セキュリティを修正します。(Fixes file security on all files, even skipped ones.)

英語の方がまだわかりやすいかな?
要は、/SECFIX は /XC /XN /XO などのオプションでコピー対象から除外したファイル(ログで「スキップ」にカウントされるファイル)についてもACLのコピーを行うというオプションなのです。
(/SECFIX を指定せずに /COPY:S すると、「スキップ」されたファイルのACLはコピーされません)
しかしちょっと考えてみると、/COPY:S でACLのコピーが指定できるなら、ファイルや属性情報のコピーに使うのと同じオプションでフィルタリングができた方が、統一感があってよいはず。

たぶんMicrosoftも同様に考えてVista/2003では一旦仕様落ちにしたものの、互換性に関するクレームを受け仕方なく7/2008で無理やり復活させることになった……。
/SECFIX オプションがこんなに分かりにくい状態になってしまったのは、そのような経緯によるものだと思われます。


そんなわけでまとめると、Robocopy.exeを使ってバックアップデータからアクセス権(と所有者の情報)をコピーするには、/SECFIX を使わずに以下のようにするのが良いと思います。

robocopy.exe <コピー元> <コピー先> /COPY:SO /IS /E /B /LOG:robocopy.log

オプションの意味は以下の通りです。

ACLをコピーする対象ファイルをコントロールしたい場合は、通常の「ファイル選択オプション」を使うことができます。

投稿者 yone : 2011年9月25日 18:22

コメント

コメントしてください




保存しますか?