こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

ActiveDirectoryのユーザ情報取得方法

ActiveDirectoryからユーザの所属部署情報を取得できません。

社内イントラネットのクライアントPC(Windows 7)上にASP.NETアプリ開発環境を作成、AcrtiveDirectory(AD)利用の社内イントラネットのためのASP.NETアプリを作成中です。解決できないところがあり、ご教授いただけますよう、よろしくお願いいたします。

【やりたいこと】
クライアントの所属部署に応じて、表示させるページを変えたい。
そのため、統合Windows認証にて、クライアントPCにてドメイン認証を受けたユーザのユーザ名を、User.Identity.nameにより取得後、ADに問合せ、ユーザの所属部署(department)情報を取得したい。
なお、User.Identity.nameにより、ユーザ名を取得できることは確認済です。

【開発・テスト環境】
・クライアントPCのWindows7にIISを設置し、本IIS上で、作成中のアプリケーションを動かしActiveDirectoryとの連携を含め動作を確認しようとしている。(アプリケーション完成後には、Windows Server 2008 R2に配置予定))
■IISにおける認証設定:Windows
■ASP.NETにおける認証設定:Windows
■ASP.NETの偽装設定:true(認証された一般ユーザに設定)
・開発ツール VWD2010
・開発言語 ASP.NET VisualBasic(Web Form利用)

【現象】
Web Formページ userdep.aspxの<script>タグ内に次のスクリプトを記述。
Dim uName As String = User.Identity.Name
Dim path As String = "LDAP=://LDAPserver_name/CN=Users, DC=XXX, DC=XXX, DC=jp"
Dim root As DirectoryEntry = New DirectoryEntry(path)
Dim schr As DirectorySearcher = New DirectorySearcher(root)
schr.Filter = String.Format("(&(objectClass=user)(name={0}))", uName)
Dim sr As SearchResult = schr.FindOne()
Dim userEntry = sr.GetDirectoryEntry()
Dim strdata As String = userEntry.Properties("department").Value
Label2.Text = uName
Label3.Text = strdata
userEntry.Close()
root.Close()

本ページを実行(http://localhost/xxx/userdep.aspxで呼び出し)すると、上記6行目(schr.FindOne()メソッド部分)で次のエラーが発生した。
=====エラー表示=====
不明なエラー (0x80005000)
説明: 現在の Web 要求を実行中に、ハンドルされていない例外が発生しました。エラーに関する詳細および例外の発生場所については、スタック トレースを参照してください。

例外の詳細: System.Runtime.InteropServices.COMException: 不明なエラー (0x80005000)
=====エラー表示終わり====


【推測】
Dim sr As SearchResult = schr.FindOne()の行にてエラーが表示されており、この部分は、ActiveDirectoryから情報を取得にいく部分かと思います。
AccessDirectoryにアクセスできていないようにも思えますが、ADへのアクセス権の問題でしょうか?
AccessDirectory側でなにか設定しなければならないことがあるのでしょうか?
開発環境(クライアントPC)では、IISおよびASP.NETにてWindows認証を設定し、ASP.NET偽装を設定していますので、認証されたユーザがActiveDirectoryのアクセストークンになると思っております。
なお、クライアントPCにてドメイン認証をうけたユーザIDは、普通のドメインユーザIDです。
考え違い等ありましたら、ご指摘よろしくお願いいたします。

投稿日時 - 2012-01-20 11:50:21

QNo.7255420

困ってます

質問者が選んだベストアンサー

DirectorySearcher 使おうとすると AD 内を検索することになるのでそれなりの権限ユーザでないとできません。エラーは権限が足りないことを示していると思います。
偽装するユーザをそれなりの権限ユーザで Web.Config に指定すれば OK かと。

忘れかけていて、試してませんので間違ってるかもしれませんが、ユーザオブジェクトの格納場所が決まっているなら、以下のような感じで

Dim path As String = "LDAP=://LDAPserver_name/CN=****,CN=Users, DC=XXX, DC=XXX, DC=jp"
Dim userEntry As DirectoryEntry = New DirectoryEntry(path)
Dim strdata As String = userEntry.Properties("department").Value

いけそうな気がしますが(****はユーザ名)、探す必要があるんでしょうか。

投稿日時 - 2012-01-23 13:06:13

補足

edp3142さん、ご回答ありがとうございます。助かります。

1.偽装するユーザをそれなりの権限ユーザで偽装しないと、AD内を検索できないということ、了解いたしました。ユーザがクライアントPCからイントラネットのドメインに入ったときに入力したアカウント情報で、ASP.NET偽装を行うことにより、AD内を検索できると思っておりました。貴重なご指摘いただきありがとうございます。

2.スクリプトにおける、LDAP URLの指定に関し、直接、CNに、User.Identity.nameにより取得したユーザ名を指定すればよい、とのご指摘かと思います。この点、Filterのかけ方など、私が理解していない部分がありますので、もう少し、調べさせていただきたいと思います。
貴重なコメントありがとうございます。

投稿日時 - 2012-01-25 11:11:15

お礼

edp3142さん、

お忙しい中、ご回答ありがとうございます。
非常に有益な情報となりました。

今後とも一層、ASP.NETを勉強していこうと思います。
ありがとうございました。

投稿日時 - 2012-02-17 00:30:03

ANo.1

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.2

No.1です。

>いけそうな気がしますが(****はユーザ名)、探す必要があるんでしょうか。

これ↑ name と cn が同じ前提の場合ですね。すみません。

投稿日時 - 2012-01-24 10:05:30

補足

edp3142さん、

お世話になります。前の補足で述べましたように、LDAPの問合せにおけるフィルターのかけ方などを調べておりまして返信が遅くなってしまいまして申し訳ありません。

edp3142さんの上記回答において、「name と cn が同じ前提の場合ですね。」とありますが、お手数ですが、もう少し詳細にご説明をいただけますと有難く存じます。いろいろ調べましたがわかりませんでした。
よろしくお願い申し上げます。

投稿日時 - 2012-02-05 20:42:39