別のソフトウェアにアカウントを複製したりするために、Active Directoryのアカウント情報をエクスポートしたい場合がある。ldifdeコマンドを利用すると、標準規格であるLDIF形式でエクスポートできる。オプションを指定することで、アカウントの名称や種類による絞り込みも可能だ。
対象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コマンドを利用するには、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 の機能の有効化または無効化]メニューをクリックし、[リモート サーバー管理ツール]−[役割管理ツール]までツリーを開き、次のいずれかの役割管理ツールを有効化する。
■Windows Server 2008の場合
サーバ・マネージャの[機能]にある[機能の追加]をクリックし、[リモート サーバー管理ツール]−[役割管理ツール]までツリーを開き、次のいずれかの役割管理ツールを有効化する。
■Windows 7の場合
まず、Windows Vistaの場合と同様にRSATをインストールする(上記のTIPS参照。Windows Vista向けとWindows 7向けはバイナリが異なるので注意)。その後、コントロール・パネルの[プログラムと機能]アプレットから[Windows の機能の有効化または無効化]メニューをクリックし、[リモート サーバー管理ツール]−[役割管理ツール]−[AD DS および AD LDS ツール]までツリーを開き、次のいずれかの役割管理ツールを有効化する。
■Windows Server 2008 R2の場合
サーバ・マネージャの[機能]にある[機能の追加]をクリックし、[リモート サーバー管理ツール]−[役割管理ツール]−[AD DS および AD LDS ツール]までツリーを開き、次のいずれかの役割管理ツールを有効化する。
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やコンテナに含まれるアカウントのみエクスポートするには、-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
ログオン中とは別の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 個のエントリがエクスポートされました
コマンドが正しく完了しました
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コマンドの詳細については、次のマイクロソフトのリファレンス・ページを参照していただきたい。
■この記事と関連性の高い別の記事
Copyright© Digital Advantage Corp. All Rights Reserved.