△ 図をクリックすると拡大されます
図3●NTドメインからActive Directoryに移行したところ,ファイル・サーバーに設定されたユーザー名が正しく表示されない
Q

現在,Windows NT Server 4.0でファイル・サーバーを構築しています。ファイル・サーバーはNTドメインのメンバー・サーバーであり,アクセス権は,マイクロソフトのAGLPポリシーに従って割り当てています。このファイル・サーバーを,Active Directoryへの移行に伴いWindows 2000 Serverにリプレースしようと考えていますが,ローカル・グループに割り当てたアクセス権の移行ができずに苦慮しています。Windows 2000 Server側のxcopy /EコマンドやWindows NT Server 4.0のリソース・キットにあるscopyコマンドでファイルのコピーを行ってみたり,一度ファイルをバックアップして新しいサーバーにリストアしてみたりもしたのですが,ローカル・グループに割り当てたアクセス権(ACL)を見ると,数字を羅列したアカウントが表示され,きちんとアクセス権が移行されていません(図3)。うまく移行する方法はないでしょうか。

A

残念ながら標準のコマンドで目的を実現する方法はありません。目的を達成するには,あまりスマートな方法とはいえませんが,リソース・キットなどに付属のsubinaclというコマンドを用いるか,同等のプログラムを作成して,ACLに記録されたSID(セキュリティ記述子)を直接修正することが必要となります。以下,この問題の説明も兼ねて,Windows NT系OSのアクセス権付与の仕組みについて簡単に説明しておきましょう。

AGLPはアクセス権の付与方法
 AGLPポリシーとは,マイクロソフトが推奨しているNTドメインのアクセス権の設定方法のことです。図4のようなポリシーに従って設定します。おのおのの頭文字を順に並べるとAGLPとなるため,AGLPポリシーと呼んでいます。

図4●マイクロソフトが推奨するAGLPの基本ポリシー

 このAGLPポリシーに従うことで,ドメインのアカウント管理者は,個別のリソースへのアクセス権割り当てを意識せずにグループの管理が行えます。一方,個別のリソースの管理者も,実際にアクセス権を割り当てるアカウントを意識することなく,設定したいアクセス権を付与したローカル・グループを構成することが可能です。

 最終的なリソースへのアクセス権の割り当ては,グローバル・グループをローカル・グループのメンバーとすることによって行います。これにより,個別のアカウントを意識することなく一括して設定できます。また,アクセス権自体はローカル・グループに付与されているため,グローバル・グループをローカル・グループのメンバーから除外することで,アクセス権の削除が簡単に行えることも特徴として挙げられます。

 このように,AGLPポリシーに従った運用をすることで,NTドメインの各グループの特徴を最大限生かした柔軟な管理が可能となっています。Active Directoryでは,ユニバーサル・グループなどが追加されたことにより多少このポリシーは拡張されていますが,基本的な考え方は同じです。

ローカル・グループは移行できない
 AGLPポリシーに従った場合,ファイル,フォルダなど個別のリソースへのアクセス権は,ローカル・グループに対して割り当てられます。従って,ファイル・サーバーをリプレースする場合は,ローカル・グループに割り当てられたアクセス権の移行も考慮する必要がありますが,前述したように残念ながら標準のコマンドでは移行させることができません。

 この問題を解決するには,SIDという一意な識別子について理解する必要があります。Windows NT系OSの場合,各マシン上に作成されたグループやアカウントなどのオブジェクトには,すべてSIDが付与されます。SIDはマシンやドメイン固有の識別子とマシン上で一意な数値からなる識別子です。

 通常われわれが目にするアカウント名やグループ名などは,われわれが見やすいように名前が付けられていますが,内部的にはすべてSIDで情報の保存や識別が行われています。従って,移行先のサーバーで同じ名前のローカル・グループを作成しても,マシンごとの識別子が異なるため,SIDも必ず異なるものとなります。

 質問にあったxcopy /Eコマンドを用いた場合,アクセス権の情報を保持したままコピーされますが,そのままでは移行先のマシンに本来存在し得ないSIDを持ったACL情報が作成されてしまいます(図5)。そのため,質問中にあるように,SIDがそのまま表示される,あるいは「不明なアカウント」として表示されるといった現象が発生してしまうわけです。

図5●「scopy」コマンドや「xcopy /E」コマンドを実行しても,移行先のマシンには元のグループなどが存在しないため,そのままSIDが表示される

移行先のマシンにデータ・コピー後 元のSIDに置換する
 以上のことから,アクセス権を移行するためには,(1)ACL中のSIDの情報を保持したまま移行先のマシンにファイルをコピーする,(2)移行先マシン上で,ACLに保存された古いマシン上のローカル・グループのSIDを,新しいマシン上に新規に作成した対応するローカル・グループのSIDに置換する――という作業が必要になります。


△ 図をクリックすると拡大されます
図6●リソース・キットにあるsubinaclコマンドを使うと,元のマシンに保存されたSIDを,新しいマシン上に新規に作成した対応するローカル・グループのSIDに置換できる

 移行するすべてのファイル,ディレクトリのすべてのACLに対して,この作業を実施するという力作業が必要となります。質問にもあったように,(1)の作業についてはxcopy /Eコマンドやバックアップとリストアの組み合わせで実施可能ですが,(2)の作業についてはOSのコマンドでは実現できません。独自にプログラムを作成する場合は,かなり高度なプログラミングが必要となりますが,幸いなことに,NT系OSのリソース・キットに添付するsubinaclというコマンド・ライン・ツールを用いることでこの処理を一括してできます(図6)。

 subinaclは,既存のACLの表示や所有者の移行など,アクセス権に関する様々な処理を行うことが可能なコマンドです。詳細はマイクロソフトのサポート技術情報「250267,Cannot Resolve Local Groups When You Migrate Files Between Windows NT 4.0 Member Servers」(英語)を参照してください。

高橋 基信