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

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

前回は、Active DirectoryではLDAPを使ったデータベースが構成されていることをお話ししました。LDAPでは、データベースを検索して情報を表示したり、オブジェクトを追加あるいは属性を変更することができます。これらの機能を使うには、データベースに接続して必要な認証を行ったあと、データベースの特定エントリへの検索を行ったりオブジェクトを操作したりします。

これらのLDAPの操作手順は、Active Directoryをプログラムから制御する一般的な方法となりますが、開発者でないシステム管理者は、普段意識することはないでしょう。しかし、システム管理者でも、たとえば、ここ1週間の間ログオンしていないユーザの一覧を抜き出したい、といった管理タスクを実行したいのであれば、ユーザのログオン時刻に関する属性(lastLogonやlastLogonTimestamp)を, LDAPを使って検索することになります。また、特にトラブルシュートを行う場合、LDAPの理解が重要なポイントとなりますので、LDAPの基本動作を知っておくことは重要となります。

このほか、Active Directoryのデータを別のリソース(新しいドメインコントローラなど)にコピーしたいような場合、LDAPを使ってエクスポート・インポートを行うツールを利用することで、簡単に実現できます。

今回は、システム管理者が実際にLDAPを利用する場合に便利な(必要な)ツールをいくつかご紹介します。

ldpツール

ldpツールとは、一般的なLDAPクライアントとしての機能をもったツールです。LDAPクライアントは、LDAPへのバインド・検索や設定の変更などを汎用的に実行することができます。LDAPでは一般にデータ内容はテキストで表示されますが、ldpツールはGUIアプリケーションであるため、操作自体はグラフィカルに行うことができ、直感的でわかりやすいインターフェースになっています。Windows Servers 2008以降であれば、スタートメニューの[ファイルを指定して実行]からldp.exeとして実行できますが、それ以前のOSでは「Windowsサポートツール」をインストールする必要があります。

ldpツールは主に動作上のテストやトラブルシュートで利用されます。実際に利用される一例として、誤って削除されたユーザアカウントを復旧する(Windows Server 2003 SP1以降のみ可能)シナリオがあります。今回このシナリオは紹介しませんが、システム管理者が押さえておくべきツールといえるでしょう。

ldpでLDAPを検索する

LDAPツールでアカウント情報を検索するには、まずLDAPデータベースにアクセスして接続してから、アカウントによる認証(バインド)を行って、初めて利用可能となります。手順は次のとおりです。なお、以下の操作はすべてWindows Server 2008 R2上で行っています。

  • ① メニューバーの[接続⁠⁠→⁠接続]を選択します。

    画像
  • ⁠サーバー]欄にドメインコントローラの名前またはIPアドレスを入力し、[OK]をクリックします。

  • ③ 再度メニューバーの[接続⁠⁠→⁠バインド接続]を選択します。

  • ⁠バインドの種類]欄で[現在のユーザーとしてバインド]を選択し、[OK]をクリックします。

    画像

    なお、ローカル上のLDAPにアクセスする場合、手順③から行っても問題はありません。

    接続やバインドに成功すると、RootDSEに関する情報や、認証に利用したユーザ名が表示されます。もしうまくいかなかった場合、一番最後にLDAPエラーメッセージが表示されますので、バインドできなかった原因を、エラーメッセージをもとに確認します。問題がなければ、接続するエントリ(ツリー)を指定します。ツリーの設定は次のとおりです。

  • ⑤ メニューバーの[参照]-[ツリー]を選択し、リストボックスから[DC=marubatsucorp,DC=local]を選択します。

    画像

    この状態で左ウインドウのツリー階層をクリックするだけで、オブジェクト情報や属性内容が右ウインドウに表示されます。

    画像

    この操作は1つのオブジェクトに対して行いますが、複数のユーザアカウントのオブジェクト情報を表示したい場合、検索を行うことで実現できます。検索の操作は次のとおりです。

  • ⑥ メニューバーの[参照⁠⁠→⁠検索]を選択し、画面上で次のように入力して[実行]をクリックします。

    ベースDN[DC=marubatsucorp,DC=local]
    フィルタ[(&(objectCategory=person)(objectClass=user))]
    スコープ[サブツリー]
    属性[objectClass;name;description;canonicalName]
    画像

    「ベースDN」はLDAP検索のベース(基本)となるエントリを指定することで、ベースDNを頂点とするツリーの配下を検索対象とします。⁠フィルタ」は特定の属性の値を指定することで、その値を含むオブジェクトを抽出します。⁠スコープ」(ベースDN配下の)検索の範囲を指定するもので、⁠ベース」は指定したコンテナのみ、⁠1レベル」は1階層の範囲のみ、⁠サブツリー」は再帰的に階層を検索します。⁠属性」は検索結果となる各オブジェクトが表示される際、表示される属性を指定します。

    検索を行うと、右ウインドウに検索結果となる、該当オブジェクトのDNとcanonicalName、description、name、objectClass属性が表示されます。ここでは、フィルタの条件に「objectCategoryにpersonを含み、かつobjectClassにuserを含む」と設定したので、⁠personカテゴリに所属しuserクラスのオブジェクトである」ユーザアカウントが検索対象となります。

    画像

