ClonePrincipal

概要

ClonePrincipal は COM オブジェクトの DSUtils.ClonePrincipal 、Windows Scripting Host 及び Active Directory Service Interfaces ( ADSI ) を利用したツールです。

DSUtils.ClonePrincipal は次の 3 つのメソッドを提供しています。

メソッド 説明
AddSidHistory  SIDHistory をコピーします。移行元が Windows 2000 ドメインにおいても使用可能です。
CopyDownlevelUserProperties  移行元の Windows NT ユーザーのプロパティを、移行先のプロパティにコピーします。このメソッドは移行元が Windows 2000 では利用できません。プロパティ情報を移行する場合は ADSI を利用して移行する必要があります。
Connect  移行元ドメインコントローラと移行先のドメインコントローラを接続します。

Windows 2000 には、いくつかのアカウント移行ツールがあります。ClonePrincipal はその中で、唯一、ユーザーが自由に移行方法をカスタマイズできるツールです(たぶん)。アカウントの移行には、簡単に書くと以下ポイントをクリアする必要があります。

  1. 両ドメインの認証
  2. ユーザーのコピー(実際は移行先ドメインで新規作成)
  3. プロパティ情報のコピー
  4. SidHistory のコピー(両方のドメインでのリソースアクセスの互換性を持たせるために必要です。)

次に、他の移行ツールとの比較をしてみます。

ツール名 移行ドメイン ドメインの関係 UI 移行後の状態
ClonePrincipal Windows 2000 から Winodws 2000
Windows NT から Windows 200
別フォレスト間 CUI 移行先移行元共にアカウントは残る
ADMT Windows 2000 から Winodws 2000
Windows NT から Windows 200
別フォレスト間 GUI 移行先移行元共にアカウントは残る
MoveTree Windows 2000 から Winodws 2000 同一フォレスト間 CUI 移行もとのアカウントは削除

SidHistory 及び SID は同一フォレスト内に重複することが許されていません。その為、同一フォレスト内での移行ツール MoveTree では、アカウントコピーを行った後、移行もとのアカウントを削除します。

 

インストール

Windows 2000 Support Tools に入っています。以下のパスよりインストールが可能です。

Windows2000CD-ROM\SUPPORT\TOOLS\SETUP.EXE

インストールしたら、Support Tools フォルダのルートに以下のファイルができます。

モジュール 説明
clonepr.dll ClonePrincipal 用の API ライブラリ
clonepr.vbs アカウント一つを移行するサンプルスクリプト
clonegg.vbs グローバルグループを移行するサンプルスクリプト
cloneggu.vbs グローバルグループとユーザーを移行するサンプルスクリプト
clonelg.vbs ローカルグループを移行するサンプルスクリプト
sidhist.vbs SidHistory を移行するサンプルスクリプト
clonepr.doc ClonePrincipal 及び、サンプルについての説明文書

 

 

移行準備

ClonePrincipal を使用するには以下の準備が必要です。詳しくは、clonepr.doc の P14 や P18 をご覧下さい。

' if HasWellKnownRid(sidString) then
' ShouldCloneObject = False
' exit function
' end if

 

スクリプト解説

簡単に、cloneggu.vbs スクリプトのポイントを解説します。詳しくは、がんばって解析してください。結構多大な量があって大変です(^^ゞ

実行方法は、コマンドプロンプトより

CScript cloneggu.vbs /srcdc:SrcDC /srcdom:SrcDomain /dstdc:DstDC /dstdom:DstDomain /dstOU:DstOU

SrcDC :移行元ドメインコントローラの NetBIOS 名
SrcDomain   :移行元ドメインの NetBIOS 名
DstDC  :移行先ドメインコントローラの NetBIOS 名
DstDomain  :移行先ドメインの NetBIOS 名
DstOU :移行先 OU の DN 名

 

set clonepr = CreateObject("DSUtils.ClonePrincipal") ' ClonePrincipal オブジェクトを作成
 
sub Main ' スクリプトをたどると、main サブルーチンが始めに呼ばれる
 
  srcDC = GetArgValue("srcdc", args) ' 引数の値を取得
  srcDom = GetArgValue("srcdom", args)
  dstDC = GetArgValue("dstdc", args)
  dstDom = GetArgValue("dstdom", args)
  dstOU = GetArgValue("dstou", args)
 
  clonepr.Connect srcDC, srcDom, dstDC, dstDom ' Connect メソッドを使用して、両方のドメインに認証接続
 
  set srcDomain = GetObject("WinNT://" & srcDom & "/" & srcDC & ",Computer") ' 移行元のドメインの取得
 
  for each srcObject in srcDomain ' ドメインのオブジェクトを順番に取得し処理を行う
 
    if ShouldCloneObject(srcObject) then ' ShouldCloneObject サブルーチンで、取得したオブジェクトがビルトインアカウントかを識別
 
    srcObjectClass = ObjectClass(srcObject) ' ユーザーであるかを識別
    CloneSecurityPrincipal srcObject, srcSam, dstDom, dstDC, dstSam, dstDN ' CloneSecurityPrincipal サブルーチンでユーザー移行処理を開始
 
  next
 
end sub

 

sub CloneSecurityPrincipal(byref srcObject, byval srcSam, byval dstDom, byval dstDC, byval dstSam, byval dstDN)
 
  set dstObject = GetObject(dstObjectSamPath) ' 移行先のユーザーを取得する
  errnum1 = Err.Number
 
  select case errnum1 ' エラー状態により、ユーザーが存在するかを判定
  
    case E_ADS_UNKNOWN_OBJECT ' ユーザーがいなかったら
      set dstObject = CreateDestinationDN(dstSam, dstDN, dstDC, srcObjectClass) ' CreateDestinationDN サブルーチンでユーザーを作成
  end select
 
  clonepr.CopyDownlevelUserProperties srcSam, dstSam, 0 ' 移行元ユーザーのプロパティを、移行先ユーザーのプロパティにコピー
 
  clonepr.AddSidHistory srcSam, dstSam, 0 ' 移行元ユーザー SID を 移行先ユーザーの SidHistory にコピー(追加)
 
end sub

 

 

参考資料

ZDNet - シングルドメインの検討
http://www.zdnet.co.jp/special/win2000/tokusyu/2000_01/10.html

DsAddSidHistory
http://msdn.microsoft.com/library/psdk/adsi/adfuncs_11bt.htm

Active Directory 移行ツール
http://www.microsoft.com/japan/windows2000/downloads/deployment/admt/

Active Directory 移行ツール概要
http://www.microsoft.com/JAPAN/technet/WIN2000/win2ksrv/technote/admtool.asp