Windowsで、Active Directoryのアカウント情報をエクスポートする(ldifdeコマンド編)Tech TIPS

別のソフトウェアにアカウントを複製したりするために、Active Directoryのアカウント情報をエクスポートしたい場合がある。ldifdeコマンドを利用すると、標準規格であるLDIF形式でエクスポートできる。オプションを指定することで、アカウントの名称や種類による絞り込みも可能だ。

» 2012年08月24日 05時00分 公開
[島田広道デジタルアドバンテージ]
「Tech TIPS」のインデックス

連載目次

対象OS:Windows XP/Windows Server 2003/Windows Vista/Windows Server 2008/Windows 7/Windows Server 2008 R2



解説

 Active Directory(AD)には、ドメイン・ユーザーのアカウント名やID、所属グループといった情報が格納されている。それらの情報をエクスポートして、ほかのソフトウェアあるいはサービスにインポートしたいことがある。例えば、別のディレクトリ・サービスにアカウントを複製することが挙げられる。その方法の1つとして、TIPS「Active Directoryのアカウント情報をエクスポートする(csvdeコマンド編)」では、マイクロソフト提供のcsvdeコマンドを使ってCSV形式でエクスポートする方法を説明した。

 しかし、インポート先のソフトウェアやサービスがCSV形式をサポートせず、LDIF(LDAP Data Interchange Format)という形式のみ受け付ける、ということもある。LDIFはLDAPでディレクトリ情報をやり取りするためのデータ・フォーマットで、RFC2849で勧告されている標準仕様である。

 マイクロソフトはcsvdeコマンドと同様に、このLDIF形式をサポートした「ldifde」というコマンドライン・コマンドも提供している。本稿では、このldifdeコマンドでADのアカウント情報をエクスポートする手順と注意点を説明する。インポートについては別のTIPSで解説する予定だ。

操作方法

●ldifdeコマンドの入手・インストール

→インストール手順をスキップして使い方を読む

 ldifdeコマンドを利用するには、ADを制御するためのツールをインストールする必要がある。その手順はWindows OSごとに異なる。

■Windows XPの場合

 次のダウンロード・センターのページにあるADAM(Active Directory Application Mode)をインストールすると、%SystemRoot%\ADAMフォルダにldifde.exeがインストールされる。

 検索パスには登録されないので、「%SystemRoot%\ADAM\ldifde.exe」というようにフル・パスで指定して実行する。

■Windows Server 2003の場合

 特にセットアップすることなく、ldifdeコマンドを実行できる(%SystemRoot%\system32フォルダにldifde.exeが存在するはずだ)。

■Windows Vistaの場合

 まず、次のTIPSの手順でリモート・サーバ管理ツール(Remote Server Administration Tools: RSAT)をインストールする。

 その後、コントロール・パネルの[プログラムと機能]アプレットから[Windows の機能の有効化または無効化]メニューをクリックし、[リモート サーバー管理ツール]−[役割管理ツール]までツリーを開き、次のいずれかの役割管理ツールを有効化する。

  • [Active Directory ドメイン サービス ツール]−[Active Directory ドメイン コントローラ ツール]
  • [Active Directory ライトウェイト ディレクトリ サービス ツール]

■Windows Server 2008の場合

 サーバ・マネージャの[機能]にある[機能の追加]をクリックし、[リモート サーバー管理ツール]−[役割管理ツール]までツリーを開き、次のいずれかの役割管理ツールを有効化する。

  • [Active Directory ドメイン サービス ツール]−[Active Directory ドメイン コントローラ ツール]
  • [Active Directory ライトウェイト ディレクトリ サービス ツール]

■Windows 7の場合

 まず、Windows Vistaの場合と同様にRSATをインストールする(上記のTIPS参照。Windows Vista向けとWindows 7向けはバイナリが異なるので注意)。その後、コントロール・パネルの[プログラムと機能]アプレットから[Windows の機能の有効化または無効化]メニューをクリックし、[リモート サーバー管理ツール]−[役割管理ツール]−[AD DS および AD LDS ツール]までツリーを開き、次のいずれかの役割管理ツールを有効化する。

  • [AD DS ツール]−[AD DS スナップインおよびコマンドライン ツール]
  • [AD LDS スナップインおよびコマンドライン ツール]

■Windows Server 2008 R2の場合

 サーバ・マネージャの[機能]にある[機能の追加]をクリックし、[リモート サーバー管理ツール]−[役割管理ツール]−[AD DS および AD LDS ツール]までツリーを開き、次のいずれかの役割管理ツールを有効化する。

  • [AD DS ツール]−[AD DS スナップインおよびコマンドライン ツール]
  • [AD LDS スナップインおよびコマンドライン ツール]

