- PR -

アクティブディレクトリからメールアドレスを取得する

1
投稿者投稿内容
ニッシー
常連さん
会議室デビュー日: 2008/05/21
投稿数: 28
投稿日時: 2008-07-21 12:01
いつも助けて頂いております。
早速ですが、質問をさせてください。

ASP.netでWebアプリケーションを開発しております。

アクティブディレクトリに設定されているメールアドレスを取得してアプリケーションで利用したいのですが、出来るのでしょうか?
ご存知の方がいらっしゃいましたらアドバイスいただきたくよろしくお願いいたします。

以上です。
mitchin
会議室デビュー日: 2003/05/28
投稿数: 16
投稿日時: 2008-07-21 17:52
System.DirectoryServices.DirectoryEntry の Properties.Item("mail").Value プロパティが Active Directory ユーザの「全般」タブの電子メールの値です。
ニッシー
常連さん
会議室デビュー日: 2008/05/21
投稿数: 28
投稿日時: 2008-07-22 16:49
mitchin様
アドバイスありがとうございます。
教えていただいたキーワードから色々と調べてみました。
今のコードはこんな感じです。
Dim domain As String = Environment.UserDomainName
Dim uName As String = Environment.UserName
Dim path As String = "WinNT://" + domain + "/" + uName

Dim dName As String
Using dirEnt As DirectoryEntry = New DirectoryEntry(path)
dName = dirEnt.Properties.("FullName").Value
dName = dirEnt.Properties.Item("mail").Value
End Using

FullName(表示名)は取得できるのですが、メールが取得できません。Nothingが戻ります。
アクティブディレクトリにメールアドレスが登録されていないかも知れないと考え、
「マイネットワーク」「ActiveDirectoryの検索」から検索キーで自分のアカウントを検索し、プロパティを確認しました。「全般タブ」の「電子メール」には自分のメールアドレスがセットされています。(という事で、アクティブディレクトリの電子メールの項目にはメールアドレスが登録されている事が確認できた?)

何かアドバイスいただければ幸いです。

よろしくお願いいたします。

以上


mitchin
会議室デビュー日: 2003/05/28
投稿数: 16
投稿日時: 2008-07-23 12:51
path を "WinNT://〜" と指定するのはローカルのときしかやったことないです・・・

今 VS2003 でコーティングしたのを見てるので Using は使ってませんが path を "LDAP://DC=○○,DC=○○〜" と指定して

Dim root As New DirectoryEntry(path)
Dim schr As New DirectorySearcher(root)
schr.Filter = String.Format("(&(objectClass=user)(name={0}))", uName)
Dim sr As SearchResult = schr.FindOne()
Dim userEntry = sr.GetDirectoryEntry() 'Nothing かどうかのチェックは省略してます
Dim dName As String = userEntry.Properties.Item("mail").Value
userEntry.Close()
root.Close()

こんな感じです。
電子メール(Mail)はドメインのユーザ(DirectoryEntry の objectClass が user)にしか存在しないプロパティです。

私は上記のように
1. ドメインルートの DirectoryEntry を作成
2. 1. の DirectorySearcher を作成
3. 検索条件を設定
4. 対象の objectClass と名前の DirectoryEntry を検索
しています。

[ メッセージ編集済み 編集者: mitchin 編集日時 2008-07-23 12:52 ]

[ メッセージ編集済み 編集者: mitchin 編集日時 2008-07-23 12:53 ]
ニッシー
常連さん
会議室デビュー日: 2008/05/21
投稿数: 28
投稿日時: 2008-07-24 14:37
mitchin様
アドバイスありがとうございます。

提供いただいたサンプルコードを試してみましたが、どうもうまく行きません。
>"LDAP://DC=○○,DC=○○〜" と指定して
の部分ですが、下記の文法で記述しています。
LDAP://host.domain.example.com/DC=domain,DC=example,DC=com

そもそも、このURLをIEのアドレス欄へ入力して実行すると下記エラーが発生します。
Address book Viewer
コンピュータ、インターネットサービスプロバイダ、または指定したディレクトリサービスが接続された可能性があります。
接続を確認してからやり直してください。
操作エラーです。

「マイネットワーク」の「アクティブディレクトリ」の検索から自分のアカウントは検索できるのに。。。

なんだかこのあたりに原因がありそうですね。
もう少し追求してみます。
おかしな点などありましたらアドバイスいただければ幸いです。
ちゃっぴ
ぬし
会議室デビュー日: 2004/12/10
投稿数: 873
投稿日時: 2008-07-24 15:27
ASP.NET とのことなので認証方法は?

匿名認証だと application pool process (w3wp.exe) の起動 account (default: Network Service) で動作しますよ。

その場合、AD への access が許可されていませんので当然接続できません。

利用している認証方法を明らかにしてください。
mitchin
会議室デビュー日: 2003/05/28
投稿数: 16
投稿日時: 2008-07-25 22:54
ドメイン名が domain.example.com だとすると path は
LDAP://DC=domain,DC=example,DC=com
となるはず。

私は VS.NET 2003 で ADSI(Active Directory Service Interface)を使い
Dim DomainInfo As New ActiveDs.ADSystemInfo()
Dim DomainName As String = DomainInfo.DomainDNSName
で DNSドメイン名(上でいう domain.example.com)を取得して
path = String.Format("LDAP://DC={0}", DomainName.Replace(".", ",DC="))
で LDAP のドメインルートパスを取得しています。(ReadOnly Property として自作クラスのメンバにしています)
※もちろんユーザやグループ、コンピュータやプリンタなどをドメイン全体で検索するから

これで再度試してみてください。
ちゃっぴ
ぬし
会議室デビュー日: 2004/12/10
投稿数: 873
投稿日時: 2008-07-26 00:05
LDAP ADsPath の書式は下記。

LDAP://HostName[:PortNumber][/DistinguishedName]

LDAP ADsPath

ということで、hostname が存在するのは全く問題ないです。
Hostname が FQDN で指定されていない場合には Kerberos 認証できないとか制限がありますが、今回の場合 FQDN で指定しているので問題ないですね。

[ メッセージ編集済み 編集者: ちゃっぴ 編集日時 2008-07-26 00:09 ]
1

スキルアップ/キャリアアップ(JOB@IT)