知られざるActive Directory技術の「舞台裏」

第3回 LDAPを使ってActive Directoryを制御しよう[その1:ldpとcsvde]

この記事を読むのに必要な時間:およそ 6 分

csvdeコマンド

多数のユーザアカウントをActive Directoryに登録する場合,GUIではなくExcelで編集可能なデータ(CSVファイル:カンマ区切りファイル)からまとめて設定したい,ということがあります。

csvdeコマンドは,CSVファイルに登録されたユーザアカウントやセキュリティグループのデータをAvtive Directoryにインポートしたり,逆にActive DirectoryデータベースのデータをCSVファイルにエクスポートすることができます(パスワードのエクスポートはできません⁠⁠。

csvdeコマンドでは,インポートされたものや既に作成されているオブジェクトの属性等の書き換えや削除ができませんので,アカウントの新規追加を行うためのツールとして利用します。

また,csvdeコマンドでは,パスワードのインポートはできません。作成されたアカウントは無効の状態で設定されますので,コマンド実行後に,⁠dsmod userコマンド等による)アカウントのパスワード設定や有効化の作業が必要になります。

csvdeコマンドを使って,インポートを行う

csvdeコマンドを使って,OUやアカウント情報をインポートするには,次の手順で行えばいいでしょう。

  • ①必要なCSVファイルリスト1を用意します。最初の行に必要な属性の名前を,2行目以降に属性に設定する値を記載します(設定しない値は空欄とします⁠⁠。ここでは,⁠営業部第二課]OU,その中に置く[田所 明]⁠松谷 一郎]⁠来島 たえ]の3ユーザと[営業部第二課]グループのアカウントを設定します。

    リスト1 import.csv

    DN,objectClass,description,saMaccountName,displayName,sn,givenName,company,department,title,mail,telephoneNumber,userPrincipalName,member
    "OU=第二課,OU=営業部,DC=marubatsucorp,DC=local",organizationalUnit,営業部第二課OU,,,,,,,,,,,
    "CN=田所 明,OU=第二課,OU=営業部,DC=marubatsucorp,DC=local",user,営業部第二課ユーザー,atadokoro,"田所 明",田所,明,○×株式会社,営業部第二課,課長,atadokoro@marubatsucorp.local,03-1234-6789,atadokoro@marubatsucorp.local,
    "CN=松谷 一郎,OU=第二課,OU=営業部,DC=marubatsucorp,DC=local",user,営業部第二課ユーザー,imatsutani,"松谷 一郎",松谷,一郎,○×株式会社,営業部第二課,主任,imatsutani@marubatsucorp.local,03-1234-6789,imatsutani@marubatsucorp.local,
    "CN=来島 たえ,OU=第二課,OU=営業部,DC=marubatsucorp,DC=local",user,営業部第二課ユーザー,tkurushima,"来島 たえ",来島,たえ,○×株式会社,営業部第二課,課長代理,tkurushima@marubatsucorp.local,03-1234-6789,tkurushima@marubatsucorp.local,
    "CN=営業部第二課,OU=第二課,OU=営業部,DC=marubatsucorp,DC=local",group,営業部第二課グループ,営業部第二課,,,,,,,,,,"CN=田所 明,OU=第二課,OU=営業部,DC=marubatsucorp,DC=local;CN=松谷 一郎,OU=第二課,OU=営業部,DC=marubatsucorp,DC=local;CN=来島 たえ,OU=第二課,OU=営業部,DC=marubatsucorp,DC=local"
    

    ちなみに,member属性はセキュリティグループオブジェクトの属性のひとつで,そのグループがメンバとしているユーザや他のグループが登録されます。

  • ②コマンドプロンプトから以下のコマンドを実行します。ここでは,ログオンしているユーザのデスクトップ上にimport.csvがあるものとします。

    csvde -i -f %USERPROFILE%\Desktop¥import.csv
    

    画像

    コマンドが成功すると「5個のエントリを正しく修正しました。」と表示されます。⁠Active Directoryユーザーとコンピューター]スナップインから,内容が正しくインポートされていることを確認できます。

    画像

    また上述したとおり,この状態ではユーザアカウントは無効の状態で設定されます。アカウントにパスワードを設定し,これを有効にするためには,次のコマンドを実行するといいでしょう。このコマンドは, dsquery userコマンドでアカウントとして無効なオブジェクトを抽出し, パイプライン(¦)を使ってdsmod userコマンドに引き渡すことで, パスワードの設定とアカウントの有効化を行っています。

    dsquery user OU=営業部,DC=marubatsucorp,Dc=local -disabled|dsmod user -pwd p@ssw0rd -mustchpwd yes -disabled no
    

    画像

なお今回は必要ありませんが,dsqueryコマンドにLDAPクエリの条件を指定することで,同じ動作をさせることができます。これは複雑なLDAP検索条件を指定してオブジェクトを抽出したい場合,有効な方法となります。

dsquery * OU=営業部,DC=marubatsucorp,Dc=local -filter "(&(&(objectCategory=person)(objectClass=user))(userAccountControl:1.2.840.113556.1.4.803:=2))"|dsmod user -pwd p@ssw0rd -mustchpwd yes -disabled no

