4

我的公司和其他人一样,不时需要重置密码。为了安全起见,这一切都很好,但我想探索通过脚本重置它的挑战(特别是因为我们不能使用我们之前的 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模块,但那里没有骰子。

谢谢!

Leon 的更新(Max,你是下一个):

你是对的,我应该更好地指定。我试过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);
4

4 回答 4

3

Net::LDAP::Extension::SetPassword与任何 OLE LDAP 对象没有任何关系。要么使用Net::LDAP,要么使用Win32::OLE->GetObject('LDAP:').

你没有提到你使用的是什么服务器。设置密码需要对 LDAP 进行扩展,因此这是相关的。

于 2009-01-21T21:57:14.903 回答
3

当您说您正在尝试“重置”密码时,我认为您的真正意思是更改密码而不是设置密码。两者是有区别的。“SetPassword”需要上帝/管理员权限,因为无论旧密码是否已知,您都将用户的密码设置为新值,而“ChangePassword”要求用户实际知道旧密码。我假设您的帐户没有管理员权限,否则您将不会得到 0x80070005:“访问被拒绝”

所以而不是:

$ldap_user->SetPassword('mySw337NewPassword');

试试这个:

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

顺便说一句,我从来没有在 perl 中做过这些事情,所以我只是猜测。希望这可以帮助你。

于 2009-01-22T05:23:20.807 回答
2

要记住的另一件事是 Active Directory 不允许您设置密码,除非您使用 LDAPS 绑定到端口 636。

于 2009-01-22T05:33:47.243 回答
0

您可以尝试将值写入 userPassword,这将是密码重置,您可能无权这样做。

否则,您可以尝试在一个操作中(LDIF 会将其显示为由​​一行上的单个破折号分隔)删除旧密码的值,然后添加新密码的值。那将是一个密码更改事件。

于 2009-01-22T03:33:29.950 回答