ファイルサーバを別ドメインへ移行

紹介

Workgroupのファイルサーバをドメイン環境へ移行する、あるいはドメイン統合でファイルサーバを別のドメインへ移行するという要件は、ごくたまにあります。
そんなときアクセス権の移行が問題となります。

同じドメイン内なら、アクセス権を保ったままコピーを行えばファイルサーバの移行は簡単ですが、あるファイルサーバを異なるドメインのファイルサーバへアクセス権を保ったままデータコピーしても、アクセス権が前のドメイン情報でSID表示されるだけで、新しいドメインでは機能しません。


「別ドメインのアクセス権を保ったまま移行しても機能しない」


ドメインの信頼関係があれば正しく動作しますが、旧ドメインが廃止される場合もあり後々の運用を考えれば、アクセス権をややこしくしたくありません。
手作業でアクセス権を設定しなおすのも、規模によっては現実的ではありません。



ワークグループをドメインへ移行する場合は、アクセス権がSIDになることはありませんが、使用されているのはドメインのユーザーではないため、結局全てのフォルダについてドメインユーザーのアクセス権を設定する必要があります。

「ワークグループをドメイン参加させてもアクセス権に変化はないが、実用しづらい」



これらのことから、「ワークグループのファイルサーバをドメインへ移行」、「ファイルサーバを別のドメインへ移行」する場合でも、結局は新しいアクセス権を設定するという作業から逃れることはできません。
そして旧ドメインのユーザーのアクセス権を、新ドメインのユーザーの誰が引き継ぐか、という設計は根本的に手作業で行うことになります。


旧の「総務グループ」を、新の「本社総務部」へ対応させる必要があり、それらは人間の介在が必要


新旧ドメインのユーザー対応表を作る手間を省きたいなら、一番簡単な解決策は、旧ドメインと新ドメインで同じユーザー名にしてしまうことです。
これなら対応作業は最小限で済みます。
あるいは新旧ユーザー名に法則性があれば、対応表の作成はテキストエディタの文字列処理で何とかなる場合もあるでしょう。

対応表の問題は別に解決するとして、新ファイルサーバへのアクセス権の設定作業はどのように削減すればいいでしょうか。
もちろん手作業でフォルダ一つ一つのアクセス権を、対応表を見ながら設定変更するのは時間がかかりすぎます。
この場合はコマンドを実行することで、全フォルダのアクセス権を設定変更するのが普通でしょう。
しかしファイルサーバの全フォルダのアクセス権を設定情報を調査し、コマンドを作るのも手間です。

ACListerは、フォルダのアクセス権設定のスクリプトをPowerShellで生成できます。
ACListerを使用して、「現状のアクセス権と同じ設定をするPowerShell」を作成し、そのスクリプト内のユーザー名を新ドメインのユーザー名に
置換することで対応できるでしょう。


ファイルサーバ切り替えの例

ここでは別ドメインの旧ファイルサーバのデータを、新しいドメインの新ファイルサーバへ移行する一例を説明します。


A社は部門が各自運用していたActiveDirectoryドメインを、この度社内ドメインへ全て統合することになりました。
営業部門のドメイン(sales.local)で使用していたファイルサーバは、社内ドメイン(a-corp.local)へ移行します。
社内ドメインには新ファイルサーバが用意されており、営業部門ファイルサーバのデータをコピーして移行することになりました。

ファイルサーバのフォルダを社内ドメインへコピーしても、アクセス権など営業部門のユーザーは従来通り業務フォルダへアクセスできる必要があります。
ファイルサーバは業務で毎日使用され、データが変更されます。

ユーザー名について
それまで営業部門ドメインでは、個人の名前をアカウントにしていましたが、社内ドメインではイニシャルを含むアカウントを使用します。

グループ名について
営業部門ドメインでは、独自のルールでグループ名を作成してきました。
社内ドメイン統合に合わせて、社内ドメインで使用されているグループ名へ変更する必要があります。
ただしグループの所属メンバの決定権は営業部門にあり、グループの構成は変更する必要はありません。

