Как мне сбросить пароль LDAP от Perl? - PullRequest
4 голосов
/ 21 января 2009

Моя компания, как и все остальные, время от времени требует сброса пароля. Это все хорошо и хорошо для безопасности, но я хотел бы изучить проблему сброса его с помощью скрипта (особенно потому, что мы не можем использовать наши предыдущие 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);

Ответы [ 4 ]

3 голосов
/ 22 января 2009

Когда вы сказали, что пытаетесь «сбросить» свой пароль, я думаю, что вы действительно имели в виду изменить пароль вместо установить пароль. Между ними есть разница. «SetPassword» требует привилегии бога / администратора, поскольку вы устанавливаете пароль пользователя на новое значение независимо от того, известен ли старый пароль, в то время как «ChangePassword» требует, чтобы пользователь действительно знал старый пароль. Я предполагаю, что ваша учетная запись не имеет прав администратора, иначе вы не получили бы 0x80070005: «Доступ запрещен»

Так что вместо:

$ldap_user->SetPassword('mySw337NewPassword');

попробуйте это:

$ldap_user->ChangePassword('password', 'mySw337NewPassword');

Кстати, я никогда не делал этого в Perl, так что я просто догадываюсь. Надеюсь, это поможет вам.

3 голосов
/ 22 января 2009

Net::LDAP::Extension::SetPassword не имеет никакого отношения к объекту OLE LDAP. Либо вы используете Net :: LDAP , либо вы используете Win32::OLE->GetObject('LDAP:').

Вы не упомянули, какой сервер используете. Установка паролей требует расширения для LDAP, так что это актуально.

2 голосов
/ 22 января 2009

Следует также помнить, что Active Directory не позволяет устанавливать пароли, если вы не привязываетесь к порту 636 с помощью LDAPS.

0 голосов
/ 22 января 2009

Вы можете попытаться записать значение в userPassword, которое будет сбрасывать пароль, и у вас могут не быть прав на это.

В противном случае вы можете попытаться в одной операции (LDIF покажет ее как разделенную одной чертой в строке), удалить значение старого пароля и затем добавить значение нового пароля. Это было бы событием смены пароля.

...