Java “我如何解决?”;“你不会”表演“吗;尝试使用未绑定的LDAP SDK更改scala中的密码时MS AD应答?
我正在与Active Directory搏斗,试图让它允许我更改密码。我已经找到了大量有用的信息,但我仍然得到一个持续的错误 一些代码:Java “我如何解决?”;“你不会”表演“吗;尝试使用未绑定的LDAP SDK更改scala中的密码时MS AD应答?,java,scala,active-directory,ldap,unboundid-ldap-sdk,Java,Scala,Active Directory,Ldap,Unboundid Ldap Sdk,我正在与Active Directory搏斗,试图让它允许我更改密码。我已经找到了大量有用的信息,但我仍然得到一个持续的错误 一些代码: import com.unboundid.ldap.sdk._ import com.unboundid.util.ssl._ def main(args: Array[String]) : Unit = { var sslUtil = new SSLUtil( new TrustAllTrustManager() ) var con = new LDA
import com.unboundid.ldap.sdk._
import com.unboundid.util.ssl._
def main(args: Array[String]) : Unit = {
var sslUtil = new SSLUtil( new TrustAllTrustManager() )
var con = new LDAPConnection(sslUtil.createSSLSocketFactory())
con.connect("ldap.example.net", 636)
con.bind("ldapadmin", "adminpasswd")
val newPass = "Jfi8ZH8#k".getBytes("UTF-16LE");
val modRequest = new ModifyRequest("dn: cn=Tester Dude,ou=Lab,ou=Org,ou=Provider,DC=example,DC=net",
"changetype: modify",
"replace: unicodePwd",
"unicodePwd: " + '"' + newPass + '"')
println("\nGoing to try to set password to " + newPass + " with: " + modRequest.toString())
try {
con.modify(modRequest)
} catch {
case lde:LDAPException => println("failed LDAPException: " + lde.toString())
}
}
因此,我将此作为运行时错误:
将尝试将密码设置为[B@6dd1627ewith:ModifyRequest(dn='cn=Tester Dude,ou=Lab,ou=Org,ou=Provider,DC=example,DC=net',mods={REPLACE unicodewd})
失败的LDAPException:LDAPException(结果代码=53(不愿意执行),错误消息='0000001F:SvcErr:DSID-031A11E5,问题5003(将不执行),数据0
,diagnosticMessage='0000001F:SvcErr:DSID-031A11E5,问题5003(将不执行),数据0
")
因此,在我所知道的可能导致此错误的因素中:
“Unicodewd:+”“'+newPass+'”
绕过了您的编码(因为String
必须再次转换为字节,我打赌它没有使用正确的编码)
尝试使用接受修改
对象的MofyRequest版本,然后使用将属性值作为字节的构造函数
就像在您链接到的博客文章中一样…结果表明,它必须经过UTF-16LE编码,然后转换为base64
val newPass = javax.xml.bind.DatatypeConverter.printBase64Binary(('"'+"Jfi8ZH8#k"+'"').getBytes("UTF-16LE"))
成功了。连接不够安全
引自:
要修改此属性,客户端必须与服务器建立128位安全套接字层(SSL)连接
因此,即使其他一切看起来都正常,如果连接被认为不安全,您仍然可能会遇到问题5003(不会执行)SvcErr:DSID-03190F4C
缺乏管理权限
如果您尝试在没有足够权限的情况下执行替换
,则修改请求可能会失败
dn: CN=johndoe,OU=Users,DC=example,DC=com
changetype: modify
replace: unicodePwd
unicodePwd:: base64(utf16le(quoted(password)))
-
在这种情况下,您将得到一个SecErr:DSID-03150E47,问题4003(违反访问权限)
。如果您尝试使用非特权帐户绑定
,则会发生这种情况
密码历史记录
一些管理员希望有一个较长的密码历史记录(例如,保存的最后24个密码)。如果您使用的是历史记录中已有的旧密码,则会得到一个约束\u ATT\u TYPE
普通用户
删除
-添加
组合我也偶然发现了这个问题。我正在使用C#的
Novell.Directory.Ldap.NETStandard
library。我的问题是需要引用密码。这段代码对我有效:
var passwordBytes=Encoding.Unicode.GetBytes($“\”{newPassword}\”);
Modify(userDn,newldapmodify(ldapmodify.Replace,newldapattribute(“unicodePwd”,passwordBytes));
结果是它必须经过UTF-16LE编码,然后转换成base64.val newPass=javax.xml.bind.DatatypeConverter.printBase64Binary(“'”+“Jfi8ZH8”#k“+”)。getBytes(“UTF-16LE”)完成了这项工作。如果可以,将其作为答案发布。
dn: CN=johndoe,OU=Users,DC=example,DC=com
changetype: modify
replace: unicodePwd
unicodePwd:: base64(utf16le(quoted(password)))
-
dn: CN=johndoe,OU=Users,DC=example,DC=com
changetype: modify
delete: unicodePwd
unicodePwd:: base64(utf16le(quoted(old password)))
-
add: unicodePwd
unicodePwd:: base64(utf16le(quoted(new password)))
-