4


0

LDAPパスワードをPerlからリセットするにはどうすればいいですか?

私の会社は、他の人と同じように、時々パスワードのリセットを要求します。 これはセキュリティ上の理由からすべてうまくいきますが、スクリプトを使用してリセットするという難題を探りたいと思います(特に、以前の25個のパスワードを使用できないため、Perlはリストを2〜12回巡回する方がずっと早いです)私の指より深いです)。

私はパスワードをリセットするために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の人ではない:)それだけではありません。

  • barneytonへの最後の小道具!*

最終的解決:

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 Answer


3


`Net

LDAP :: Extension :: SetPassword`はOLE LDAPオブジェクトとは何の関係もありません。 http://search.cpan.org/perldoc?Net::LDAP [Net :: LDAP]を使用するか、あるいは `Win32 :: OLE→ GetObject( 'LDAP:')`を使用してください。

どのサーバーを使用しているか言及していません。 パスワードを設定するにはLDAPの拡張が必要です。


3


あなたがあなたのパスワードを「リセット」しようとしていると言ったとき、私はあなたが本当にhttpよりむしろ 変更パスワードを意味したと思います: //msdn.microsoft.com/en-us/library/aa746344(VS.85).aspx[set]パスワード。 両者に違いがあります。 "SetPassword"は、古いパスワードが知られているかどうかにかかわらずユーザーのパスワードを新しい値に設定しているので、god / admin特権を必要としますが、 "ChangePassword"は実際に古いパスワードを知ることを要求します。 私はあなたのアカウントが管理者権限を持っていないと仮定します、そうでなければあなたは0x80070005を得ていないでしょう:

だから代わりに:

$ ldap_user-> SetPassword( 'mySw337NewPassword');

これを試して:

$ ldap_user-> ChangePassword( 'パスワード'、 'mySw337NewPassword');

ところで、私はperlでこのようなことをしたことがないので、私はただ推測しています。 これが役に立つことを願っています。


2


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


0


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

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