Моя компания, как и все остальные, время от времени требует сброса пароля. Это все хорошо и хорошо для безопасности, но я хотел бы изучить проблему сброса его с помощью скрипта (особенно потому, что мы не можем использовать наши предыдущие 25 паролей; Perl гораздо быстрее перебирает список из двух десятков глубже, чем мои пальцы).
Я пытаюсь использовать коннекторы Perl и Win32 :: OLE LDAP для сброса моего пароля. Я следовал за несколькими примерами онлайн, и кратко:
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
не установлен, так что, возможно, он просто не предназначен. 1024 *
Финальный реквизит в Барнейтон!
Окончательное решение:
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);