如何从Perl重置LDAP密码?

时间:2009-01-21 20:04:29

标签: perl winapi ldap passwords

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

答案 0 :(得分:3)

Net::LDAP::Extension::SetPassword与任何OLE LDAP对象无关。您可以使用Net::LDAP,也可以使用Win32::OLE->GetObject('LDAP:')

您没有提到您正在使用的服务器。设置密码需要LDAP扩展,因此这是相关的。

答案 1 :(得分:3)

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

所以而不是:

$ldap_user->SetPassword('mySw337NewPassword');

试试这个:

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

顺便说一下,我从未在perl中做过这些事情,所以我只是在猜测。希望这会帮助你。

答案 2 :(得分:2)

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

答案 3 :(得分:0)

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

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