私の会社は、他の人と同じように、時々パスワードをリセットする必要があります。これはすべてセキュリティのために問題ありませんが、スクリプトを使用してリセットするという課題を探りたいと思います(特に、以前の25個のパスワードを使用できないためです。Perlはリストを2ダース循環する方がはるかに高速です。私の指よりも深い)。
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
モジュールを見つけましたが、サイコロはありません。
ありがとう!
レオンのアップデート(マックス、あなたは次です):
あなたは正しいです、私はもっとよく指定するべきでした。私は試し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);