【发布时间】:2011-07-18 00:02:12
【问题描述】:
我想要做的是启用/禁用 Active Directory 用户帐户。 在 Active Directory 中,该信息作为 HEX 值存储在名为 userAccessControl 的属性中的位寄存器中。在我们的 Windows 2008 Server R1 中,对于具有用户密码永不过期选项的启用帐户,这是 0x10200,对于具有用户密码永不过期选项的禁用帐户,这是 0x10202。
现在只需触摸启用/禁用信息的标志,我编写了以下方法...
def set_account_active_flag(activate)
success = false
get_aduser if @aduser.nil?
puts "#####################################"
unless @uac.nil? || @uac.blank?
tmpuac = @uac.to_i
tmpuac = activate ? tmpuac & 2 == 0 ? tmpuac | 2
: tmpuac
: tmpuac & 2 == 2 ? tmpuac ^ 2
: tmpuac
ldap_con = self.class.initialize_ldap_con
# success = ldap_con.replace_attribute ldap_encode(@dn), :userAccountControl, tmpuac
success = ldap_con.replace_attribute ldap_encode(@dn), :userAccountControl, ldap_encode(tmpuac.to_s)
else
puts ">>>>>\nuserAccessControl-Register is not available\n<<<<<"
end
rescue Net::LDAP::LdapError => e
puts "NET::LDAP::LdapError\n#{e}"
ensure
puts "-------------------------------------"
puts "LDAP operation failed (#{ldap_con.get_operation_result.code}):"
puts "-------------------------------------"
puts ldap_con.get_operation_result.message
puts "#####################################"
return success
end
好的...内部结构:
- get_aduser 只是一种加载一组广告属性(['dn','userPrincipalName', 'givenname','sn', 'mail', 'memberof', 'userAccountControl'])并存储它们的方法进入尝试登录的用户的实例变量(@dn、@user_principal_name、@first_name、@last_name、@groups、@uac)
这部分就像一个魅力。 @uac(作为字符串返回),我可以转换为整数
x = @uac.to_i
然后将其用作位寄存器来检查和修改标志
x & 2 # => 0 if unset, => 1 if set
x |= 2 # sets the flag
x ^= 2 # unsets the flag
我认为这项工作就像将值写回我的 Active Directory 一样简单。
我的问题来了: 到目前为止,我尝试将新的 userAccountControl 值写回为 integer 和 string,但两次尝试都失败了,尽管在这两种情况下的 operation-result-message 都是 {Code: 0、消息:'成功'}
尝试将新的 userAccessControl 值写回 integer 引发 NET::LDAP::LdapError
#####################################
NET::LDAP::LdapError
response missing or invalid
-------------------------------------
LDAP operation failed (0):
-------------------------------------
Success
#####################################
=> false
尝试将新的 userAccessControl 值写回 string 不会引发错误,但仍会导致错误
#####################################
-------------------------------------
LDAP operation failed (0):
-------------------------------------
Success
#####################################
=> false
所以我想知道,“我做错了什么?”
有人知道如何将 userAccessControl 写回 ActiveDirectory 吗?
我是否必须使用类似于写回用户密码的笨拙算法来转换新的 userAccessControl-Value?
非常感谢您提供任何有用的提示甚至解决方案。
最好的问候,
英戈甘宾
【问题讨论】:
标签: ruby-on-rails ruby active-directory ldap