ADSIを使用してOpenLDAPにパスワードを同期する

VBScript で書かれていますので、拡張子を vbs として保存してください。 

このソースの解説はこちら。
【IDM】Active Directory から OpenLDAP への パスワードの同期 その2 ~ ADSI でパスワードを同期する

------------------------------- 

On Error Resume Next

strDomain = "dc=example64,dc=jp"
strUserName  = "testuser01"
strPassword  = "ABC123@"
strLdapServer  = "fedora01.example-fedora.jp"
strLdapUser    = "uid=" & strUserName & ",ou=People,dc=example-fedora,dc=jp"
strManagerDN       = "cn=Manager,dc=example-fedora,dc=jp"
strManagerPassword = "password"

'ユーザーを検索
Set objConnection = CreateObject("ADODB.Connection")
objConnection.Open "Provider=ADsDSOObject;"
Set objCommand = CreateObject("ADODB.Command")
objCommand.ActiveConnection = objConnection
objCommand.CommandText = _
        "<LDAP://" & strDomain & ">;" & _
        "(&(objectCategory=person)(objectClass=user)" & _
        "(sAMAccountName=" & strUserName & "));" & _
        "DistinguishedName,sAMAccountName,unixUserPassword;" & _
        "subtree"
Set objRecordSet = objCommand.Execute

'ユーザーのパスワード変更
Do Until objRecordset.EOF
 strDN = objRecordset.Fields("DistinguishedName")
    objRecordset.movenext
Loop
Set objUser = GetObject("LDAP://" & strDN)
objUser.SetPassword strPassword
objUser.SetInfo

'AD内でunixUserPassword が同期されるまで待つ
Wscript.Sleep 3000

'変更後のパスワードを取得
Set objRecordSet2 = objCommand.Execute

Do Until objRecordset2.EOF
 arrUNIXUSERPASSWORD = objRecordset2.Fields("unixUserPassword")
 For i = 1 To LenB(arrUNIXUSERPASSWORD(0))
     strA = MidB(arrUNIXUSERPASSWORD(0), i, 1)
     strB = AscB(strA)
     strUnixUserPassword = strUnixUserPassword & Chr(strB)
 Next
 objRecordset2.movenext
Loop

'OpenLDAPに接続
set objLDAP = GetObject("LDAP:")
set objUser = objLDAP.OpenDSObject("LDAP://" & strLdapServer & "/" & strLdapUser, _
                                   strManagerDN, _
                                   strManagerPassword, _
                                   0)

'パスワードを変更
objUser.Put "userPassword", "{CRYPT}" & strUnixUserPassword
objUser.SetInfo

'パスワードが変更されたかどうかをチェック
set objChkUser = objLDAP.OpenDSObject("LDAP://" & strLdapServer, _
                                   strLdapUser, _
                                   strPassword, _
                                   0)

If Err.Number = 0 then
 Wscript.Echo "パスワードは正しく同期されました(" & strLdapUser & ")"
else
 Wscript.Echo "パスワードの同期でエラーが発生しました(" & strLdapUser & ")"
End If