ActiveDirectoryから値を取得する方法とエラーの対処法

このQ&Aのポイント
  • VB2005にて、ActiveDirectoryから値を取得するアプリを作成しています。WindowsXPでは問題なく動作するのですが、Windows7だと「ローカルエラーが発生しました」というエラーメッセージが返って来ます。OSの設定を変えれば解決するのか、プログラムの書き方を変えるのか分からないので、質問させていただきます。プログラムのコードは、LDAP経由のActiveDirectoryへの接続と検索を行っています。
  • エラーメッセージは、Windows7上でのActiveDirectoryへの接続に問題があることを示しています。原因としては、Windows7のセキュリティ設定が異なるため、接続に必要な権限やプログラムの実行方法が異なる可能性があります。解決策としては、セキュリティ設定を変更するか、プログラムを修正することが考えられます。
  • セキュリティ設定を変更する場合は、ActiveDirectoryへの接続に必要な権限を付与する必要があります。具体的には、Windows7のグループポリシーエディタを使用して、適切な権限を設定します。また、プログラムを修正する場合は、Windows7でのActiveDirectoryへの接続方法や検索方法を調査し、プログラムを修正する必要があります。
回答を見る
  • ベストアンサー

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

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

  • ベストアンサー
  • todo36
  • ベストアンサー率58% (728/1234)
回答No.1

EXEを右クリック→管理者として実行 で動きませんか? 常に管理者として実行するならexeのプロパティで「管理者としてこのプログラムを実行する」 あるいはmanifestファイルを同胞 http://www.atmarkit.co.jp/fdotnet/chushin/introwinform_05/introwinform_05_02.html

madamadahiyoko
質問者

お礼

Dim entry As New System.DirectoryServices.DirectoryEntry(serverPath, userName, password, DirectoryServices.AuthenticationTypes.FastBind) と後ろにDirectoryServices.AuthenticationTypes.FastBindをつけたら上手くいきました。 ご回答ありがとうございました。

madamadahiyoko
質問者

補足

