我的公司和其他人一样,需要不时重置密码。这一切都很好,为了安全起见,但我想探索通过脚本重置它的挑战(特别是因为我们不能使用我们之前的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);
答案 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将其显示为由一行上的单个短划线分隔)删除旧密码的值,然后添加新密码的值。那将是一个密码更改事件。