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

このQ&Aのポイント
  • IIS7.0上でASP.netでAD情報を取得する方法を教えてください。
  • WindowsServer2008(IIS7.0)上でASP.netを使用してAD情報を取得するとエラーが発生します。
  • AD情報を取得するためにはどのような設定が必要ですか?具体的な手順を教えてください。
回答を見る
  • ベストアンサー

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日くらい詰まっているので、ヒントだけでも教えていただけると助かります。 よろしくお願いいたします。

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

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

ただのユーザで偽装しているので、AD内オブジェクトの検索ができない(権限がない)のではないかと。 アプリケーションプールアカウントにそれなりの権限を付与し、偽装をやめて、操作者のユーザID 自体は My.User.Name で取得するか、 アプリケーションプールアカウントはデフォルトで、ADの検索する時だけコーディングで偽装するかでいけると思います。

Kissy_ritsu
質問者

お礼

早速の回答ありがとうございます! 別件でトラブルがあって、回答遅くなり、申し訳ありません。 下記手順で出来ました! 1.アプリケーションプールのIDがNetworkServiceだったので、ドメインのユーザーに変更。 2.ASP.NET偽装を無効。 3.操作者のユーザIDはMy.User.Nameで取得(¥を検索してユーザIDだけ取り出し) AD内オブジェクトの検索をするときに、アプリケーションプールのIDを使わず、 Windows認証で取得したユーザー名(My.User.Name)で見てくれればいいのに...と思いましたが パスワードの情報がないからNG...という認識は合っているのでしょうか?? 「コーディングで偽装」をまだ試していないのですが http://support.microsoft.com/kb/306158/ja#3 ↑このあたりを参考にもう少しがんばってみようと思います とりあえず教えていただいた一つの方法で実現できたので大変助かりました! ありがとうございました<(_ _)>

