如何讓用戶密碼在快過期時(shí)
如何讓用戶密碼在快過期時(shí),發(fā)郵件提醒用戶更改密碼 2010-12-31 11:50:46標(biāo)簽:更改密碼 用戶 OWA 郵件 通知大家都知道,在域環(huán)境中,組策略中可以設(shè)置當(dāng)用戶密碼快過期時(shí),電腦登錄
如何讓用戶密碼在快過期時(shí),發(fā)郵件提醒用戶更改密碼 2010-12-31 11:50:46
標(biāo)簽:更改密碼 用戶 OWA 郵件 通知
大家都知道,在域環(huán)境中,組策略中可以設(shè)置當(dāng)用戶密碼快過期時(shí),電腦登錄會(huì)有提示,但當(dāng)用戶出差,或是用OWA 方式訪問時(shí),并不會(huì)收到相關(guān)提示,而導(dǎo)致道密碼過期而無法收發(fā)郵件!
下面的方法,就是教大家,如何讓用戶密碼在快過期時(shí),發(fā)郵件提醒用戶更改密碼,讓用戶去OWA 中去更改自已的密碼,不至于發(fā)生密碼過期,用戶并不知道,而無法收發(fā)郵件! 以下是在AD 、Exchange 環(huán)境下,用郵件的方式通知用戶密碼到期提示的腳本,需要使用的,請(qǐng)將其路的Domainname.com 和Domain 改成你的域名,ADserver/Mailserver改為你的AD 和Exchange 的機(jī)器名,然后COPY 下面的腳本存為.vbs 格式,放在DC 中,設(shè)置Scheduled Tasks ,讓其每天在固定時(shí)間執(zhí)行!
注:此腳本文件會(huì)和組策略中的密碼策略相對(duì)應(yīng)!
此腳本為微軟工程師專為某企業(yè)而寫的,在些對(duì)其表示感謝!
'********************************************************************
'* Main Function: 從AD 中比對(duì)每一個(gè)使用者的Password LastSet,如果距離過期日剩30,15,3,2,1的使用者, 則發(fā)信通知
'*
'* Usage:
' For Example : cscript QuerryAD.vbs
,'*
'* Copyright (C) 2004 Microsoft Corporation
'******************************************************************** 'Option Explicit
'For FileSystemObject
Const ForReading = 1
Const ForAppending = 8
Const ForWriting = 2
Const ADS_PROPERTY_DELETE = 4
dim arrWillExpiredDays
'Please modify the variable
CONST MASTERMAIL = "administrator@domainname.com" '寄信人的Email Address
'const strSMTPServer = "mailserver" '寄信ExchangeServer
'const strSendUserName = "domainname?COUNT" '有權(quán)限的使用者(寄信使用) 'const strSendPassword = "PASSWORD" '密碼
const strFullAdsiPath =
" LDAP://DCserver.domainname.com/dc=domainname,dc=com" 'LDAP路徑
arrWillExpiredDays = Array(15,7,3,2,1) '將要過期天數(shù)的陣列 'Main Function
,'Declare variables
Dim strTestMode
strTestMode = False 'use for debuging
'Cretae log file
Set WshSHell = CreateObject("Wscript.Shell")
Set objFSO = CreateObject("Scripting.FileSystemObject")
strFileName = Replace(Datevalue(Now), "-", "_")
strFileName = Replace(strFileName, "/", "_")
Public fLog
Set oLog = objFSO.OpenTextFile(strFileName & ".txt", ForWriting, TRUE) PrintScreen Now
PrintScreen ""
sta = ListWillExpireUsers()
PrintScreen sta
PrintScreen ""
PrintScreen "The command runs successfully!"
PrintScreen Now
,oLog.Close
'Program ending
wscript.quit
'======================================
' Function Area
'======================================
'******************************************************************** '*
'* Function: PrintScreen
'* Purpose: Show Message
'* Input: Message
'*
'* Output: None
'*
'******************************************************************** Sub PrintScreen(strMessage)
if strTestMode = True then
Wscript.Echo strMessage
end if
,oLog.WriteLine strMessage
End Sub
'******************************************************************** '*Function ListWillExpireUsers(nDays)
'* List all user objects whose password will be expired or is expired '* nDays: how many days the password will be expired
'*
'*
'*
'*-------------------------------------------------------------------
Function ListWillExpireUsers()
Dim strMailAddress
' Create User Object
Set objConnection = CreateObject("ADODB.Connection")
Set objCommand = CreateObject("ADODB.Command")
objConnection.Provider = "ADsDSOObject"
objConnection.Open "Active Directory Provider"
Set objCommand.ActiveConnection = objConnection
,objCommand.CommandText = "<" & strFullAdsiPath &
">;(&(objectCategory=person)(objectclass=user));AdsPath,cn;subTree"
objCommand.Properties("Page Size") = 99 'specifies the maximum number of objects to return in a results set.
PrintScreen objCommand.CommandText
PrintScreen " "
Set objRecordSet = objCommand.Execute
If objRecordSet.RecordCount = 0 Then
PrintScreen "Error: Cannot found the user object in domain " & BaseDN & "." Else
Dim intTotalAccount '計(jì)算找到幾位使用者
intTotalAccount = 0
objRecordSet.MoveFirst
Do Until objRecordSet.EOF
intTotalAccount = intTotalAccount 1
'Retrive user information
,Dim oUser
Set oUser = GetObject(objRecordSet.Fields("ADsPath").Value)
For Each oUserProperty in oUser
PrintScreen oUserProperty.Name
Next
If (oUser.AccountDisabled = FALSE) Then
PrintScreen vbTab & "User Name : " & oUser.Name
sStatus = UserPwdExpire(oUser)
Select Case sStatus
Case 999999
PrintScreen vbTab & " The user " & oUser.samaccountname & " Password never expires."
Case Else
if sStatus >= 0 then
strMSG = "Your password is already expired in " & sStatus & " days!"
PrintScreen vbTab & " The user " & oUser.samAccountName & " password is expired
,after " & sStatus & " days!"
elseif sStatus < 0 then
strMSG = "Your mail account password will be expired in " & 0-sStatus & " days!" & vbcrlf & "Please change your password as soon as!"
PrintScreen vbTab & " The user " & oUser.samAccountName & " password will be expired in " & 0-sStatus & " days!"
end if
For each checkDays in arrWillExpiredDays
if checkDays = (0-sStatus) then
call fnCheck_SendMail(oUser,strMSG)
end if
next
End Select
else
PrintScreen vbTab & "User Name : " & oUser.Name
PrintScreen vbTab & " The user " & oUser.samaccountname & " Account Disabled." end if
objRecordSet.MoveNext
,PrintScreen " "
Loop
End If
PrintScreen "Total Accounts is " & intTotalAccount
ListWillExpireUsers = "OK"
End Function
'******************************************************************** '* Function UserPwdExpire(objUser, nMaxPwdAge)
'* Check if user object password is or will be expired
'* objUser: the user object
'*
'* nMaxPwdAge: maximum password age of domain
'*
'*------------------------------------------------------------------- Function UserPwdExpire(objUser)
,On Error Resume Next
Const ADS_UF_DONT_EXPIRE_PASSWD = &H10000
Const SEC_IN_DAY = 86400
intCurrentValue = objUser.Get("userAccountControl")
If intCurrentValue and ADS_UF_DONT_EXPIRE_PASSWD Then
'The password does not expire.
UserPwdExpire = 999999 '永遠(yuǎn)不過期
Else
dtmValue = objUser.PasswordLastChanged
if err.number <> 0 then
dtmValue = 0
err.Clear
end if
PrintScreen vbTab & " The password was last changed on " & DateValue(dtmValue) & " at " & TimeValue(dtmValue)
'PrintScreen vbTab & "The password was last changed on " & _
'DateValue(dtmValue) & " at " & TimeValue(dtmValue) & VbCrLf & _