2009-01-21 41 views
4

我的公司和其他人一樣,需要不時重置密碼。這對安全性來說都很好,但我想探索通過腳本重置它的挑戰(特別是因爲我們不能使用我們以前的25個密碼; Perl更快地通過列表循環瀏覽兩個列表比我的手指深)。如何從Perl重置我的LDAP密碼?

我想使用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沒有設置,所以也許它不應該是。

最後的道具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); 
+0

一旦你登錄做到這一點不涉及更改您的密碼工作的查詢? – 2009-01-21 22:13:37

回答

3

當你說你試圖「重置」你的密碼時,我想你的密碼真的意思是change而不是set的密碼。兩者有區別。 「SetPassword」需要god/admin權限,因爲無論舊密碼是否已知,您都將用戶密碼設置爲新值,而「ChangePassword」需要用戶真正知道舊密碼。我假設你的帳戶不具有管理員權限,否則你就不會得到0X80070005:「訪問被拒絕」

所以不是:

$ldap_user->SetPassword('mySw337NewPassword'); 

試試這個:

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

順便說一句,我從來沒有在perl中做過這個東西,所以我只是在猜測。希望這可以幫助你。

3

Net::LDAP::Extension::SetPassword沒有任何與任何OLE LDAP對象。要麼使用Net::LDAP,要麼使用Win32::OLE->GetObject('LDAP:')

你沒有提到你正在使用的服務器。設置密碼需要對LDAP進行擴展,因此是相關的。

+0

嗨萊昂, 你是對的,我應該指定更好。我嘗試了`Win32 :: OLE`,失敗了,然後單獨嘗試了`Net :: LDAP :: Extension :: SetPassword`並且失敗了。 (續) – kyle 2009-01-21 22:05:44

+0

(續)至於我的服務器:我不能肯定,我不是LDAP傢伙:)通過運行` - > root_dse->的get_value(「supportedExtension」)'我可以看到` setPassword OID`沒有設置,所以也許它不適合。 – kyle 2009-01-21 22:06:15

0

您可以嘗試將值寫入userPassword,這將會重置密碼,並且您可能沒有權限執行此操作。

否則,您可以在一個操作中嘗試(LDIF將其顯示爲由​​一條線上的單個破折號分隔),請刪除舊密碼的值,然後添加新密碼的值。這將是一個密碼更改事件。

2

另一件事要記住的是Active Directory中不允許,除非你綁定端口636使用LDAPS您設置的密碼。