関連するQ&A

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

  • 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

  • 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サーバから情報を取得出来るかご存知の方が居られましたら、ご教授をお願いいたします。 お手数をお掛け致しますが、よろしくお願いいたします。

  • ASP.NET(C#)で開発中のプログラムでAD認証したいのですが、

    ASP.NET(C#)で開発中のプログラムでAD認証したいのですが、 ASP.NET(C#)で普通のユーザIDとパスワードを入れてDBに問い合わせ一致したら次画面へ遷移という、ごく普通のログイン画面を作りましたが、これにAD認証を絡めたいと考えています。 クライアントPCには2種類ありまして、ドメインに参加しているPCと参加していないPCが有りまして、ドメインに参加していないPCは通常のログイン画面を表示し認証を行いますが、ドメイン参加のPCからは、まず、WEB画面でログイン画面のURLをたたいたら画面を表示せずにAD認証を自動で行い、認証が通ればログイン画面を出さずに次画面へ遷移したい考えです。 この、AD認証を裏で行い認証が取れたらログイン画面を飛ばして次画面へ自動的に遷移する画面を作りたいのですが、サンプル等があればURL等をご教示願えますと助かります。 色々見て回りました。画面からログインID、パスワードを入力してAD認証することまではプログラムでテストして実現可能なことは確認できていますが、Windowsにログインできているので、あらためて業務の画面でログインをしたくないという思いから、ログイン無しで業務の画面に遷移したいと思いました。 宜しくお願い致します。

  • ASP.NETのためのIISの設定

    社内でASP.NETのWEBシステムを開発しようと考えております。そこで、IISの設定で匿名アクセスについて教えていただきたいのですが。 ASP.NETに関わらず、一般的にWEBを公開するときに匿名アクセスはしないものなのでしょうか。システムの中で認証をしようと思っており、トップページは誰でも閲覧可能にしようとしております。 匿名アクセスの編集の中で、匿名ユーザ名をマシンのadministratorにすれば、アクセスできるのですが、それ以外のユーザの設定がわかりません。WEBアクセス用のユーザはどのようにして設定すればいいのでしょうか。 よろしくお願いします。

  • ASP.net

    ファイルまたはアセンブリ 'System.Web.Extensions, Version=2.0.50727, Culture=neutral, PublicKeyToken=31bf3856ad364e35'、またはその依存関係の 1 つが読み込めませんでした。指定されたファイルが見つかりません。 ASP.net環境でWEBを公開しようと思っているのですが、 上記のエラーが出て前に進みません。 上記のエラーのみで、どこらへんが悪いか大体でいいんで わかる人いますかね? .NETのバージョンなのか、IISの設定なのか。 ざっくりとした質問で申し訳ないのですが、よろしくお願いします。

  • IIS6 ASP Oracle接続

    環境 Windows Server 2003 (IIS6) ASP.NET 2 Oracle10g Session("OraSession") = Server.CreateObject("OracleInProcServer.XOraSession") ここでエラーが発生しています。 エラー内容 CLSID {3893B4A0-FFD8-101A-ADF2-04021C007002} を含むコンポーネントの COM クラス ファクトリを取得中に、次のエラーが発生しました: 80070005。 説明: 現在の Web 要求を実行中に、ハンドルされていない例外が発生しました。エラーに関する詳細および例外の発生場所については、スタック トレースを参照してください。 例外の詳細: System.UnauthorizedAccessException: CLSID {3893B4A0-FFD8-101A-ADF2-04021C007002} を含むコンポーネントの COM クラス ファクトリを取得中に、次のエラーが発生しました: 80070005。 この ASP.NET は、要求されたリソースへのアクセスを許可されていません。要求された ASP.NET へのリソースへアクセスを許可するかどうかを検討してください。ASP.NET プロセスには、アプリケーションに偽装が実行されていない場合は、通常、インターネット インフォメーション サーバー 5 では {コンピュータ名}\ASPNET、インターネット インフォメーション サーバー 6 ではネットワーク サービスが使用されます。<identity impersonate="true"/> 経由でアプリケーションに偽装が実行されている場合、ユーザーは、通常 IUSR_MACHINENAME に設定された匿名ユーザーか、または認証された要求ユーザーになります。 色々と試してみましたが、だめです。 何が不足しているのでしょうか?

  • ASP.net1.0をWIN7のIISで動かす

    Windows7のIIS内にASP.net1.0で作成されたソリューションを導入し IISの設定を「ターゲットFramework等1.1等」可能な限り昔のシステムが稼働出来るよう設定し 無事稼働する事が出来るようになりました・・・・が 操作の手を止め40分程度「放置」して置くと「画像添付」にある通りのエラーが発生し困っています。 手を止めて放置する迄は、安定し正常に稼働するのでカエッテ謎が深まります。 ちなみにセッションの有効時間を当初疑い23時間にしてあります。 どうぞよろしくお願いします。

  • ASP.NETの質問なのですが、文字列の引き算は可能でしょうか?

    ASP.NETの質問なのですが、文字列の引き算は可能でしょうか? dim a as string = "abcde" dim b as string = "cde" dim c as string c = a- b このようなコードでcの答えをabとして表示できるでしょうか? ご存知の方がいらっしゃりましたらアドバイスお願いいたします。

  • asp.netでのセッションを使用したログイン

    asp.netでmssql server を利用してログイン機能を実装しました。 以下のようなコードでmssqlに保存してあるIDとパスが一致すれば 以降の画面ではセッションにID、パスが保存され page loadでセッションにID、パスがなかればページがすすんでいけないような設定にしています。 機能は問題なく動作しているのですがこのような仕様はセキュリティ上問題はないのでしょうか。 商用サイトではないのですが、ある程度広域に向けたサイトを構築しようと考えておりまして、セキュリティ向上のため、工夫できるようなことがあればご意見いただきたいです。 よろしくお願いいたします。 ************************************************************** ログインページ ************************************************************** Dim staffid As Integer Dim staffname As String Dim adminflag As Boolean Protected Sub btnLogon_Click(ByVal sender As Object, ByVal e As System.EventArgs) 'ユーザーIDの入力チェック If txtUserID.Text = "" Then lblErr.Text = "ユーザーIDを入力してください。" Return End If 'パスワードの入力チェック If txtpassword.Text = "" Then lblErr.Text = "パスワードを入力してください。" Return End If 'ユーザーとパスワードの検証 If Not CheckUserPassword(txtUserID.Text, txtpassword.Text) Then lblErr.Text = "ユーザーIDまたはパスワードが違います。" Return End If 'セッション変数へ値をセットする Session("StaffID") = staffid Session("StaffName") = staffname Session("AdminFlag") = adminflag End Sub Private Function CheckUserPassword(ByVal userid As String, ByVal password As String) As Boolean Dim ret As Boolean Dim strSQL As String strSQL = "SELECT staffID, staff_name, admin_flag , permission FROM tbl_staff " & _ "WHERE userID = '" & userid.Replace("'", "''") & _ "' AND password = '" & password.Replace("'", "''") & "'" '接続文字列を取得する Dim cnStr As String = System.Configuration.ConfigurationManager.ConnectionStrings("hogehogeConnectionString").ConnectionString() 'コネクションを定義する Using connection As New SqlConnection(cnStr) 'コマンドを定義する Dim command As New SqlCommand(strSQL, connection) 'コネクションを開く connection.Open() Try 'コマンドからデータリーダーを定義する Dim dr As SqlDataReader = command.ExecuteReader 'データリーダーから結果を読み込む If dr.Read Then '対象データが存在する場合 '正しいユーザーIDとパスワードが指定されたので、 'データリーダーから読み出したデータをメンバ変数にセットする staffid = dr("staffID") staffname = dr("staff_name") adminflag = dr("admin_flag") permission = dr("permission") ret = True Else '対象データが存在しない場合 '不正なユーザーIDまたはパスワードが指定された ret = False End If Catch ex As Exception '例外処理(SQLエラーなど) ret = False End Try 'コネクションを閉じる connection.Close() End Using '結果を返して終了する Return ret End Function ************************************************************** ログイン後に行くページでの設定 ************************************************************** Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) '[ユーザーID]ボックスにフォーカスをセットする If Session("StaffID") Is Nothing Then Response.Redirect("~/top.aspx") ElseIf Not Session("AdminFlag") = True Then Response.Redirect("~/top_normal.aspx") End If End Sub

専門家に質問してみよう