Я хочу включить / отключить учетную запись Active Directory.
В Active Directory эта информация хранится в битовом регистре в атрибуте с именем userAccessControl как HEX-значение. В нашей 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', 'данное имя', '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 , но обе попытки заканчиваются неудачей, хотя сообщение-результат-операция в обоих случаях равно {Code: 0, Сообщение: 'Успех'}
Попытка записать новое значение userAccessControl в виде целое число повышает значение NET :: LDAP :: LdapError
#####################################
NET::LDAP::LdapError
response missing or invalid
-------------------------------------
LDAP operation failed (0):
-------------------------------------
Success
#####################################
=> false
Попытка записать новое значение userAccessControl в виде строка не вызывает ошибку, но все равно приводит к ложному
#####################################
-------------------------------------
LDAP operation failed (0):
-------------------------------------
Success
#####################################
=> false
Так что мне интересно: «Что я делаю не так?»
Кто-нибудь знает, как записать userAccessControl в ActiveDirectory?
Должен ли я преобразовывать новое значение userAccessControl-Value, используя что-то вроде этого неуклюжего алгоритма, необходимого для записи пароля пользователя?
Заранее большое спасибо за любой полезный совет или даже решение.
С наилучшими пожеланиями,
Инго Гамбин