ご回答いただき有難うございます。 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です。 考え違い等ありましたら、ご指摘よろしくお願いいたします。

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

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

  • VBAでのORの使い方

    以下のようなVBAがあります。指定したフォルダーに保存されているエクセルのファイル名を取得するものです。 ここでやりたいのは、AとJPから始まるファイルを取得したいのですがうまくいきません。これですのコンパイルエラーが出ます。 どう変更すべきかご教示願います。 Sub ファイル名取得() Const SEARCH_DIR As String = "\\SOGKF01.JP.TakataCorp.com\XXXXXXXX\YYYYY" Const SEARCH_FILE As String = "AS*.xlsm" Or Const SEARCH_FILE As String = "JP*.xlsm" Dim tmpFile As String Dim strCmd As String Dim buf() As Byte Dim FileList() As String Dim myArray() As String Dim cnt As Long, pt As Long, i As Long 続く

  • 表記方法

    ACCESSVBAでの質問です。 入力項目を10箇所用意して、名前を「Search1」~「Search10」と付けています。 このボックスのNULLチェックをループを使い行いたいのですが、以下の書き方だとsearchには文字で"search1"と入ってしまい、ボックスの値を取ることが出来ません。 search1~10の値を取得するにはどのように書けばいいのでしょうか。 よろしくお願い致します。 Do While counter <= 10 Dim search As String search = "search" & counter If Check_Numeric(search) = False Then error = "NULL" End If counter = counter + 1 Loop

  • サブフォームに変数を代入し、RecordSourceの値を取得したい

    サブフォームに変数を代入し、RecordSourceの値を取得したいのですがうまくいきません。 Sub test1() Dim サブフォーム As String Dim フォーム As String フォーム= "土台" サブフォーム = "フォーム1" MsgBox Form_フォーム1.RecordSource End Sub ******************************************************************* Sub test2() Dim サブフォーム As String Dim フォーム As String フォーム= "土台" サブフォーム = "フォーム1" MsgBox Form_フォーム1.RecordSource MsgBox Forms(フォーム).Controls(サブフォーム).RecordSource End Sub オブジェクトは、このプロパティまたはメソッドをサポートしていません。(Error 438) ******************************************************************* Sub test3() Dim サブフォーム As String Dim フォーム As String フォーム = "土台" サブフォーム = "フォーム1" MsgBox Forms(サブフォーム).RecordSource End Sub 実行時エラー'2450' マクロの式またはVisual Basic コート゛で参照されている 'フォーム名'フォームが見つかりません。 ******************************************************************* test1~3のうち test1のみはうまくいくのですが 変数を代入したいです。 ヘルフ゜のには Forms![受注]![受注サブフォーム].Formとなってますが これじゃ変数を代入できないですよね。 どうすればサブフォームに変数を代入しつつ、RecordSourceの値を取得できるのでしょうか? よろしくお願いします。

  • Excelのセルの値を取得

    VB2005Expressにて開発しています。 Excelのセルの値を取得するにはどうしたらいいのでしょうか。 下記でExcelは起動出来るのですが、値の取得ができません。 また、Rangeで範囲を指定して一括取得して、1データずつ配列化した 変数にセットすることは可能なのでしょうか。 Dim xlApp As New Excel.Application Dim xlBooks As Excel.Workbooks = xlApp.Workbooks Dim xlFilePath As String = "C:\excel_test.xls" Dim xlBook As Excel.Workbook = xlBooks.Open(xlFilePath) Dim xlSheets As Excel.Sheets = xlBook.Worksheets Dim xlSheet As Excel.Worksheet = xlSheets.Item(1) xlApp.Visible = True どなたかご存知の方がいらっしゃいましたら教えて下さい。 よろしくお願いします。

  • vba ハイパーリンクの値をテキストで取得したい

    Dim FolderName As String FolderName = rst![格納フォルダパス] ハイパーリンクの 「#」を抜いたテキストの値で取得したいのですが、 どうやったらいいですか?

  • Excelで用紙番号取得

    Excel2000 VBAで用紙番号を取得しようと考えています。 調べてみたのですが、APIのDeviceCapabilities()が使用できそうな感じというのは解ったのですが、 バッファというのがいまいち解らず使えません。 出力バッファやデバイスデータのバッファとは何を指してるのでしょうか? また、以下コードをExcel2000で実行するとエラーになります。 やはりバッファの使い方がおかしいのでしょうか? アドバイスよろしくお願いいたします。 Sub Numbertest() Dim strDeviceName As String Dim strDevicePort As String Dim lngPaperCount As Long Dim bytPaper() As Byte Dim strPaperName As String * 64 Dim lngCounter As Long Dim aintNubytPaper() As Integer Dim lngRet As Long GetPrinterNameAndPort sDeviceName, sDevicePort ' バッファに必要なサイズを取得 lngPaperCount = DeviceCapabilities(strDeviceName, strDevicePort, DC_PAPERNAMES, ByVal vbNullString, ByVal vbNullString) ' バッファ確保 ReDim bytPaper(64 - 1, lngPaperCount - 1) ReDim aintNubytPaper(1 To lngPaperCount) '用紙名を取得 DeviceCapabilities strDeviceName, strDevicePort, DC_PAPERNAMES, bytPaper(0, 0), ByVal vbNullString 'paper numbers を取得 lngRet = DeviceCapabilities(strDeviceName, strDevicePort, DC_PAPERS, aintNubytPaper(1), ByVal vbNullString) '用紙名を列挙 For lngCounter = 0 To lngPaperCount - 1 ' 用紙名コピー MoveMemory ByVal strPaperName, bytPaper(0, lngCounter), 64 ' 用紙名追加 MsgBox aintNubytPaper(lngCounter + 1) MsgBox Left(strPaperName, InStr(strPaperName, vbNullChar) - 1) Next lngCounter End Sub

  • Excel2007 VBA シートとユーザーフォームの値のやり取り

    1.シートからユーザーフォームを呼び出す。 2.シートからユーザーフォームへ値を渡す。 3.ユーザーフォームからシートへ値を返す。 この一連の処理を行いたいのですが。 TestSheet----------- Dim oForm As TestForm Set oForm = New TestForm oForm.SetData("渡す値") Call oForm.Show Dim Result As String 'Result = oForm.GetResult Set、GetメソッドはTestForm内に存在します。 しかし、ユーザーフォームでUnloadを行った時点でoFormが破棄されるらしく、Result = oForm.GetResultでエラーとなります。 変数とSet、Getメソッドを標準モジュールに記述すれば解決するのですが、スコープ範囲がこのシートとユーザコントロールに限定できないのでなるべく記述したくありません。 他にユーザフォームから値を受け取る方法はありませんでしょうか。