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」は変更されません。
まず、ループして処理(パスワード変更)することは出来ないのでしょうか。
理由はそれぞれのユーザーに対し、異なるパスワードを設定するためです。
ループして処理が可能であるならば、なぜ止まるのか原因を判明することが出来ません。
原因究明と解決をお願いします。
「止まります」とは?
文字通り、そこでハングアップしたように処理が止まってしまうのですか?
それとも、何かエラーが出て落ちるとか?
シャノンさん、こんにちは
例外をスローして止まります。
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:
これで何かわかりますでしょうか。
よろしくお願いします。
自己解決しました。
変更前
entry = New DirectoryEntry("LDAP://" & ldap, ADMIN_NAME, ADMIN_PASSWORD, 0)
変更後
entry = New DirectoryEntry("LDAP://" & ldap, ADMIN_NAME, ADMIN_PASSWORD)
以上