問題発生
今の現場で困った事象が起きています。
あるきっかけで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