AD情報をC#で取得

問題発生

今の現場で困った事象が起きています。

 

あるきっかけでAD情報の内容とシステム内のユーザー情報の内容に差異が生じます。

こうなってしまうとこのユーザーはシステムにログイン出来なくなります。

現状は手動でユーザー情報を更新して対応しています。

対応策が必要

きっかけが何であるかは判明しています。

対応方法をどうするか。

とりあえず、手動で行っている処理を自動化する方向で検討する。

手動での更新処理ではVBScriptの作成されたツールでAD情報を取得してます。

毎日夜間に処理されるバッチは主にC#で作成されています。

そこで、このバッチ処理に埋め込むため、C#で実現できるか調査

VBScriptを解析

●こんな感じで実装されている
Set objConnection = CreateObject("ADODB.Connection")
Set objCommand =   CreateObject("ADODB.Command")
objConnection.Provider = "ADsDSOObject"
objConnection.Open "Active Directory Provider"

●最も知りたい重要な検索方法
"SELECT XXXX,YYYY FROM 'LDAP://△△△△' WHERE objectClass='user' and name='12345'"

※△△△△は接続先

【LDAPとは】
Light weight(軽量)な Directory Access Protocolのこと

LDAPは、ユーザからの検索クエリに対して結果を返したり、システム管理者が内容を自由に追加、
変更できるデータベースとして機能する、らしい

つまり、AD情報を検索するにはこの方法を使いましょう。

LDAPの特徴は「ディレクトリ」と呼ばれる階層構造(木構造)により構成されている

【LDAPの木構造】
DIT(Directory Information Tree)というらしい。

 

TOPから順に、
DC(Domain Component)= ドメイン名
OU(Organizational Unit)= 組織単位
CN(Common Name)= 一般名

 

例え
DCはドメインの構成要素のことなので、例えばgoogleだったら、www.google.comは
DC=www,DC=google,DC=comと、3つのDCを持つことになる。

DN:CN=Canon01,OU=Sales,DC=hogehoge,DC=com

●次に接続先(△△△△)の取得
CreateObject("ADSystemInfo")を使っています。

PdcRoleOwnerから必要部分を切り取り作成

 

PdcRoleOwnerはこのような形
「CN=AAAA,CN=BBBB,OU=CCCC,OU=EEEE,DC=FFFF,DC=GGGG,DC=HHHHH」

 

C#での実現検証

●AD情報の取得で検索。
System.DirectoryServicesの以下のクラスで実現できるらしい。
・DirectoryEntry
・DirectorySearcher

●とりあえず実際に動かしてみる
var entry = new System.DirectoryServices.DirectoryEntry(接続先△△△△);
var searcher = new System.DirectoryServices.DirectorySearcher(entry);

●検索条件を設定
var name = "12345";
searcher.Filter = String.Format("(&(objectClass=user)(Name={0}))", name);

 

●検索実行
var result = directorySearcher.FindOne();
var entry = result.GetDirectoryEntry();

 

同じような方法で、同じような結果を取得。

 

ちなみにメールアドレスの取得方法
var mailAddress = (string)entry.Properties["mail"].Value;

●接続先の取得を確認
「Active DS Type Library」を追加

var systemInfo = new ADSystemInfo()

 

vbsと同じ内容が取得できそう。
systemInfo.PdcRoleOwner