今回、初めて、Robocopyによるセキュリティ情報のコピーについて記事にします。robocopyのセキュリティ情報の扱いについては、いろいろと動作が変わったりしてきた経緯などもあるようで、禁断の領域に踏み込む感じです。
本記事では特に、
という観点で情報を整理してみました。
網羅的にまとめようとしたところ、いろいろと少し長い記事になってしまいましたので、ちゃんとセキュリティ情報をコピーするためにはどうすればよいか、結論だけを知りたい方は、最後の結論の章をご覧ください。
この記事では、現在のrobocopyの仕様を調査するため、個人的にいろいろ実験した結果を整理しています。あくまでも現在のバージョンのrobocopyを使った調査に基づいて書いており、過去のバージョンや、将来のバージョンでは動作が変わっている可能性がありますので、ご注意ください。また、本記事の内容の一部は独自調査に基づき作成したもので、Microsoftの公式情報ではありませんのでご注意ください。誤りにお気づきになりましたら、ご指摘いただければ幸いです。
まず、本記事で対象とする「セキュリティ情報」とは何かを明確にしておく必要があります。本記事では、ファイル・フォルダに付随する以下の3つの情報を「セキュリティ情報」と呼ぶことにします。
既にお分かりと思いますが、/COPY:copyflags の S, O, U フラグに相当する情報です。
なぜこの対象範囲が重要かというと、robocopy のオプションに「セキュリティ情報」を指定した場合の動作は、指定しない場合と異なってくるためです。robocopyのデフォルトでは、/COPY:DAT となっており、セキュリティ情報(SOU) は含まれず、コピーされません。 /COPY に SOUのいずれかを含めて指定すると、セキュリティ情報がコピーされることになりますが、robocopyの動作が変わることを意識しなければなりません。
詳細に入る前に、/COPY オプションの各パラメータと、3つのセキュリティ情報についておさらいしたいと思います。
robocopyで、ファイル・フォルダのどの項目をコピーするかは /COPY:copyflags オプションで指定します。copyflags には、コピーする項目に応じて DATSOUの文字の組み合わせを指定します。それぞれ以下の通りです。
copyflags | 項目 | 説明 |
---|---|---|
D | データ | ファイルのデータそのもの、および、代替データストリーム。 |
A | 属性 | ファイルの属性 (ReadOnly, Archive, System, Hidden など) |
T | タイムスタンプ | ファイルのタイムスタンプ |
S | アクセス許可情報 | (Security)
NTFSのアクセス許可情報(ACL)をコピーします。コピー元コピー先ともにNTFSである必要があります。 このアクセス許可情報を指して「セキュリティ情報」と呼ぶこともある。 |
O | 所有者情報 | (Owner) NTFSの所有者情報をコピーします。コピー元コピー先ともにNTFSである必要があります。 |
U | 監査情報 | (aUdit) NTFSの監査情報をコピーします。コピー元コピー先ともにNTFSである必要があります。 |
robocopyのデフォルト動作では、/COPY:DAT となっており、セキュリティ情報(アクセス許可情報、所有者情報、監査情報)はコピーされません。
/COPY オプションについては、/SEC, /COPYALL というバリエーションもあります。まとめると以下の表のようになります。
copyflags | 項目 | デフォルト (オプション無し) |
/COPY: copyflags |
/SEC | /COPYALL |
---|---|---|---|---|---|
D | データ | ○ | △ | ○ | ○ |
A | 属性 | ○ | △ | ○ | ○ |
T | タイムスタンプ | ○ | △ | ○ | ○ |
S | アクセス許可情報 | △ | ○ | ○ | |
O | 所有者情報 | △ | ○ | ||
U | 監査情報 | △ | ○ |
△は copyflags に指定した項目が有効になります。
NTFSのファイルに設定されるアクセス許可情報のことで、ファイルへのアクセス権限を示したルールのことをいいます。ファイルアイコンの右クリック→プロパティ画面→セキュリティタブ、で表示されます。また、このアクセス許可情報のことを、Access Control List(ACL)と記述している場合もあります。
また、「詳細設定」ボタンでアクセス許可情報の詳細を表示・編集できます。
所有者情報はそのファイルを作成したユーザ、または、所有者として登録されたユーザのことで、ファイルのプロパティ画面→詳細設定→ファイルのセキュリティの詳細設定、の画面に表示されます。この画面から所有者を変更することもできます。
監査とは、システム内の様々なイベントの履歴をセキュリティログに記録することができる仕組みのことです。ファイルに対しては、どのユーザが、いつ、どのようなアクセス(読み取り、書き込みなど)をしたか、履歴を記録することができます。一つ一つのファイルごとに、どのユーザの、どのような種類のアクセスをログに記録するかを詳細にルールを記述できます。そのルールのことを監査ルールと呼びます。監査情報とは監査ルールのことを指します。
ファイルのセキュリティの詳細設定画面→監査タブ→(管理者権限の確認)→監査ルールの表示、でルールを設定、確認することができます。
セキュリティ情報をrobocopyでコピーする場合、前提条件として以下の点に注意してください。
通常のユーザ権限のコマンドプロンプトでは、セキュリティ情報はコピーできませんので、管理者として実行してください。
管理者権限を持つユーザであったとしても、通常のコマンドプロンプトでは、セキュリティ情報のコピーを行うことができませんので、必ず、「管理者で実行する」で起動されたコマンドプロンプトから実行してください。その方法について以下の参考記事をご覧ください。
参考記事:「Windows10でコマンドプロンプトを管理者として実行する方法」
RoboSyncをお使いの方は、RoboSync自体を「管理者で実行する」から起動してください。Windowsメニュー → RoboSyncを右クリック → その他 → 管理者として実行、で実行できます。
robocopyで扱うセキュリティ情報はNTFSで管理されるセキュリティ情報を前提としていますので、コピー元、コピー先ともにNTFSであることが前提となります。
FAT32 などのファイルシステムでは、セキュリティ情報を管理できません。NTFS以外のファイルシステムのドライブを、コピー元またはコピー先に指定している場合は、以下のようなエラーが表示され、セキュリティ情報はコピーされません。
「注意: セキュリティがコピーされない可能性があります - コピー先で固定 ACL がサポートされていない可能性があります。」
それでは、セキュリティ情報を指定した場合のコピー動作について以下にまとめます。
記事「Robocopyの基本動作とコマンド解説」でも書きましたが、robocopyではコピーするファイル・フォルダの状態により以下のようなクラスに分類され、それぞれ処理が行われます。以下の表は、通常時、すなわち、セキュリティ情報がコピー項目に含まれていない場合(/COPY:DAT時)の動作になります。この動作は多くの方がすでに理解されている動きかと思います。
クラス | クラス条件 | コピー動作 | |||||
---|---|---|---|---|---|---|---|
コピー元 | コピー先 | 更新時刻 | サイズ | 属性 | デフォルト コピー動作 |
関連 オプション |
|
Lonely | ある | ない | - | - | - | する | /XLで除外 |
Tweaked | ある | ある | 一致 | 一致 | 不一致 | しない | /ITで含める |
Same | ある | ある | 一致 | 一致 | 一致 | しない | /ISで含める |
Changed | ある | ある | 一致 | 不一致 | - | する | /XCで除外 |
Newer | ある | ある | 元>先 *2 | - | - | する | /XNで除外 |
Older | ある | ある | 元<先 *2 | - | - | する | /XOで除外 |
Extra | ない | ある | - | - | - | - *3 | /XXで除外 /PURGE, /MIR |
Mismatched | ある*1 | ある*1 | - | - | - | - | - |
*1: コピー元がファイルでコピー先がフォルダ、またはその逆
*2:
「元>先」はコピー元ファイルの方が新しい、「元<先」はコピー先ファイルの方が新しい
*3: /PURGEまたは/MIR指定時コピー先を削除
一方、コピー項目にセキュリティ情報が指定された場合(/COPY に SOU いずれかが指定された場合)、上記の通常時動作では説明できない挙動が出てきます。robocopyの過去の議論、実際に動作を調べてみた結果などを総合すると、以下の通りです。
クラス | クラス条件 | コピー動作 | ||||||
---|---|---|---|---|---|---|---|---|
コピー元 | コピー先 | 更新時刻 | サイズ | 属性 | MFT 更新時刻 |
デフォルト コピー動作 |
関連 オプション |
|
Lonely | ある | ない | - | - | - | - | する | /XLで除外 |
Tweaked | ある | ある | 一致 | 一致 | 不一致 | - | しない | /ITで含める |
Same | ある | ある | 一致 | 一致 | 一致 | 一致 | しない | /ISで含める |
Modified | ある | ある | 一致 | 一致 | 一致 | 不一致 | しない | /IMで含める *4 |
Changed | ある | ある | 一致 | 不一致 | - | - | する | /XCで除外 |
Newer | ある | ある | 元>先 *2 | - | - | - | する | /XNで除外 |
Older | ある | ある | 元<先 *2 | - | - | - | する | /XOで除外 |
Extra | ない | ある | - | - | - | - | - *3 | /XXで除外 /PURGE, /MIR |
Mismatched | ある*1 | ある*1 | - | - | - | - | - | - |
*1: コピー元がファイルでコピー先がフォルダ、またはその逆
*2:
「元>先」はコピー元ファイルの方が新しい、「元<先」はコピー先ファイルの方が新しい
*3: /PURGEまたは/MIR指定時コピー先を削除
*4: /COPYオプションでSOUいずれかがコピーフラグに含まれている場合、/IM
が自動的に付加される。
ご覧の通り、「Modified」クラスが新たに増えています。実際には、通常時の「Same」クラスが2つに分類されたというイメージです。
Modified と Same との違いは、「MFT更新時刻」が一致しているかいないかの違いになります。「MFT更新時刻」とは、NTFSのファイルが持つタイムスタンプの1つで、ファイルのMFTエントリが更新された時刻が記録されます。通常エクスプローラなどでは表示されておらず、システム内部的に利用されているタイムスタンプといえると思います。 「MFT更新時刻」 は上記表中の「更新時刻」 とは異なり、ファイル属性やセキュリティ情報を更新した場合にも更新されます。
項目 | 説明 |
---|---|
更新時刻 | ファイルの「データ」が更新された時のタイムスタンプ |
MFT更新時刻 | 「データ」だけでなく、ファイル名、ファイル属性、セキュリティ情報など、MFT内の何らかの項目に変更があったときに更新されるタイムスタンプ |
「MFT更新時刻」 の詳細については、参考記事 「NTFSのファイルが持つ8種類のタイムスタンプとは」 をご覧ください。
上記踏まえ、いろいろと検討した結果、Modifiedクラスを一言でいうと、「セキュリティ情報のみが変更」されているケースを指しています。 なお、「属性とセキュリティ情報の両方が変更」されているファイルは Tweakedクラスになります。
もう一つ大事な点は、コピー項目にセキュリティ情報が指定された場合(/COPY に SOU いずれかが指定された場合)、自動的に /IM オプションが指定され、Modifiedクラスもコピー対象になる、という点です。
この仕様により、おおむね、セキュリティ情報がコピーできるようになっています。ただ、一部問題があり、次章の「ファイル属性の更新との干渉問題」を参照してください。
ところで、/IM オプションは、どうやら最近1~2年前に追加されたオプションの様です。このオプションの存在を知る方も少ないのではないでしょうか。
「robocopyでセキュリティ情報を含むすべての情報をコピーするためには /COPYALL を付けておけば間違いない」、と思っている方が、かなりいらっしゃると思います。
robocopy <src> <dest> /MIR /DCOPY:DAT /COPYALL
しかし、実際にこれを定期的なミラーコピーとして使っている場合、必ずしも正しくセキュリティ情報をコピーできません。
ファイル属性とセキュリティ情報両方を更新したファイルの場合、Tweaked クラスに分類されてしまい、コピーがスキップされてしまうためです。
この問題を回避するためには、Tweakedクラスもコピー対象にするため、/IT オプションを付ける必要があります。
更新コピーにおいて、コピー元と、コピー先のセキュリティ情報を完全一致させるため、robocopyには /SECFIX というオプションが準備されています。このオプションを使うと、スキップされるファイルについても、セキュリティ情報を強制的にコピーすることができます。
/SECFIXはセキュリティ情報を完璧にコピーでき、その点では問題はないのですが、現仕様のrobocopyでは別の問題が生じています。/SECFIXは、セキュリティ情報をコピーする際、コピー先のMFT更新時刻をコピー元に合わせるのではなく、コピー実行時の時刻に更新してしまうため、スキップ対象だったファイルが、次回の更新コピーにおいて全てコピー対象となってしまうのです。
ほとんどのファイルがコピー対象になってしまい、全コピーしなおすのと変わらなくなってしまいます。
対処方法については、次章で解説します。
例えば、アーカイブ属性がONとなっているあるファイルについて、アーカイブ属性を一度OFFにして、再度ONにした場合、セキュリティ情報が更新されていないにもかかわらず、次回更新コピーで、Modified クラスと判断され、コピー対象となります。
ファイル属性をトグルするというケースは多くないと思いますのでそれほど問題ではないかと思いますが、多数のファイルのアーカイブ属性を更新するような環境の場合、影響が大きいかもしれません。
さて、いよいよ、セキュリティ情報を完全にコピーする方法についてご紹介したいと思います。
以下の説明では、/MIR でフォルダをコピーする例で説明をしますが、他のコピーオプションでもセキュリティ情報のコピー動作は同じです。目的に応じて他オプションに読み替えてみてください。
コピー先が存在せず最初にコピーを行う場合、セキュリティ情報のコピーについては、ファイルもフォルダも、指定した /COPY:copyflags オプション(SOU)通りにコピーが行われます。特に問題はありません。
なお、これは少々意外なのですが、フォルダについても、/COPY オプションの SOUフラグ指定に基づきセキュリティ情報のコピーが行われます。D, A, T に関しては /DCOPY の指定に基づきます。
問題になるのは、更新コピーの場合です。
常にコピー元、コピー先を同期し、セキュリティ情報も一致させておきたい場合、以下のようにrobocopyを実行する必要があります。
例としては、以下のようなコマンドです。
(例) robocopy <src> <dest> /MIR /DCOPY:DAT /COPYALL /IT
初回コピーから同じコマンドでコピーし続けている限り、ファイル属性やセキュリティ情報も、常にコピー先に同期されることになります。
(/COPYALL の部分は、必要に応じ、/SEC, /COPY:copyflags(SOUのいずれかが入っていることが必要)を設定してください。)
もし、通常とは異なる /COPY オプションで更新コピーをしてしまった場合、セキュリティ情報のコピーが漏れる可能性があります。
例えば、以下のように、通常行っているコピーコマンドとは違うコマンドで実行してしまった場合です。
(通常時) robocopy <src> <dest> /MIR /DCOPY:DAT /COPYALL /IT (誤って実行) robocopy <src> <dest> /MIR /DCOPY:DAT /IT
これは、/COPYALL指定を忘れてコピーしてしまったケースですが、その場合、「ファイル属性とセキュリティ情報の両方が更新されていたファイル」は、ファイル属性のみコピーされ、セキュリティ情報はコピーされないにもかかわらず、MFTタイムスタンプが更新されてしまいます。そのため、次回更新コピー時、そのファイルは同一とみなされ、セキュリティ情報がコピーされなくなってしまいます。
上記の例ように、コピー元とコピー先でセキュリティ情報が不一致になってしまった場合、コピー先を一度削除して初回コピーするのが最も簡単で確実です。
しかし、もし、大きなファイルがたくさんあって全コピーをやりなおしたくない場合、以下の手順で修復処理を行ってください。以下2つのコマンドを順に実行します。
(1) robocopy <src> <dest> /MIR /DCOPY:DAT /COPYALL /IT /SECFIX (2) robocopy <src> <dest> /MIR /DCOPY:T /COPY:T /IM
まず、(1) のコマンドでは、通常のミラーコピーに加え、/SECFIXにより、スキップされたファイルについても強制的にセキュリティ情報をコピーします。これで、コピー先はコピー元と完全に同じになるのですが、唯一、コピー先のMTFタイムスタンプが /SECFIX 実施時点のタイムスタンプに更新されてしまいます。そのため、そのままだと、それらファイルは全て、次回更新コピー時に「Modified」状態と判断されてしまい、コピー対象となってしまいます。(/SECFIX がMFTタイムスタンプもコピーしてくれれば、何も問題はなかったような気がしますが、どうもそのようになっていないようです。)
そこで、(2) のコマンドで、(1)でModified状態になったファイルのMFTタイムスタンプを強制的にコピー元からコピーします。/COPY:T /DCOPY:T としており、ファイルのデータはコピーされませんので、比較的短時間で処理可能だと思います。
/MIR = /E /PURGE ではないということは読んだことがあると思います。唯一の違いは、/MIRがフォルダのセキュリティ情報も更新しますが、/E /PURGEはしないという点です。
実験の結果、/E /PURGE は、初回コピー時も更新コピー時も、セキュリティ情報を正しくコピーできませんので、やはり、/E /PURGE ではなく、/MIR を使うべきだと思います。
これは、robocopy固有のトピックではないのですが、セキュリティ情報を扱う上で注意しなければならないのは、ユーザやユーザグループを識別する情報が含まれている点です。アクセス許可情報、所有者情報、監査情報、いずれも、ユーザやユーザグループを識別する情報をが含んでいます。
Windows では、ユーザやグループは、セキュリティ識別子(SID)というもので識別されており、 例えば、以下のような値です。
S-1-5-21-1415123456-241234567-3331234567-1001
これはWindowsに登録された個人ユーザのSIDの例ですが、このSIDは「ドメイン」単位で管理されているIDであり、ドメイン外の環境では、識別できないIDになることに注意してください。
企業内環境など、Active Directory(AD) ドメインでSIDが管理されている場合は、そのドメイン内(企業内)であればどのPCでも、共通のSIDを使うことができます。そのため、robocopyで他のPCにセキュリティ情報をコピーしても問題なく認識されます。
しかし、個人環境などの場合は、ドメインはPC1台ごとの単位になるため、あるPCで使われている個人ユーザのSIDは他のPCでは同じように認識されず、セキュリティ設定も同じように認識されない可能性があります。
セキュリティ情報コピーの際には、SIDの扱いについて十分考慮の上、実施してください。
参考情報:「Security identifiers」 (Microsoft)
robocopyで、セキュリティ情報も含めてコピーを行う場合のポイントをまとめると、以下の通りとなります。
robocopy <src> <dest> /MIR /DCOPY:DAT /COPYALL
robocopy <src> <dest> /MIR /DCOPY:DAT /COPYALL /IT
robocopy <src> <dest> /MIR /DCOPY:DAT /COPYALL /IT /SECFIX robocopy <src> <dest> /MIR /DCOPY:T /COPY:T /IM
※ /COPYALL は目的に応じて /SEC や /COPY
オプションに置き換えてください。
※ /MIR は目的に応じて適切なオプションに置き換えてください。
robocopyのセキュリティ情報のコピーについて、過去記事を見ていると、Modifiedクラスが導入されたのが、2012年頃になるようです。その当時からModifiedクラスに対する動作に問題があったようで、しばらく問題が解決されず、使い物になっていなかったように見えます。2019年頃に /IM オプションができて、なんとか少し使えるようになったのかな、といった現状でしょうか。
ただ、一方で、今回いろいろ調査してみた結果、Modifiedクラス、/IM オプションの仕様について、ちゃんときれいな表に整理できたこともあり、当初想像していたよりは仕様が整理されており、ある程度使える状態なのではないかと感じました。
今回の記事が、robocopyでセキュリティ情報を正しくコピーできる為の情報として、皆様の参考になればと思います。
RoboSync: RobocopyのためのGUIツール
本サイトで公開しているツールです。ダウンロードはこのバナーをクリック!
Version 1.3.27 をリリースしました! (2021/1/1)
RobocopyをGUIから実行できるようにするツールです。コマンドプロンプトを表示することなく、GUI画面からほぼマウス操作だけで実行までできます。
Robocopyがバックグラウンドでそのまま実行されますので設定に迷うことはありません。
・ 複数のコピー項目の作成と管理。
・ スクリプトファイル(バッチファイル)出力が可能。スケジューラによるバックグラウンド処理にも使えます。
・ Robocopyによるコピー実行前に、実行プレビュー(/L)、パラメータのチェック(/QUIT)が可能。
・ Robocopyのパラメータ設定の簡易チェック、Robocopy実行前の簡易チェックを行います。
・ Robocopy実行前後で実行するスクリプトを定義可能。
・ Robocopy実行途中での中断、実行ログの履歴管理と保存が可能。
Related Articles
管理者より個人的に返信をご希望の方は、コメント中に必ずメールアドレスを記載してください。記載がないと返信できませんのでご注意ください。
If you want personal response from the author, please do not forget to write your email address in the comment. Otherwise, the author can not reply.
投稿されたコメントは手動で処理されるため、記事として登録されるまで1日程度かかります。
Submitted comments will be processed manually. So, please understand it will take about a day to publish your comment.