Моя компания, как и все остальные, время от времени требует сброса пароля. Это все хорошо и хорошо для безопасности, но я хотел бы изучить проблему сброса его с помощью скрипта (особенно потому, что мы не можем использовать наши предыдущие 25 паролей; Perl намного быстрее циклически перемещается по списку из двух дюжин. глубже, чем мои пальцы).
Я пытаюсь использовать соединители LDAP Perl и Win32 :: OLE для сброса пароля. Я следил за парой примеров в Интернете и вкратце:
use strict;
use Win32::OLE;
my $dn = 'cn=name,dc=corp,dc=com';
my $ldap = Win32::OLE->GetObject('LDAP:');
my $ldap_user = $ldap->OpenDSObject('LDAP://' . $dn,'username','password',1);
$ldap_user->SetPassword('mySw337NewPassword');
И все, что я получаю за свои проблемы, это:
Win32::OLE(0.1707) error 0x80070005: "Access is denied"
in METHOD/PROPERTYGET "SetPassword" at pw.change.pl line 8
Это то, что можно обойти? Я обнаружил модуль Net::LDAP::Extension::SetPassword, но кости там нет.
Спасибо!
Обновление для Леона (Макс, ты следующий):
Вы правы, я должен был уточнить. Я попробовал Win32::OLE, потерпел неудачу, затем отдельно попробовал Net::LDAP::Extension::SetPassword и потерпел неудачу еще больше.
Что касается моего сервера: я не уверен, я не парень LDAP :) Запустив ->root_dse->get_value('supportedExtension'), я вижу, что setPassword OID не установлен, так что, возможно, это просто не должно быть.
Финальный реквизит барнейтона!
Окончательное решение:
use strict;
use Win32::OLE;
my $orig_password = 'password123Test';
my $target_password = 'password321Test';
my $dn = 'cn=myname,dc=corp,dc=com';
my $ldap = Win32::OLE->GetObject('LDAP:');
my $ldap_user = $ldap->OpenDSObject('LDAP://'.$dn,'myname',$orig_password,1);
my $tmp_password = '';
for ( my $i = 0; $i < 30; ++$i )
{
$tmp_password = 'password' . $i . 'ABC';
print 'Changing to ' . $tmp_password . "\n";
$ldap_user->ChangePassword($orig_password,$tmp_password);
$orig_password = $tmp_password;
sleep 1;
}
$ldap_user->ChangePassword($tmp_password,$target_password);





Net::LDAP::Extension::SetPassword не имеет ничего общего ни с каким объектом OLE LDAP. Либо вы используете Сеть :: LDAP, либо Win32::OLE->GetObject('LDAP:').
Вы не упомянули, какой сервер используете. Для установки паролей требуется расширение LDAP, так что это актуально.
Привет, Леон, ты прав, я должен был уточнить. Я попробовал Win32::OLE, потерпел неудачу, затем отдельно попробовал Net::LDAP::Extension::SetPassword и потерпел неудачу еще больше. (продолжение)
(продолжение) Что касается моего сервера: я не уверен, я не парень LDAP :) Запустив ->root_dse->get_value('supportedExtension'), я вижу, что setPassword OID не установлен, так что, возможно, это просто не должно быть.
Вы можете попытаться записать значение в userPassword, которое будет сбросом пароля, и у вас может не быть на это прав.
В противном случае вы можете попробовать за одну операцию (LDIF покажет это как разделенное одним тире в строке) удалить значение старого пароля, а затем добавить значение нового пароля. Это будет событие смены пароля.
Когда вы сказали, что пытаетесь «сбросить» свой пароль, я думаю, вы действительно имели в виду пароль менять, а не пароль набор. Между ними есть разница. «SetPassword» требует привилегий бога / администратора, поскольку вы устанавливаете пароль пользователя на новое значение независимо от того, известен ли старый пароль, в то время как «ChangePassword» требует, чтобы пользователь действительно знал старый пароль. Я предполагаю, что у вашей учетной записи нет прав администратора, иначе вы не получили бы 0x80070005: «Доступ запрещен»
Так что вместо:
$ldap_user->SetPassword('mySw337NewPassword');
попробуй это:
$ldap_user->ChangePassword('password', 'mySw337NewPassword');
Между прочим, я никогда не делал этого на perl, так что я просто догадываюсь. Надеюсь, что это помогает вам.
Работает как шарм. Спасибо!
Также следует иметь в виду, что Active Directory не позволяет устанавливать пароли, если вы не привязаны к порту 636 с помощью LDAPS.
После входа в систему работают ли запросы, не связанные с изменением пароля?