Share via


嗨,Scripting Guy!

嗨,Scripting Guy!

歡迎使用 TechNet 專欄,Microsoft Scripting Guy 會在此為您解答有關系統管理指令碼的常見問題。您有關於系統管理指令碼方面的問題嗎?請將電子郵件傳送到 scripter@microsoft.com。我們無法保證能夠逐一回答每個問題,不過我們會盡力而為。

還有,別忘了瞧瞧全新經過改良的嗨,Scripting Guy!過往文件

今天的問題:如何判斷使用者前次變更密碼的時間?


如何判斷使用者前次變更密碼的時間?

嗨,Scripting Guy! 我要如何判斷使用者前次變更密碼的時間呢?

-- MG

MG,您好。很久以前,有一位 Scripting Guy 在一家本地大學工作。該校有一個科系,輕而易舉就找到使用者前次變更密碼的時間了:因為助理小姐保留了一份清單,上面列了該系所有使用者、所有使用者密碼以及變更那些密碼的日期和時間。最棒的是,她把那份清單放在她桌上的資料夾;萬一有人忘記密碼,只要翻一下資料夾,就可以找到他的密碼了。

當然嘍,也可以找到所有人的密碼。

這就是判斷使用者前次變更密碼時間的一種方法。不過另外還有一個方法:

Set objUser = GetObject("LDAP://CN=myerken,OU=management,DC=Fabrikam,DC=com")
Wscript.Echo "Password last changed: " & objUser.PasswordLastChanged

沒錯,這就是整個指令碼。咱們可不像某些網站,只讓您看開頭的部份,其餘部份則要付費才能瀏覽 (雖然我們也開始考慮這麼做了…)。如果我們想知道前次 Ken Myer 變更密碼的時間,只要執行下面兩個動作即可:

  • 連結到 Ken 在 Active Directory 的使用者帳戶。
  • 回應 PasswordLastChanged 屬性的值。

這樣就行了,真的。

當然嘍,我們假設您所指的是 Active Directory 使用者帳戶;您也可能是指 Windows NT 4.0 使用者帳戶,或甚至是本機使用者帳戶。真是這樣的話,就有點問題了。畢竟您得使用 WinNT 提供者來存取 NT 4.0 或本機使用者帳戶,而 WinNT 提供者並不支援 PasswordLastChanged 屬性。

因此,如果您真的是指 NT 4.0 或本機使用者帳戶的話,就準備看我們出洋相了是嗎?那麼,您就太小看我們了:

strComputer = "atl-ws-01"
Set objUser = GetObject("WinNT://" & strComputer & "/kenmyer")
intPasswordAge = objUser.PasswordAge
intPasswordAge = intPasswordAge * -1 
dtmChangeDate = DateAdd("s", intPasswordAge, Now)
WScript.Echo "Password last changed: " & dtmChangeDate

如您所見,這個指令碼雖然有點長,不過卻很簡單。一開始我們先連接到 Ken Myer 帳戶 (在電腦 atl-ws-01 的使用者名稱是 kenmyer)。(萬一您連接的是 NT 4.0 網域時怎麼辦?別怕;只要把 atl-ws-01 換成該網域的名稱就行了)。接著就抓取 PasswordAge 屬性的值,將它儲存在一個名叫 intPasswordAge 的變數。

為什麼我們不乾脆回應 PasswordAge 的值就好?那是因為 PasswordAge 實際代表的是自從前次變更密碼以來所經歷的秒數。假設您得到這樣的答覆:

50725249

您有本事用心算,把目前的日期和時間減掉 50725249 秒,再計算前次變更密碼的時間嗎?

如果真的算得出來,算您厲害!我們的確沒這個本事,不過,交給指令碼做總可以吧。我們先把 intPasswordAge 的值乘以 -1:

intPasswordAge = intPasswordAge * -1

為什麼這麼做?因為我們即將在下一行程式碼,使用 DateAdd 函數來判斷前次設定密碼的日期。因此必須在 DateAdd 代入三個參數:

  • 我們要處理的時段。因為 PasswordAge 是以秒為單位,因此我們以「s」作為第一個參數。
  • 要加到目前日期的秒數。這也是我們把 intPasswordAge 乘以 -1 的原因。我們不是真的要把 intPasswordAge 到目前日期 (這個動作會在將來某處傳回一個時間),而是把目前時間掉 intPasswordAge,畢竟 intPasswordAge 是指前次變更密碼之後所經歷的秒數。由於加入負數跟減掉正數的意思一樣,因此我們把 intPasswordAge 乘以 -1。
  • 目前日期和時間。此值我們用 VBScript 函數 Now 來表示。

好啦,方程式的結果是儲存在變數 dtmChangeDate 中,我們會在程式碼的最後一行回應該變數的值。我們在建立和測試這個指令碼時,它就會告訴我們密碼前次變更的時間是 11/22/2003 的 12:02:10 PM。(同時還會「說教」一番,說我們沒好好更新本機使用者的帳戶密碼)。


如需詳細資訊

請參閱嗨,Scripting Guy!- 過往文件

 

回到頁首 回到頁首