4

私の会社は、他の人と同じように、時々パスワードをリセットする必要があります。これはすべてセキュリティのために問題ありませんが、スクリプトを使用してリセットするという課題を探りたいと思います(特に、以前の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);
4

4 に答える 4

3

パスワードを「リセット」しようとしていると言ったとき、パスワードを設定するのではなく、パスワードを変更するつもりだったと思います。両者には違いがあります。「SetPassword」では、古いパスワードを知っているかどうかに関係なくユーザーのパスワードを新しい値に設定するため、god/admin 権限が必要ですが、「ChangePassword」ではユーザーが実際に古いパスワードを知っている必要があります。あなたのアカウントには管理者権限がないと仮定しています。

したがって、代わりに:

$ldap_user->SetPassword('mySw337NewPassword');

これを試して:

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

ちなみに、私は perl でこのようなことをしたことがないので、推測に過ぎません。これがお役に立てば幸いです。

于 2009-01-22T05:23:20.807 に答える
3

Net::LDAP::Extension::SetPasswordOLE LDAP オブジェクトとは何の関係もありません。Net::LDAPを使用するか、 を使用しますWin32::OLE->GetObject('LDAP:')

使用しているサーバーについては言及していません。パスワードを設定するには LDAP の拡張機能が必要なので、これは関連性があります。

于 2009-01-21T21:57:14.903 に答える
2

もう 1 つ注意すべき点は、LDAPS を使用してポート 636 にバインドしない限り、Active Directory ではパスワードを設定できないことです。

于 2009-01-22T05:33:47.243 に答える
0

パスワードのリセットとなる値を userPassword に書き込もうとする可能性がありますが、それを行う権利がない可能性があります。

それ以外の場合は、1 回の操作で (LDIF では 1 つのダッシュで区切られた行として表示されます)、古いパスワードの値を削除してから、新しいパスワードの値を追加してみてください。それはパスワード変更イベントです。

于 2009-01-22T03:33:29.950 に答える