ActiveDirectoryのユーザ情報取得方法

このQ&Aのポイント
  • ActiveDirectoryからユーザの所属部署情報を取得する方法について説明します。
  • クライアントの所属部署に応じて、表示させるページを変えるために、統合Windows認証を利用してアクセストークンを取得し、ActiveDirectoryに問い合わせます。
  • しかし、実行中に不明なエラーが発生し、ActiveDirectoryへのアクセスができないため、原因を推測しています。
回答を見る
  • ベストアンサー

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です。 考え違い等ありましたら、ご指摘よろしくお願いいたします。

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

  • ベストアンサー
noname#259269
noname#259269
回答No.1

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

bluestar2
質問者

お礼

edp3142さん、 お忙しい中、ご回答ありがとうございます。 非常に有益な情報となりました。 今後とも一層、ASP.NETを勉強していこうと思います。 ありがとうございました。

bluestar2
質問者

補足

edp3142さん、ご回答ありがとうございます。助かります。 1.偽装するユーザをそれなりの権限ユーザで偽装しないと、AD内を検索できないということ、了解いたしました。ユーザがクライアントPCからイントラネットのドメインに入ったときに入力したアカウント情報で、ASP.NET偽装を行うことにより、AD内を検索できると思っておりました。貴重なご指摘いただきありがとうございます。 2.スクリプトにおける、LDAP URLの指定に関し、直接、CNに、User.Identity.nameにより取得したユーザ名を指定すればよい、とのご指摘かと思います。この点、Filterのかけ方など、私が理解していない部分がありますので、もう少し、調べさせていただきたいと思います。 貴重なコメントありがとうございます。

その他の回答 (1)

noname#259269
noname#259269
回答No.2

No.1です。 >いけそうな気がしますが(****はユーザ名)、探す必要があるんでしょうか。 これ↑ name と cn が同じ前提の場合ですね。すみません。

bluestar2
質問者

補足

edp3142さん、 お世話になります。前の補足で述べましたように、LDAPの問合せにおけるフィルターのかけ方などを調べておりまして返信が遅くなってしまいまして申し訳ありません。 edp3142さんの上記回答において、「name と cn が同じ前提の場合ですね。」とありますが、お手数ですが、もう少し詳細にご説明をいただけますと有難く存じます。いろいろ調べましたがわかりませんでした。 よろしくお願い申し上げます。

