ActiveDirectoryに登録されている全てのユーザーのパスワードを変更するには?

解決


VB2008ユーザー  2008-05-22 07:55:04  No: 144774

ADに登録されている全てのユーザーのパスワードを強制的に変更したいのです。

開発環境は
  開発機:WindowsXP Visual Studio 2008
  開発言語:Visual Basic
  LDAPサーバー:Windows Server 2003

変更したいユーザーは
  OU:testOU
  CN:testuser1,testuser2,testuser3,testuser4

ソース
Imports System.DirectoryServices

Public Class START

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
  Dim Passwd As String
  Dim ADMIN_NAME As String = "Admin"
  Dim ADMIN_PASSWORD As String = "AdminPass"

  For i = 0 To 3
    testuser = "testuser" & i

    'パスワードは10桁のランダム生成
    Passwd = "ランダム生成"

    Dim entry As New DirectoryEntry
    Dim ldap As String = "LDAPサーバー/CN=" & testuser & ",OU=testOU,DC=test,DC=com"
    entry = New DirectoryEntry("LDAP://" & ldap, ADMIN_NAME, ADMIN_PASSWORD, 0)
    entry.RefreshCache()

    'ここでパスワード変更
    entry.Invoke("SetPassword", New Object() {Passwd})  '2回目のループで処理が止まる
    entry.CommitChanges()

    entry.Close()
  Next
End Sub
End Class

問題は、1回目の処理はパスワードが変更されます。つまり「testuser1」は変更されます。
しかし、2回目の処理に入るとパスワードを変更するInvokeで処理が止まります。つまり「testuser2,testuser3,testuser4」は変更されません。

まず、ループして処理(パスワード変更)することは出来ないのでしょうか。
理由はそれぞれのユーザーに対し、異なるパスワードを設定するためです。

ループして処理が可能であるならば、なぜ止まるのか原因を判明することが出来ません。

原因究明と解決をお願いします。


シャノン  2008-05-22 18:56:30  No: 144775

「止まります」とは?
文字通り、そこでハングアップしたように処理が止まってしまうのですか?
それとも、何かエラーが出て落ちるとか?


VB2008ユーザー  2008-05-23 01:00:56  No: 144776

シャノンさん、こんにちは

例外をスローして止まります。

TragetInVocationExceptionはハンドルされませんでした。
呼び出しのターゲットが例外をスローしました。

トラブルシューティングのヒントには
この例外に関する一般的なヘルプを参照します。
InnerException:例外のErrorCodeプロパティを調べて、COMオブジェクトによって返されたHRESULTを判断します。
内部例外に関する一般的なヘルプを参照します。

下記は例外の詳細の一部分です。
  System.Reflection.TargetInvocationException はハンドルされませんでした。
  Message="呼び出しのターゲットが例外をスローしました。"
  Source="System.DirectoryServices"
  StackTrace:
  InnerException: System.Runtime.InteropServices.COMException
       ErrorCode=-2147463160
       Message="1 個以上の入力パラメータが無効です "
       Source="Active Directory"
       InnerException: 

これで何かわかりますでしょうか。
よろしくお願いします。


VB2008ユーザー  2008-05-24 06:25:18  No: 144777

自己解決しました。

変更前
entry = New DirectoryEntry("LDAP://" & ldap, ADMIN_NAME, ADMIN_PASSWORD, 0)

変更後
entry = New DirectoryEntry("LDAP://" & ldap, ADMIN_NAME, ADMIN_PASSWORD)

以上


※返信する前に利用規約をご確認ください。




  


  このエントリーをはてなブックマークに追加