代码之家  ›  专栏  ›  技术社区  ›  kyle

如何从Perl重置LDAP密码?

  •  4
  • kyle  · 技术社区  · 16 年前

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

    change 密码而不是密码 set

    因此,不是:

    $ldap_user->SetPassword('mySw337NewPassword');
    

    试试这个:

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

    顺便说一下,我从来没有用perl做过这件事,所以我只是在猜测。希望这对你有所帮助。

        2
  •  3
  •   Leon Timmermans    16 年前

    Net::LDAP::Extension::SetPassword 与任何OLE LDAP对象都没有任何关系。要么你用 Net::LDAP ,或您使用 Win32::OLE->GetObject('LDAP:') .

    你没有提到你正在使用的服务器。设置密码需要对LDAP进行扩展,因此这是相关的。

        3
  •  2
  •   Joshua    16 年前

        4
  •  0
  •   geoffc    16 年前

    您可以尝试将该值写入userPassword,这将是密码重置,您可能无权这样做。

    否则,您可以在一个操作中尝试(LDIF将显示为在一行上用一个破折号分隔)删除旧密码的值,然后添加新密码的值。这将是一个密码更改事件。