関連するQ&A

  • IIS7.0上でASP.netでAD情報取得したい

    ASP.netをVS2008(言語はVB)で開発しています。ローカル(WinXP)ではAD情報が取得できるのに、 WindowsServer2008(IIS7.0)上で実行したらエラーになりました。 エラー内容:「操作エラーが発生しました」 場所 System.DirectoryServices.DirectoryEntry.Bind(Boolean throwIfFail) ------------------------------------- コード: Dim nameCheck As String = System.Security.Principal.WindowsIdentity.GetCurrent.Name.ToString() Dim serverPath As String = "LDAP://servername/DC=hogehoge,DC=local" Dim entry As New System.DirectoryServices.DirectoryEntry(serverPath) 'ログオンユーザーを変数へ代入 Dim lgUser As String = Environment.UserName Dim search As New System.DirectoryServices.DirectorySearcher() ' 検索のルートになるDirectoryEntryを指定 search.SearchRoot = entry ' 検索条件を指定します。下ではアカウント名と変数lgUserの一致が条件 search.Filter = "(samAccountName=" + lgUser + ")" Dim result As System.DirectoryServices.SearchResult result = search.FindOne ------------------------------------- この↑FindOneでエラーになります。 lgUserにはユーザーID、 nameCheckにも、ドメイン名/ユーザーIDで、予定通りの値が取得出来ていることを確認しています (※nameCheckはコード上必要ありませんが 思った通りの動きをしているか確認のため取得し、エラー時に表示して確認しました) IIS7.0上では、IISマネージャを使用して、 「認証」で ・ASP.NET偽装 ・Windows認証 を有効とし、他(フォーム認証、基本認証、匿名認証)はすべて無効にしています lgUserにセットされる値はIDなので、 AD情報から、該当する人の名前と、メールアドレスを取得したいです。 (イントラネット上でデフォルト表示に使用します) IIS7.0上で、ADに接続できるような設定が必要なのかな?と思っているのですが 具体的にどこをどうしたらよいのかわからず、途方に暮れています こちらの情報が少ないようでしたら追加致します。 もう3日くらい詰まっているので、ヒントだけでも教えていただけると助かります。 よろしくお願いいたします。

  • ActiveDirectoryから値を取得

    VB2005にて、ActiveDirectoryから値を取得するアプリを作成しています。 WindowsXPでは問題なく動作するのですが、Windows7だと「ローカルエラーが発生しました」 というエラーメッセージが返って来てしまいます。 OSの設定を変えれば解決するのか、プログラムの書き方を変えるのか分からないので、 こちらに質問させていただきました。以下がプログラムです。 どなたかご存知の方がいらっしゃいましたら教えて下さい。 宜しくお願いします。 Try Dim serverPath As String = "LDAP://ドメコンのIPアドレス/DC=XXXXX,DC=co,DC=jp" Dim userName As String = "CN=ユーザー名,CN=Users,DC=XXXXX,DC=co,DC=jp" Dim password As String = "パスワード" Dim entry As New System.DirectoryServices.DirectoryEntry(serverPath, userName, password) Dim lgUser As String Dim intPos As Integer '「,」の位置 lgUser = ユーザーID Dim search As New System.DirectoryServices.DirectorySearcher() '検索のルートになるDirectoryEntryを指定 search.SearchRoot = entry '検索条件を指定します。下ではアカウント名と変数lgUserの一致が条件 search.Filter = "(samAccountName=" + lgUser + ")" Dim result As System.DirectoryServices.SearchResult Dim strA As String '↓ココでエラーになります。 result = search.FindOne Dim counter As Integer For counter = 0 To (result.Properties("memberOf").Count) - 1 'resultで抽出したアカウントがメンバとして含まれるグループを取得 Dim groupName As String = CStr(result.Properties("memberOf")(counter)) strA = strA & groupName & vbCrLf intPos = groupName.IndexOf(",") '「,」の位置を取得 User_Group.Add(groupName.Substring(3, intPos - 3)) Next counter SetUser_Group = True Catch ex As Exception MessageBox.Show(ex.Message, "ActiveDirectoryからの取得", MessageBoxButtons.OK, MessageBoxIcon.Error) End Try

  • ActiveDirectoryのログイン認証時に使用したユーザー名の取得

    ActiveDirectoryのログイン認証時に使用したユーザー名、パスワードをHTMLページで取得する方法がわかりません。 ログインのタイミングはhtmlページのActiveDirectoryのあるサーバのHTMLファイルへのリンククリックでActiveDirectoryのあるサーバに接続します。 htmlページは認証後、画面移動で表示されます。 認証で使用したユーザー名、パスワードをHTMLの中でも使用したいと思っています。 サーバーのOSはWindows2000サーバーで、WebサーバはIISを使用しています

  • ActiveDirectoryでクライアント側のユーザーアカウント情報を変えたいのですが

    クライアントPCをActiveDirectoryで600台管理しています。 クライアントPC100台で、導入時に以下の設定をし忘れて困ってます。 ・ユーザーアカウント→「詳細設定」→「ユーザー管理の詳細設定」→「グルー>プ」→「Powerusers」をダブルクリックし、所属するメンバ「追加」で「Domain Users」を追加(これがないと、通常のUsersになってしまう) 上記設定をし忘れたため、一般ユーザーが各クライアント側で何か設定作業があるとき、USER権限しかないためアクセス権限がなく支障が出てきてます。 ActiveDirectry側で設定できるところはあるものでしょうか?それとも1台1台設定していかないといけないのでしょうか? すいませんが、ご教授くださいませ。

  • 切れたActiveDirectoryで...

    Win2000サーバーでActiveDirectoryドメインを構成しているのですが、不思議な現象に遭遇しましたので何かわかれば情報をください。  ことの起こりは、クライアント(Win2000 Pro)がつながっているハブ(イーサスイッチ)の電源が落ちたことなのですが、それに気づかずにクライアントからログインできなくて悩んでいました。  そのとき、たまたま一人のユーザーがadministratorアカウント、パスワードなしでドメインにログオンしようとしたらすんなりと入ってしまいました。ハブが死んでますからもちろんネットワークは使えないのですが、このような手段で端末にログオンできてしまったことが不思議なのです。  私のところでは、ユーザー認証がされない限り端末は使えないようにしているつもりなのですが、ネットワークが切れたときに限ってこのようにログインできてしまうのはどうも気持ちが悪いものです。  Windows(またはActiveDirectory)はこういう仕様なのでしょうか。

  • ActiveDirectoryについて

    ActiveDirectoryについて質問します。 1.サーバにてActiveDirectoryを設定し、ファイルサーバとして使用しています。 サーバ内の共有ファイルを使用するネットワーク内のクライアントは、サーバのユーザとコンピュータに登録しておかなければならないことは存じ挙げています。 で、悩んでいますところは、 初めて作成したユーザはクライアントからサーバ内の共有ファイルへのアクセスは可能なのですが、 そのユーザを一度でも削除し作成し、作り直すと、適切なアクセス権限をつけているにも関わらず2度とファイル閲覧が不可能となってしまうところです。 どこかにゴミ?(設定ファイル)が残っていると思うのですが、削除の仕方、もしくは解決法ご存知でしたら教えてください。 2.ActiveDirectoryを作成したうえで、クライアントはドメインへの参加の有無を選ぶことができますが、参加するメリットがいまいちわかりません。小さなことで構いませんのでお聞かせください。ただし、ネットワーク内にドメインコントローラは1台しかなく、今後も他のドメインコントローラに接続する予定はありません。ですので、フォレスト等との考えは省いてください。私が知っている範囲内では、移動ユーザプロファイルの作成しか思いつきません。 よろしくお願いします。

  • wgetを使ってデータをサーバに送ったら0ファイルが作成される

    クライアントからWGETを使ってデータを送信し サーバのASP.NETで受け取りファイルを作成したら 中身のないファイルが作成されました。 何とかWGET→ASP.NETの連携でクライアントにある CSVデータをサーバにコピーしたいのですが、 詰まってしまったので、アドバイスをお願いします。 クライアント os: windowsXP WGET ------------------------------------------------------ wget --post-data="name_csv=utf8.csv" --post-file="filename=c:\\wget\utf8.csv" http://IPアドレス/printdata/catchcsv.aspx?name_csv=utf8.csv ------------------------------------------------------ サーバ os: windows server 2003 webserver: iis asp.net ---------------------------------------------------- <%@Language="VBScript" Debug="true"%> <% Dim name_csv As String Dim strCreateFile As String Dim data_csv Dim stm name_csv = Request.Form("name_csv") data_csv = Request.Form("filename") strCreateFile = "c:\inetpub\wwwroot\AA\" + name_csv stm = CreateObject("ADODB.Stream") stm.Type = 2 stm.Open stm.WriteText(data_csv) stm.SaveToFile(strCreateFile, 2) Response.end() %> ----------------------------------------------

  • VBFixedStringAttribute取得

    お世話になります。 【環境】 VisualStudio2013(ASP.NET) VB6→Visualstudio2013にコンバートをかけました。 すると、 【旧ソース】 Dim sPath As String * 260 【コンバートソース】 Dim sPath As New VB6.FixedLengthString(260) となりました。 そこでASP.NETのお作法にならい、 Dim sPath As VBFixedStringAttribute = New VBFixedStringAttribute(260) と宣言したのですが、この変数での取得・設定方法がわかりません。 String同様に扱うことはできないのでしょうか。 概念が違うのだとしたらどう違い、何を取得・設定すればよいのでしょうか。 以上、ご教示いただけると助かります。

  • ADに参加していないPCからADサーバの情報取得

    よろしくお願いします。 ADに参加していないPCとADサーバが同じネットワーク上に有ります。 このPCからADサーバへファイル共有等で接続は可能な状態です。 VBで作成したアプリをこのPCで起動した際に、ADに登録したユーザー名・パスワードを入力し情報(表示名等)を取得し、認証及び誰が使用したのかログを残したいと思います。 VBで以下のコードを試しました。 Dim path As String = "LDAP://ADサーバのIPアドレス" Dim root As New DirectoryEntry(path, "ユーザー名", "パスワード") Dim schr As New DirectorySearcher(root) schr.Filter = String.Format("(&(objectClass=user)(name={0}))", "ユーザー名") Dim sr As SearchResult = schr.FindOne() Dim userEntry = sr.GetDirectoryEntry() Dim fullName As String = userEntry.Properties("fullName").Value userEntry.Close() root.Close() や Dim path As String = "LDAP://ADサーバのIPアドレス" Dim root As New DirectoryEntry(path) root.Username ="ユーザー名" root.Password ="パスワード" Dim schr As New DirectorySearcher(root) schr.Filter = String.Format("(&(objectClass=user)(name={0}))", "ユーザー名") Dim sr As SearchResult = schr.FindOne() Dim userEntry = sr.GetDirectoryEntry() Dim fullName As String = userEntry.Properties("fullName").Value userEntry.Close() root.Close() では、情報を取得できません。 上記以外にもサーバのIPアドレスの後ろに”/DC=ドメイン名,DC=local”等を追加したり、検索して見つけたコードをいろいろ試しましたが失敗の連続です。 どのようにすればADサーバから情報を取得出来るかご存知の方が居られましたら、ご教授をお願いいたします。 お手数をお掛け致しますが、よろしくお願いいたします。

  • コンボボックスのtag情報の取得方法

    VB.NET 初心者です。 コンボボックスに隠し情報としてTagにidを設定しておき 後でボタンが押下された時にそのTagからidを取得し、次の 処理を行う様にしたいと考えております。 簡単な構成は以下のようになってます。 '構造体A Public Structure A Dim id As String Dim name As String End Structure Dim Tag(1) As A Dim Item(1) As String Tag(0) = 1 Tag(2) = 2 Item(0) = "データ1" Item(1) = "データ2" ' コンボボックスに値の設定 cboData.Items.AddRange(KeyItems) cboData.Tag = TagItems ボタンが押下された時に選択されている項目のidの取得方法を 教えて頂きたいと思います。よろしくお願い致します。

専門家に質問してみよう