●ldifdeコマンドの基本的な使い方

 ldifdeコマンドの使い方は、コマンド・プロンプト上でオプションを指定せずに「ldifde」を実行すると表示される。ldifdeコマンドはデフォルトではエクスポート・モードで動作するので、エクスポート先のファイル名指定などのオプションを付けて実行すればよい。

 まず、エクスポートしたいADのドメインに所属しているWindows PCに、ADのアカウント情報を取得できる権限を持ったユーザー・アカウント(例えばDomain Adminsグループ所属のユーザーなど)でログオンする(別ドメインやワークグループから実行する方法については後述する)。

 ldifdeコマンドでADのアカウント情報をエクスポートするには、「-f <エクスポート・ファイル>」というオプションを指定する。

C:\Temp>ldifde -f export.ldf ……export.ldfに全オブジェクトをエクスポートする
"dc01.example.jp" に接続しています 
SSPI を使って現在のユーザーとしてログインしています 
ディレクトリをファイル export.ldf にエクスポートしています 
エントリを検索しています...
エントリを書き出しています 
...........................................................
(省略)
..........................................
4002 個のエントリがエクスポートされました

コマンドが正しく完了しました



 上記のようにldifdeコマンドを実行すると、所属しているADの全オブジェクトの情報が次のようにexport.ldfへエクスポートされる。

dn: CN=deeaa-hanako,CN=Users,DC=example,DC=jp ……あるユーザー・アカウントの情報
changetype: add
objectClass: top
objectClass: person
objectClass: organizationalPerson
objectClass: user
cn: deeaa-hanako
sn: DeeAaa
givenName: Hanako
description:: 56S+5YaF44K544K/44OD44OV ……Base64でエンコードされた「説明」欄(属性)の内容
c: JP
st:: 5p2x5Lqs6YO9 ……都道府県の属性。「東京都」を表している
l:: 5p2J5Lim5Yy6
title:: 
postalCode: 168-0074
distinguishedName: CN=deeaa-hanako,CN=Users,DC=example,DC=jp
displayName:: 5Ye65LqcIOiKseWtkA==
memberOf: CN=Company Staff,CN=Users,DC=example,DC=jp ……所属するグループ
logonCount: 1576
(省略)
mail: deeaa-hanako@example.jp

dn: CN=test-user01,CN=Users,DC=example,DC=jp ……次のオブジェクト
(省略)



 上記のdescription属性の値は本来、日本語で書かれた説明文だが、Base64でエンコードされている(エンコードされている属性には、属性名の末尾に「:」が2つ付く。「:」が1つならエンコードなし)。このようにldifdeコマンドはデフォルトで、日本語の値(Unicodeで記述された値)をBase64でエンコードして出力する。このデフォルトの挙動を変える方法については、後で説明する

●ユーザー・アカウントのみエクスポートする

 デフォルトでは、ldifdeコマンドはADの全オブジェクトの情報をエクスポートするため、例えば組織単位(OU)やシステム関連のオブジェクトなど、アカウント以外の不要な情報も記録されてしまう。必要な情報だけを抜き出すには、そのためのオプションをldifdeコマンドに指定する必要がある。

 ユーザー・アカウントのみエクスポートするには、次のように-rオプションを指定する。

ldifde -u -f export.ldf -r objectCategory=user



グループ・アカウントをエクスポートするには、上記の「user」の代わりに「group」を指定すればよい。

 どういったアカウントがエクスポートされるのか、ldifdeの実行時に確認するには、-vオプションを指定する。すると「CN=user01,CN=Users,DC=example,DC=jp」という表記で、エクスポート対象のアカウントが1つずつ表示される。

 特定の名前を持つユーザー・アカウントのみエクスポートしたい場合は、検索条件をLDAPの形式で指定する。例えば、名字(性)の頭文字が「s」から始まるユーザー・アカウントのみエクスポートするには、次のように-rオプションと検索文字列を指定する。

ldifde -f export.ldf -r "(&(objectCategory=user)(sn=s*))"



 「sn」は名字を格納している属性名である。

●特定のOUやコンテナに所属するアカウントのみエクスポートする

 あるOUやコンテナに含まれるアカウントのみエクスポートするには、-dオプションを利用する。例えばexample.jpドメインのUsersコンテナの場合は、「-d "cn=Users,dc=example,dc=jp"」というようにコンテナの場所を指定する。

ldifde -f export.ldf -d "cn=Users,dc=example,dc=jp"



 また、「sales」というOUに限定する場合は、次のように-dオプションを指定する

ldifde -f export.ldf -d "ou=sales,dc=example,dc=jp"



 デフォルトでは、指定したOUやコンテナに含まれるサブ・コンテナ以下、すなわちサブ・ツリー全体がエクスポートされる。サブ・コンテナは含めず、指定したOU/コンテナ内に含まれるオブジェクトだけに限定するには、次のように-pオプションを指定する。

