以前、AD の勉強をしていた時にクライアントから発行される AD の LDAP クエリはキャプチャできないのかな~と思い調べたことがあり、
パフォーマンスモニタのトレースログで AD の情報を取得することで、LDAP クエリがキャプチャできそうでした。
今週、このトレースを久しぶりに取得してみる機会があったので、せっかくなのでブログにも投稿を。
# この辺の情報があまり見つけられず、これであっているのかがいまいちわからないのですがそれらしい情報が取得できます。
私の検証環境に Windows Server 2003 / Windows Server 2008 の AD がありましたのでこれを使ってトレースログを
取得してみたいと思います。
今回は Windows Server 2003 で。
■Windows Server 2003 でトレースログを取得
トレースログはパフォーマンスモニタから取得することができます。
- パフォーマンスモニタは [管理ツール] の [パフォーマンス] または、[ファイル名を指定して実行] から [perfmon.exe] を実行します。
?
パフォーマンスモニタの [パフォーマンス ログと警告] の中に [トレース ログ] があります。
このトレース ログを使用することで AD のクエリ情報を取得できそうです。
? - トレース ログを右クリックして、[新しいログの設定] をクリックします。
- ログの名前を入力して、[OK] をクリックします。
- ここでシステム外のプロバイダの [追加] をクリックし、[Active Directory: Core] を追加します。
- デフォルトの設定では、作成したと同時に開始されてしまいますので、スケジュールを [手動] にしておきます。
- [OK] を押して準備完了です。
?ログの出力先のディレクトリが存在していない場合は、警告メッセージが表示されるので [はい] をクリックして、
ディレクトリを作成します。 - 作成したトレース ログを開始すると取得が始まります。
取得したファイルは出力先のディレクトリに、[etl] ファイルとして出力されます。
■ログの成形
取得したログはバイナリ形式ですのでそのままでは内容を確認できません。
以前、WSFC のログについて で投稿した、[tracerpt] コマンドを使ってログを成形することができます。
以下はコマンドの例になります。
C:perflogs>tracerpt "Active Directory Trace_000001.etl" -o log.txt 入力 100.00% 出力 コマンドは、正しく完了しました。 |
このログファイルの中で [DsDirSearch] となっている個所が、LDAP のクエリ検索に使用された情報になるようですので、
[FIND] コマンドでこの行だけを切り出します。
find log.txt “DsDirSearch” > report.txt |
切り出した内容がこちらです。
クライアントのログイン処理に関連しそうな情報を貼り付けてみました。
[10.2.0.2] はクライアントに割り当てている IP になります。
Event Name,?????? Type,??????? TID,?????????? Clock-Time, Kernel(ms),?? User(ms), User Data DsDirSearch,????? Start, 0x000001EC,?? 129103742780181356,??????? 180,?????? 1200, "DS", 3, 3, 1141178432,??????? 0, "NTDSAPI", "deep", "DC=exchange,DC=local", "0, 0 DsDirSearch,????? Start, 0x000001EC,?? 129103742780337608,??????? 180,?????? 1200, "DS", 3, 3, 1141178432,??????? 0, "NTDSAPI", "deep", "DC=exchange,DC=local", "0, 0 DsDirSearch,????? Start, 0x00000A40,?? 129103742780493860,???????? 15,??????? 105, "DS", 3, 3, 1141178432, 1075970048, "10.2.0.2", "deep", "DC=exchange,DC=local", "0, 0 DsDirSearch,????? Start, 0x000003F4,?? 129103742780650112,??????? 510,?????? 5895, "DS", 3, 3, 1141178432, 1612840960, "10.2.0.2", "base", "CN=Default-First-Site-Name,CN=Sites,CN=Configuration,DC=exchange,DC=local0, 0 DsDirSearch,????? Start, 0x00000A40,?? 129103742780806364,???????? 15,??????? 105, "DS", 3, 3, 1141178432, 1075970048, "10.2.0.2", "deep", "cn=policies,cn=system,DC=exchange,DC=local", "0, 0 |
Start と End で1 ブロックのようです。Start と End は同一の TID となるようですね。
ログインに使用したユーザー名の情報が出力されています。
また、IP アドレスが記載されているものもありますね。
試しに [0x00000A40] の情報を使って AD に問い合わせをしてみたいと思います。
問い合わせには、[dsquery] コマンドを使用します。
dsquery * -filter " (distinguishedName=CN={31B2F340-016D-11D2-945F-C04FB984F9},CN=Policies, CN=System,DC=exchange,DC=local) " -attr * objectClass: top |
この情報はグループポリシーのために発行したクエリのようですね。
トレースは、dsquery の LDAP フィルタの式のサンプルとしても利用することが可能です。
クライアント PC 起動時に AD 側でトレースを取得しているとコンピュータアカウントで発行されたクエリが取得できます。
次回は Windows Server 2008 で同様の作業を実施してみます。
こちらは、クライアント PC 起動時の情報を取得するシナリオを実施したいと思います。