なお営業部門ドメインは統合後、廃止されます。


「望まれているファイルサーバ移行の設計」



ファイルサーバ移行

営業部門ファイルサーバ(以下、旧ファイルサーバ)から、社内ファイルサーバ(以下、新ファイルサーバ)へのアクセス権を
維持したまま移行したいが。実際にアクセス権を保ったままコピーすると、新ドメインでは動作しません。


基本的な手順は
1.ACLisetrを使用し、旧サーバでアクセス権のリストを取得する
2.アクセス権のリストからスクリプトを作成し、新ドメインのユーザー名へ編集する
3.旧サーバから新サーバへ、アクセス権を伴わずフォルダ構造だけコピーする
4.作成したアクセス権設定スクリプトを、新サーバで実行する
5.新サーバへ、アクセス権を伴わずファイルをコピーする

となります。


1.ACListerを使用し、旧サーバでアクセス権のリストを取得する

旧ファイルサーバでACListerを使用して、ファイルサーバの共有フォルダのアクセス権の設定状況を取得します。



ワンポイント
長期間使用したファイルサーバを調査すると、誰が設定したのだか不要なアクセス権が大量に見つかります。
すでに削除されたユーザーがSIDとなって残っていたり、担当者が訳も分からず設定した効果のないアクセス権もあります。
どうせ移行するなら、これを機にアクセス権をキレイにしたいです。

ある程度の大まかな部署フォルダにアクセス権は必要でしょうが、それよりもっと深い末端の部署フォルダに果たして細かいアクセス権が必要でしょうか。
アクセス権を移行する対象はある程度の深さのフォルダまでに絞っておけば、それ以下の細かいフォルダに設定されたゴミのようなアクセス権は一掃されます。



2.取得したアクセス権のリストのログを、新ドメイン用へ編集する

取得したアクセス権のリストのログを編集します。まずログを眺めて、不要なアクセス権を削除します。
例えば二重にかかっているアクセス権や、社員が独自に設定した効果のないアクセス権などはここで地道に掃除しておきます。

次に各ユーザー部分とファイルパスを編集します。

旧ユーザー名を新ドメインに対応する新ユーザーへ変更します。
手作業の場合もあるでしょうし、表計算の文字列処理も考えられます。ドメイン名部分は最後に一括置換すればいいでしょう。

やり方としてはエクセルを駆使する方法が考えられます。(マクロも効果的でしょう)
→「ドメイン名を含む行だけを取り出す」
 →「ドメイン名の旧ユーザー名部分のみを取り出す」
  →「旧ユーザー名をVLOOKUP等を使用し、新ユーザー名へ置換する」
   →「元のリストへ戻す」
    →「旧ドメイン名を新ドメイン名へ一括置換する」 といったところでしょうか。

よほどアクセス権構造が単純でない限り、この作業が一度で完了しないでしょう
手順2〜6は数回検証してみる必要があると思います。

新旧ファイルサーバが変更されれば、フォルダパスも変更されていることが多いでしょう。
全ての行のフォルダパスを、新ファイルサーバのフォルダパスへ置きかえます。
例えば「D:\業務フォルダ」という文字列を全て「E:\FS\営業部門」という感じで置換します。



3、アクセス権変更スクリプトを生成する

編集済みのリストを、再度ACListerへ読み込みます。



取得したツリーを右クリックし、アクセス権を生成するPowerShellスクリプトを生成します。


出力されたスクリプトを、拡張子PS1で保存します。
これでスクリプトの準備ができました。作成したスクリプトは新ファイルサーバへ送り込んでおきます。




4、旧ファイルサーバから新ファイルサーバへ、フォルダ構造だけをコピーする

アクセス権を伴わず、フォルダ構造のみをコピーします。
以下のコマンドを使用すると、フォルダのみコピーされます。(ファイルはコピーされていません。つまり容量はゼロバイトです)

