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