ldifde -f export.ldf -d "ou=sales,dc=example,dc=jp" -p OneLevel



●属性を絞り込んでエクスポートする

 ldifdeはデフォルトで、エクスポート対象のオブジェクトが持つ全属性をエクスポートしようとする。しかし、例えば特定の属性だけ一括修正したい場合は、その属性だけエクスポートしてからテキスト・エディタなどで修正し、インポートした方がよい。そこで、属性を絞り込むオプションをいくつか紹介する。

 あらかじめ必要な属性が判明している場合は、次のように-lオプションで各属性をカンマで区切って指定すると、それらの属性だけがエクスポートされる。

ldifde -f export.ldf -r objectCategory=user -l cn,description,distinguishedName,displayName,sAMAccountName



 逆に特定の属性を省きたいなら、それを-oオプションで指定する。以下では、ADに保存されたユーザーの証明書だけ省いてエクスポートするように指定している。

ldifde -f export.ldf -r objectCategory=user -o userCertificate



●所属外ドメインやワークグループからldifdeを実行する

 ログオン中とは別のADに所属しているPCや、ワークグループ構成のPCから、ADの情報をエクスポートしたい場合は、対象のドメインから情報を取得できる資格情報を指定する必要がある。具体的には、次のように-bオプションや-sオプションを指定する。

ldifde -f export.ldf -b <ユーザー名> <ドメイン名> <パスワード> -s <ドメイン・コントローラ名>



 例えば、example.comドメインのadmin02アカウントを用いて、dc02.example.comというドメイン・コントローラからエクスポートするには、次のようにldifdeコマンドを実行する。<パスワード>に「*」を指定すると、入力を促すプロンプトが表示されるので、指定した<ユーザー名>のパスワードを入力する。

C:\Temp>ldifde -f export.ldf -b admin02 example.com * -s dc02.example.com
dc02.example.com のパスワードを入力してください: ******** ……パスワードを入力する
"dc02.example.com" に接続しています 
ドメイン "example.com" に SSPI を使って "admin02" としてログインしています 
ディレクトリをファイル export.ldf にエクスポートしています 
エントリを検索しています...
エントリを書き出しています 
....................................................
.................................
エクスポートが完了しました。後処理を実行しています...
326 個のエントリがエクスポートされました

コマンドが正しく完了しました



●注意: Unicodeでの出力結果はWindows OSによって異なる

 ldifdeコマンドでエクスポートする際に注意が必要なのは、日本語すなわちUnicodeで表現する必要のある値の取り扱いだ。前述のとおり、こうした値は通常Base64でエンコードされて出力される。ここで-uオプションを指定すると、ldifdeコマンドは出力ファイルの文字コードをUnicodeにする。さらにWindows XP/Windows Server 2003の場合は、Base64によるエンコードをせず、そのまま出力する。Unicode対応のテキスト・エディタで開くと、日本語の名前や説明が直接読み取れるし、編集もしやすい。

 一方、Windows Vista/Windows Server 2008/Windows 7/Windows Server 2008 R2で-uオプションを指定した場合、ldifdeコマンドは日本語を含む値もそうでない値も、すべてBase64でエンコードする(ただしDNだけはエンコードされない)。その結果、例えば「1」という値は「MQ==」というように変換されるため、可読性が非常に悪くなる。

項目 内容
-uオプションなし
出力ファイルの文字コード ANSI
日本語を含まない値のエンコード形式 なし
日本語を含む値のエンコード形式 Base64
日本語名を含むDNの値のエンコード形式 Base64
-uオプション指定(Windows XP/Server 2003)
出力ファイルの文字コード Unicode
日本語を含まない値のエンコード形式 なし
日本語を含む値のエンコード形式 なし
日本語名を含むDNの値のエンコード形式 なし
-uオプション指定(Windows Vista/Server 2008以降)
出力ファイルの文字コード Unicode
日本語を含まない値のエンコード形式 Base64
日本語を含む値のエンコード形式 Base64
日本語名を含むDNの値のエンコード形式 なし
-uオプションの有無およびWindows OSによるldifdeコマンドの出力結果の違い
「日本語を含む」とは、表現するのにUnicodeを必要とする文字を含むという意味である。-uオプションを指定した場合、Windows Vista以降では日本語の有無に関係なく、DN以外の属性の値はすべてBase64でエンコードされるため、非常に読みにくくなる。

 -uオプションを指定すべきか否かは、出力ファイルをどのように利用するかにかかっている。例えば、ADのアカウントを別のディレクトリ・サービスへインポートする場合は、そのサービスが要求する文字コードやエンコードと合致するように、-uオプションの指定の有無を決めるべきだろう。


 ldifdeコマンドの詳細については、次のマイクロソフトのリファレンス・ページを参照していただきたい。

「Tech TIPS」のインデックス

Tech TIPS

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。