LDAP検索のポイントは「フィルタにより検索条件を細かく指定できる」ということにあります。たとえばフィルタ条件を「(objectClass=user)」だけにしてしまうと、userクラスのオブジェクトである、ユーザアカウントとコンピュータアカウント両方が検索対象となってしまいますので、希望どおりの結果となりません。

LDAPのフィルタ条件は、演算子と括弧を使った条件式から指定できますので、難しい検索条件の定義も可能です。代表的な演算子は次のとおりです。なお、演算子は条件式の先頭に置く必要があります。

=等しい(equal)
>=以上(grater-than)
<=以下(less-than)
&かつ(and)
|または(or)
!等しくない(not equal)
フィルタ検索の例
(&(objectCategory=computer)(primaryGroupID=516))
        ドメインコントローラを検索する

(&(&(objectCategory=person)(objectClass=user))(!lastlogon=0)(lastPwdSet=0)))
        新規作成でない利用中のユーザアカウントで"ユーザーは次回ログオン時にパスワード変更が必要"がチェックされたものを検索する

(&(objectCategory=computer)(lastlogon<=129163356000000000))
        コンピュータオブジェクトで最終ログオン日時が2010/04/22 0:00:00以前のものを検索する

(&(&(objectCategory=person)(objectClass=user))(userAccountControl:1.2.840.113556.1.4.803:=2))
        ユーザオブジェクトでアカウントが無効なものを検索する

ldpツールでオブジェクトを追加する

ldpツールでは、OUやアカウントオブジェクトを追加することができます。まず、OUオブジェクトを作成するには、次のとおりに行います。なお、ここでは、サンプル環境としてすでに「OU=営業部,DC=marubatsucorp,DC=local」OUが用意されている、という前提での操作になることにご注意ください。

  • ①メニューバーの[参照⁠⁠→⁠子の作成]を選択し、DN:[OU=第二課,OU=営業部,DC=marubatsucorp,DC=local]と入力します。

  • [エントリの編集]に次の設定をし、[入力]をクリックします。

    属性
    [objectClass][organizationalUnit]
    [description][営業部第二課OU]
  • [エントリ一覧]に②の内容があることを確認して、[実行]をクリックします。

    画像

    この操作で右ウインドウに"***Call Add..."という結果が表示されれば、OUが作成されています。

    画像

続いてユーザアカウントを作成する手順に移ります。

  • [子の作成]画面で、DN:[CN=田所 明,OU=第二課,OU=営業部,DC=marubatsucorp,DC=local]と入力します。

  • [エントリの編集]に次の設定を入力し、1つずつ[入力]をクリックします。

    属性
    [objectClass][user]
    [description][営業部第二課ユーザー]
    [saMaccountName][atadokoro]
    [diplayName][田所 明]
    [sn][田所]
    [givenName][明]
    [company][○×株式会社]
    [department][営業部第二課]
    [title][課長]
    [mail][atadokoro@marubatsucorp.local]
    [telephoneNumber][03-1234-6789]
    [userPrincipalName][atadokoro@marubatsucorp.local]
  • [エントリ一覧]に⑤の内容があることを確認して、[実行]をクリックする。

    画像

    OUの時と同じく右ウインドウに成功した旨の結果が表示されれば、ユーザアカウントが作成されているはずです(⁠⁠Active Directoryユーザーとコンピューター]スナップインからでも確認できます⁠⁠。

    画像 画像
  • なお、作成されたアカウントは無効の状態で設定されます。これは、パスワードであるunicodePwd属性を設定していないためですが、unicodePwdはSSLまたはTLSの暗号化セッション経由でないとLDAPによる設定ができないため、ここでは直接設定することはできません。

    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

    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/

おすすめ記事

記事・ニュース一覧