xcopyによるフォルダ構造コピー
 xcopy /T /E /C D:\業務フォルダ \\新サーバアドレス\D$\営業部門\DATA\

「空フォルダだけをコピーする。コピー先は全てデフォルトACLが設定されている状態」

なぜフォルダだけをコピーするかというと、一つはコピーの時間が短く、移行検証が容易なこと。
もう一つは、ファイルが含まれていないので新しいアクセス権を設定する作業が短時間で終了することです。

実データをコピーしていると、移行検証が失敗してやり直すとき、また全データをコピーしてこなくてはいけません。



5.新ファイルサーバのルートフォルダのみアクセス権を構成し、伝播させる

新ファイルサーバ上で、ルートフォルダのみアクセス権を設定します。
生成したスクリプトを使用してもいいのですが、せっかくの新ファイルサーバなので、分かっている人はルートフォルダのアクセス権は手作業で設定したほうが以前の設定をブラッシュアップできるでしょう。
例えば、ルートアクセス権の継承の無効化や、 必要なアクセス権のみに絞る(Usersは不要、営業部の読み取り権追加)などです。

スクリプトを使用する場合は、生成されたスクリプトの最初のブロックのみを別ファイルに使用します。
アクセス権を正しく設定したあと、下部のフォルダへ向かってアクセス権を伝播させます。(ここ重要)

「ルートディレクトリのアクセス権を、末端まで継承させる」

というのも、伝播でアクセス権を末端まで全て置き換えずに次のステップを実行するとと、全サブフォルダにゴミのようなACL(BUILTIN\Administrator・フル・このフォルダのみ)が残ってしまうことがあります。
ここはいったんルートのアクセス権を伝播させ、設定を統一しておきます。


ルートフォルダのセキュリティ詳細から「子オブジェクトのアクセス許可エントリすべてを、このオブジェクトからの継承可能なアクセス許可エントリで書き換える」へチェックを入れます。
これで末端までアクセス権がいきわたります。



6.新アクセス権設定スクリプトを実行する

新ファイルサーバ上で、作成したアクセス権スクリプトを実行します。
スクリプトの最初のブロックはすでに実行済み(あるいは手動で設定済み)なので、その部分は削除しておきます。

設定エラーを処理するためにも、ある程度小分けに実行したほうがいいでしょう。

スクリプトのユーザー定義が正しければ、各フォルダの新アクセス権が設定されます。




7.旧ファイルサーバからファイルをコピーする

旧ファイルサーバからファイルをアクセス権なしでコピーします。
コピーしたファイルは、コピー先のフォルダの設定済みアクセス権に従う、という仕組みです。



なおデータが大きくなりがちなファイルサーバでは、通常ファイルのコピーは数日に分割して行ったり、切り替え直前に最終同期を行うことが多いでしょう。
robocopyでもいいのですが、ファイル同期はコマンドの記述ミスするとせっかくコピーしたファイルを全削除してしまう恐れもあります。
エラーでコピーできなかったファイルや、コピーに要した時間なども正確に把握したいことが多いです。

FasyCopyのようなツールを用いましょう。
FastCopyでジョブを作成しておけば、タスクスケジューラからの実行も容易ですし、ログも出力されるので、要した時間や転送速度、コピーに失敗したファイルなどもあとで把握できます。


ファイルの同期には、ACL属性を伴わないようにします。(ACL属性のチェックを外した状態)
ファイルサーバ切り替え直前の最終同期も、すでに使っているジョブを実行すれば作業ミスも防げます。
切り替えに要する時間も事前予測することができるでしょう。

以下のようなbatファイルをタスクスケジューラで事前に複数回実行するのが良いでしょう

fscopy.bat

fastcopy.exe /auto_close /force_close /job=FS_Copy


最後に、各フォルダへ元通りの共有をかければ、アクセス権を変更したファイルサーバの移行が完了します。







prev.gif