Column

LDAPには前方リンク・後方リンクという概念があります。たとえば,あるユーザアカウントが特定のセキュリティグループのメンバである場合,ユーザが所属しているグループの情報([所属するグループ]:memberOf属性)と,グループがメンバとしているユーザの情報([メンバー]:member属性)は整合性が取れていなければなりません。このため,一方の内容が変更されると,対応する情報も自動的に変更されるようになっていますが,双方向で可能なわけではありません。システム管理者が書き替え可能な属性を「前方リンク」と呼び,前方リンクの変更に添ってシステムが自動的に整合性を採る属性を「後方リンク」と呼びますが,ユーザアカウントの「memberOf属性」は後方リンクであるため,LDAPで直接変更することができません。そのため,LDAPで直接ユーザの所属グループを指定するには,グループ側の「member属性」を指定するしかありません。

csvdeを使って,別の環境からエクスポートした内容をインポートする

csvdeコマンドでは,Active Directoryデータベースから情報をエクスポートすることができます。単純にエクスポートしたCSVファイルをインポートすることはもちろん可能ですが,ここでは応用例として,他のドメインコントローラからネットワーク経由で情報を取得し,新しい別のドメインのドメインコントローラにインポートする,という方法を取ってみることにしましょう。

たとえば,marubatsucorp.localドメインのドメインコントローラからmarubatsu-corp.comドメインのドメインコントローラに情報を移行したい場合,事前準備はほぼ不要です(ドメインコントローラへの認証ができるよう,相手先DNSサーバへのフォワーダ設定が必要です⁠⁠。少し長いですが,marubatsu-corp.comドメインのドメインコントローラから次のコマンドを実行することで,完了することでしょう。

csvde -d "OU=営業部,DC=marubatsucorp,DC=local" -s server00 -b administrator marubatsucorp.local * -r "(|(&(objectCategory=person)(objectClass=user))(objectClass=group)(objectClass=organizationalUnit))" -o userAccountControl,dSCorePropagationData -m -u -c marubatsucorp.local marubatsu-corp.com -f export.csv && csvde -i -u -c DC=marubatsucorp,DC=local DC=marubatsu-corp,DC=com -f export.csv

まず「&&(前のコマンドが完了したら次のコマンドを実行する⁠⁠」を境に,前半部分から説明します。

csvde -dオプションではエクスポートするベースDNを指定します。

-sオプションでは接続先のドメインコントローラ名を,-bオプションでは接続するアカウントとドメイン,パスワードを指定します。

-rオプションはエクスポート対象となるオブジェクトをLDAPクエリ形式で指定し,ここではユーザアカウント,グループアカウント,OUが対象になります。

-oオプションはエクスポート一覧から除外する属性を指定するもので,ここではユーザアカウント状態(有効・無効等)を示すuserAccountControl属性と内部的にのみ利用されるdSCorePropagationData属性が対象となっています。userAccountContorl属性を利用すると,アカウントを有効の状態でインポートしようとして,⁠無効でしかインポートできない状況との)矛盾が起こってエラーとなります。またdSCorePropagationData属性は内部的にのみ利用されるので,適切なインポートができません。

-mオプションはSAMロジックを有効するというオプションで,LDAP属性のうちWindowsシステム固有の情報(objectGUIDなど)の出力を抑制します。これはWinodowsシステム固有の情報はWindowsが管理しているためで,この情報をインポートすることはできません。

-uオプションはデータをUnicodeとして扱うという意味で,日本語環境では必要になります。また-cオプションは,エクスポートしたデータの一部を置換するもので,ここでは(メールアカウントやユーザプリンシパル名の一部である)xxx@marubatsucorp.localをxxx@marubatsu-corp.comに変換して記録してくれます。

後半部分ですが,csvde -iオプションはインポートを指示するオプションです。記録したファイルがUnicodeですので,インポート時にも-uオプションを指定する必要があります。-cオプションですが,ここでは移行先のドメインDNが「DC=marubatsu-corp,DC=com」ですので,移行先のドメインDNにインポート時に変換することで,正しくインポートが可能となります。

コマンドを実行して成功したら,⁠Active Directoryユーザーとコンピューター]スナップインから内容を確認してみましょう。データがそのまま引き継がれていることがわかると思います。ただし,アカウントが無効になってしまっていますので,前述の方法でアカウントを有効化する必要があるでしょう。

画像

次回は,もう1つのコマンドldifdeについて,ご紹介します。

Active Directoryに関する技術情報:

Microsoft TechNet Active Directory TechCenter
URLhttp://technet.microsoft.com/ja-jp/activedirectory/default.aspx
Microsoft Active Directory 機能概要ページ
URLhttp://www.microsoft.com/japan/ad/

著者プロフィール

小鮒通成(こぶなみちなり)

Active DirectoryおよびWindows Serverに関するコンサルタント。あわせて各種コミュニティ活動や執筆活動を行っており,Microsoft Most Valuable Professional (Windows Server System - Directory Services) 表彰を5年連続で受けている。現在はNTTデータ先端技術株式会社に勤務。