Как сбросить пароль LDAP из Perl?

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

После входа в систему работают ли запросы, не связанные с изменением пароля?

Max Lybbert 22.01.2009 01:13
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
4
1
4 348
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

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

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

Привет, Леон, ты прав, я должен был уточнить. Я попробовал Win32::OLE, потерпел неудачу, затем отдельно попробовал Net::LDAP::Extension::SetPassword и потерпел неудачу еще больше. (продолжение)

kyle 22.01.2009 01:05

(продолжение) Что касается моего сервера: я не уверен, я не парень LDAP :) Запустив ->root_dse->get_value('supportedExtension'), я вижу, что setPassword OID не установлен, так что, возможно, это просто не должно быть.

kyle 22.01.2009 01:06

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

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

Ответ принят как подходящий

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

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

$ldap_user->SetPassword('mySw337NewPassword');

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

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

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

Работает как шарм. Спасибо!

kyle 22.01.2009 08:44

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

Другие вопросы по теме