【发布时间】:2016-04-18 17:07:44
【问题描述】:
我们在尝试使用 net/ldap 库启用 Active Directory 用户 (windows server 2012 r2) 时遇到问题。
设置
首先,我们通过这个方法创建一个用户:
def create_user(attrs)
dn = "cn=#{attrs[:cn]},cn=Users,#{@base}"
cn = attrs[:cn]
pass = ascii_convert(attrs[:pwd])
updated_attrs = { cn: cn,
objectclass: ['user'],
samaccountname: cn,
userprincipalname: "#{attrs[:cn]}@#{@domain}",
unicodepwd: pass
}
@connection.add(dn: dn, attributes: updated_attrs)
result = @connection.get_operation_result
raise LdapError.new("Create AD user error: #{result}") if result.code != 0
end
这会创建用户,并默认将其userAccountControl 属性设置为546(这是我们想要的),当在活动目录中检查时显示为:
0x222 (ACCOUNTDISABLE|PASSWD_NOTREQD|NORMAL_ACCOUNT).
问题
稍后我们要启用该用户,因此我们调用:
def enable_user!(dn, cn)
u = search_query(find_user(cn)).try(:first)
if u
@connection.replace_attribute(dn, :useraccountcontrol, '512')
else
false
end
end
但是,如果我打印 @connection.get_operation_result 我会得到:
<OpenStruct code=53, error_message="0000052D: SvcErr: DSID-031A12D2, problem 5003 (WILL_NOT_PERFORM), data 0\n\u0000", matched_dn="", message="Unwilling to perform">
使用这种方法,我们希望userAccountControl 等于512,相当于0x200 (NORMAL_ACCOUNT)。
我尝试过的事情
注意:连接通过 SSL (LDAPS),并绑定到管理员 AD 帐户。
- this answer
- 在
enable_user!方法中使用#modify而不是#replace_attribute。 - 传递十六进制值而不是整数表示。
- 使用 apache directory studio 执行相同的修改。
我注意到一件有趣的事情,我可以将useraccountcontrol 修改为514,即:
0x202 (ACCOUNTDISABLE|NORMAL_ACCOUNT)
所以,看来我可以修改此属性,只要它保持禁用状态,只要我尝试更改为启用,就会看到错误。
【问题讨论】:
标签: ruby active-directory windows-server-2012-r2 netldap