2015-09-10 2 views
0

Я подключаюсь к контроллеру домена Active Directory 2008 с использованием perl Net :: LDAPS и пытается установить «Пользователь должен сменить пароль на следующий вход в систему ", и он не работает.MS AD2008 - Невозможно принудительно сменить пароль при следующем входе в систему с использованием Perl Net :: LDAPS и атрибута userAccountControl

Я могу создавать, изменять, удалять и перемещать разные объекты, но я не могу получить эту настройку изменения пароля!

Это то, что я пытаюсь сделать, и это не работает:

Примечание: Я использую самостоятельно написанный класс обертку для Net :: LDAPS и ниже код сводились к скелету, что я я пытаюсь сделать.

 
# Binding to LDAP Directory: 
$self->{LDAP_INSTANCE} = Net::LDAPS->new($host); 
$self->{LDAP_INSTANCE}->bind(dn=>$dn, password=>$password, version=>3) 

my $rc =$self->{LDAP_INSTANCE}->modify(
    $DN_OF_USER_ACCOUNT, 
    [ replace => [userAccountControl => 0x00800000] ] 
); 
print $rc->error; # Results in an empty string/No error 

# Note: I have also tried: hex(800000) instead of 0x00800000 as well. 

Я связывание с учетной записью администратора домена, и я проверил, что $ DN_OF_USER_ACCOUNT правильно.

ответ

0

Атрибут userAccountControl - это битовое поле со многими настройками. Изменение значения для пользователя 0x00800000 было бы весьма вредным, так как оно удалило бы значение по умолчанию 0x200 ADS_UF_NORMAL_ACCOUNT.

documentation for 0x00800000 является:

0x00800000
ADS_UF_PASSWORD_EXPIRED
пароль пользователя истек. Этот флаг создается системой с использованием данных из атрибута Pwd-Last-Set и политики домена.

Если мы посмотрим на pwdLastSet's documentation, мы видим:

дата и время, что пароль для этой учетной записи последнего изменения. [...] Если для этого значения установлено значение 0, а атрибут User-Account-Control не содержит флаг UF_DONT_EXPIRE_PASSWD, пользователь должен установить пароль при следующем входе в систему.

Для того, чтобы истекший срок действия пароля, нам необходимо установить pwdLastSet в ноль. Это подтверждается blog entry from Scripting Guy, который делает это в VBScript.

В Perl:

# Binding to LDAP Directory: 
$self->{LDAP_INSTANCE} = Net::LDAPS->new($host); 
$self->{LDAP_INSTANCE}->bind(dn=>$dn, password=>$password, version=>3) 

my $rc =$self->{LDAP_INSTANCE}->modify(
    $DN_OF_USER_ACCOUNT, 
    [ replace => [pwdLastSet => 0] ] 
); 
print $rc->error; 
+0

работал великолепно, спасибо за объяснение наряду с правильным решением. – Drew