源代码:
On Error Resume Next
Const LDAPAD = "LDAP://DC=xxxx,DC=com" Const alertDays = 7 Const path = "d:\alluser.txt" Const mailFrom = "" Const smtpserver = "x.x.x.x" Const sendusername = "xxxx" sendpassword = "xxxx" Const smtpserverport = 25 Set fso=CreateObject("Scripting.FileSystemObject") set file=fso.CreateTextFile("d:\快过期users.txt",True) maxPwdAgeDays = GetMaxPwdAge(LDAPAD) CheckAndAlert()
Function CheckAndAlert()
On Error Resume Next Const ADS_SCOPE_SUBTREE = 3 Set objRootDSE = GetObject(LDAP://xxxx.com) Set objConnection = CreateObject("ADODB.Connection") Set objCommand = CreateObject("ADODB.Command") objConnection.Provider = "ADsDSOObject" objConnection.Open "Active Directory Provider" Set objCommand.ActiveConnection = objConnection objCommand.Properties("Page Size") = 1000 objCommand.Properties("Searchscope") = ADS_SCOPE_SUBTREE objCommand.CommandText = "SELECT * FROM 'LDAP://xxxx.com' WHERE objectCategory='user'" Set objRecordSet = objCommand.Execute objRecordSet.MoveFirst Do Until objRecordSet.EOF 'WScript.Sleep 300 username = objRecordSet.Fields("ADsPath").Value LDAPUser=username CheckPasswordExpire LDAPUser, maxPwdAgeDays, alertDays 'Wscript.Echo LDAPUser objRecordSet.MoveNext Loop file.Close 'Wscript.Echo "" 'Wscript.Echo "Total User: "&objRecordSet.RecordCount 'WScript.Sleep 10000 End Function Function CheckPasswordExpire(LDAPUser, maxPwdAgeDays, alertDays) On Error Resume Next Const ADS_UF_DONT_EXPIRE_PASSWD = &h10000 Const E_ADS_PROPERTY_NOT_FOUND = &h8000500D Const ONE_HUNDRED_NANOSECOND = .000000100 Const SECONDS_IN_DAY = 86400 If maxPwdAgeDays = 0 Then Exit Function Else Set objUser = GetObject(LDAPUser)intUserAccountControl = objUser.Get("userAccountControl")
If intUserAccountControl And ADS_UF_DONT_EXPIRE_PASSWD Then Exit Function Else dtmValue = objUser.PasswordLastChanged If Err.Number = E_ADS_PROPERTY_NOT_FOUND Then Exit Function Else intTimeInterval = Int(Now - dtmValue) End If If intTimeInterval >= maxPwdAgeDays Then Exit Function Else intTimeDaysFrom = Int((dtmValue + maxPwdAgeDays) - Now) IF intTimeDaysFrom <= alertDays Then mail = objUser.Get("mail") file.writeline mail&","&intTimeDaysFrom&","&dtmValue&","&maxPwdAgeDays&","&LDAPUser IF mail <> "" Then 'Wscript.Echo mail SendMail(mail) END IF End If End If End If End If End FunctionFunction GetMaxPwdAge(LDAPAD)
Const ONE_HUNDRED_NANOSECOND = .000000100 ' .000000100 is equal to 10^-7 Const SECONDS_IN_DAY = 86400 Set objDomain = GetObject(LDAPAD) Set objMaxPwdAge = objDomain.Get("maxPwdAge")If objMaxPwdAge.LowPart = 0 Then
GetMaxPwdAge=0 Else dblMaxPwdNano = Abs(objMaxPwdAge.HighPart * 2^32 + objMaxPwdAge.LowPart) dblMaxPwdSecs = dblMaxPwdNano * ONE_HUNDRED_NANOSECOND ' LINE 13 dblMaxPwdDays = Int(dblMaxPwdSecs / SECONDS_IN_DAY) ' LINE 14 GetMaxPwdAge = dblMaxPwdDays End If End FunctionSub SendMail(mailTo)
On Error Resume Next Set objMessage = CreateObject("CDO.Message") objMessage.Subject = "您的域帐号密码即将过期,请及时更改!" objMessage.From = mailFrom objMessage.To = mailTo objMessage.TextBody = "您的域帐号密码即将过期,请及时更改!!"&mailTo objMessage.Configuration.Fields.Item("") = 2 objMessage.Configuration.Fields.Item("") = smtpserver objMessage.Configuration.Fields.Item("") = sendusername objMessage.Configuration.Fields.Item("") = Base64Decode(sendpassword) objMessage.Configuration.Fields.Item("") = smtpserverport objMessage.Configuration.Fields.Item("") = False objMessage.Configuration.Fields.Item("") = 60 objMessage.Configuration.Fields.Update objMessage.Send End SubFunction Base64Decode(ByVal base64String)
Const Base64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" Dim dataLength, sOut, groupBegin 'remove white spaces, If any base64String = Replace(base64String, vbCrLf, "") base64String = Replace(base64String, vbTab, "") base64String = Replace(base64String, " ", "") 'The source must consists from groups with Len of 4 chars dataLength = Len(base64String) If dataLength Mod 4 <> 0 Then Err.Raise 1, "Base64Decode", "Bad Base64 string." Exit Function End If ' Now decode each group: For groupBegin = 1 To dataLength Step 4 Dim numDataBytes, CharCounter, thisChar, thisData, nGroup, pOut ' Each data group encodes up To 3 actual bytes. numDataBytes = 3 nGroup = 0 For CharCounter = 0 To 3 ' Convert each character into 6 bits of data, And add it To ' an integer For temporary storage. If a character is a '=', there ' is one fewer data byte. (There can only be a maximum of 2 '=' In ' the whole string.) thisChar = Mid(base64String, groupBegin + CharCounter, 1) If thisChar = "=" Then numDataBytes = numDataBytes - 1 thisData = 0 Else thisData = InStr(1, Base64, thisChar, vbBinaryCompare) - 1 End If If thisData = -1 Then Err.Raise 2, "Base64Decode", "Bad character In Base64 string." Exit Function End If nGroup = 64 * nGroup + thisData Next 'Hex splits the long To 6 groups with 4 bits nGroup = Hex(nGroup) 'Add leading zeros nGroup = String(6 - Len(nGroup), "0") & nGroup 'Convert the 3 byte hex integer (6 chars) To 3 characters pOut = Chr(CByte("&H" & Mid(nGroup, 1, 2))) + _ Chr(CByte("&H" & Mid(nGroup, 3, 2))) + _ Chr(CByte("&H" & Mid(nGroup, 5, 2))) 'add numDataBytes characters To out string sOut = sOut & Left(pOut, numDataBytes) Next Base64Decode = sOut End Function