├── New-ADPasswordReminder.ps1 ├── README.md ├── functions ├── Get-AdUserPasswordExpirationDate.ps1 ├── Invoke-Installation.ps1 ├── Remove-ScriptVariables.ps1 └── Set-ModuleStatus.ps1 └── images ├── 7-ChangePassword.png ├── OWA-ChangePassword.png ├── OWA-ChangePassword2.png ├── XP-ChangePassword.png ├── footer.gif ├── header.gif ├── image001b.gif ├── image002.gif ├── image003.png ├── image004.png ├── image005b.gif ├── spacer.gif └── spacer50.gif /New-ADPasswordReminder.ps1: -------------------------------------------------------------------------------- 1 | <# 2 | .SYNOPSIS 3 | Notifies users that their password is about to expire. 4 | 5 | .DESCRIPTION 6 | Let's users know their password will soon expire. Details the steps needed to change their password, and advises on what the password policy requires. Accounts for both standard Default Domain Policy based password policy and the fine grain password policy available in 2008 domains. 7 | 8 | .NOTES 9 | Version : v3.0 - See changelog at https://ucunleashed.com/596 10 | Wish list : Set $DaysToWarn automatically based on Default Domain GPO setting 11 | : Description for scheduled task 12 | : Verify it's running on R2, as apparently only R2 has the AD commands? 13 | : Determine password policy settings for FGPP users 14 | : better logging 15 | Rights Required : local admin on server it's running on 16 | Sched Task Req'd : Yes - install mode will automatically create scheduled task 17 | Lync Version : N/A 18 | Exchange Version : 2007 or later 19 | Author : M. Ali (original AD query), Pat Richard, Lync MVP 20 | Email/Blog/Twitter : pat@innervation.com https://ucunleashed.com @patrichard 21 | Dedicated Post : https://ucunleashed.com/318 22 | Disclaimer : You running this script means you won't blame me if this breaks your stuff. 23 | Acknowledgements : (original) http://blogs.msdn.com/b/adpowershell/archive/2010/02/26/find-out-when-your-password-expires.aspx 24 | : (date) http://technet.microsoft.com/en-us/library/ff730960.aspx 25 | : (calculating time) http://blogs.msdn.com/b/powershell/archive/2007/02/24/time-till-we-land.aspx 26 | : http://social.technet.microsoft.com/Forums/en-US/winserverpowershell/thread/23fc5ffb-7cff-4c09-bf3e-2f94e2061f29/ 27 | : http://blogs.msdn.com/b/adpowershell/archive/2010/02/26/find-out-when-your-password-expires.aspx 28 | : (password decryption) http://social.technet.microsoft.com/Forums/en-US/winserverpowershell/thread/f90bed75-475e-4f5f-94eb-60197efda6c6/ 29 | : (determine per user fine grained password settings) http://technet.microsoft.com/en-us/library/ee617255.aspx 30 | Assumptions : ExecutionPolicy of AllSigned (recommended), RemoteSigned or Unrestricted (not recommended) 31 | Limitations : 32 | Known issues : Doesn't get password complexity info for fine grained password policies (just default password policy for now) 33 | 34 | .LINK 35 | https://ucunleashed.com/318 36 | 37 | .INPUTS 38 | None. You cannot pipe objects to this script 39 | 40 | .EXAMPLE 41 | .\New-PasswordReminder.ps1 42 | 43 | Description 44 | ----------- 45 | Searches Active Directory for users who have passwords expiring soon, and emails them a reminder with instructions on how to change their password. 46 | 47 | .EXAMPLE 48 | .\New-PasswordReminder.ps1 -demo 49 | 50 | Description 51 | ----------- 52 | Searches Active Directory for users who have passwords expiring soon, and lists those users on the screen, along with days till expiration and policy setting 53 | 54 | .EXAMPLE 55 | .\New-PasswordReminder.ps1 -Preview -PreviewUser [username] 56 | 57 | Description 58 | ----------- 59 | Sends the HTML formatted email of the user specified via -PreviewUser. This is used to see what the HTML email will look like to the users. 60 | 61 | .EXAMPLE 62 | .\New-PasswordReminder.ps1 -install 63 | 64 | Description 65 | ----------- 66 | Creates the scheduled task for the script to run everyday at 6am. It will prompt for the password for the currently logged on user. It does NOT create the required Exchange receive connector. 67 | 68 | #> 69 | #Requires -Version 3.0 70 | 71 | [CmdletBinding(SupportsShouldProcess, DefaultParameterSetName = 'Default', HelpUri = 'https://ucunleashed.com/318')] 72 | param( 73 | # Runs the script in demo mode. No emails are sent to the user(s), and onscreen output includes those who are expiring soon. 74 | [Parameter(ValueFromPipelineByPropertyName, ParameterSetName = 'Demo')] 75 | [switch] $Demo, 76 | 77 | # Create the scheduled task to run the script daily. It does NOT create the required Exchange receive connector. 78 | [Parameter(ValueFromPipelineByPropertyName, ParameterSetName = 'Install')] 79 | [switch] $Install, 80 | 81 | # User name of user to send the preview email message to. 82 | [Parameter(ValueFromPipelineByPropertyName, ParameterSetName = 'Preview')] 83 | [string] $PreviewUser, 84 | 85 | # When specified, sends the email with no images, but keeps all other HTML formatting. 86 | [Parameter(ValueFromPipelineByPropertyName, ParameterSetName = 'Default')] 87 | [Parameter(ParameterSetName = 'Preview')] 88 | [switch] $NoImages 89 | ) 90 | Write-Verbose -Message 'Setting variables' 91 | [string] $Company = 'Contoso Ltd' 92 | [string] $OwaUrl = 'https://mail.contoso.com' 93 | [string] $PSEmailServer = '10.9.0.11' 94 | [string] $EmailFrom = 'Help Desk ' 95 | # Set the following to blank to exclude it from the emails 96 | [string] $HelpDeskPhone = '(586) 555-1010' 97 | # Set the following to blank to remove the link from the emails 98 | [string] $HelpDeskURL = 'https://intranet.contoso.com/' 99 | [string] $TranscriptFilename = $MyInvocation.MyCommand.Name + ' ' + $env:ComputerName + ' {0:yyyy-MM-dd hh-mmtt}.log' -f (Get-Date) 100 | [int] $global:UsersNotified = 0 101 | [int] $DaysToWarn = 14 102 | # Below path should be accessible by ALL users who may receive emails. This includes external/mobile users. 103 | [string] $ImagePath = 'http://www.contoso.com/images/' 104 | [string] $ScriptName = $MyInvocation.MyCommand.Name 105 | [string] $ScriptPathAndName = $MyInvocation.MyCommand.Definition 106 | [string] $ou 107 | # Change the following to alter the format of the date in the emails sent 108 | # See http://technet.microsoft.com/en-us/library/ee692801.aspx for more info 109 | [string] $DateFormat = 'd' 110 | 111 | if ($PreviewUser){ 112 | $Preview = $true 113 | } 114 | 115 | #region functions 116 | Write-Verbose -Message 'dot source functions' 117 | #dot source functions 118 | . $psscriptroot\functions\Set-ModuleStatus.ps1 119 | . $psscriptroot\functions\Remove-ScriptVariables.ps1 120 | . $psscriptroot\functions\Invoke-Installation.ps1 121 | . $psscriptroot\functions\Get-AdUserPasswordExpirationDate.ps1 122 | #endregion functions 123 | 124 | if ($install){ 125 | Write-Verbose -Message 'Install mode' 126 | Invoke-Installation 127 | Exit 128 | } 129 | 130 | Write-Verbose -Message 'Checking for ActiveDirectory module' 131 | if ((Set-ModuleStatus -name ActiveDirectory) -eq $false){ 132 | $error.clear() 133 | Write-Host 'Installing the Active Directory module...' -ForegroundColor yellow 134 | Set-ModuleStatus -Name ServerManager 135 | Add-WindowsFeature RSAT-AD-PowerShell 136 | if ($error){ 137 | Write-Host 'Active Directory module could not be installed. Exiting...' -ForegroundColor red 138 | if ($transcript){Stop-Transcript} 139 | exit 140 | } 141 | } 142 | Write-Verbose -Message 'Getting Domain functional level' 143 | $global:dfl = (Get-AdDomain).DomainMode 144 | # Get-ADUser -filter * -properties PasswordLastSet,EmailAddress,GivenName -SearchBase "OU=Users,DC=domain,DC=test" |foreach { 145 | if (!($PreviewUser)){ 146 | if ($ou){ 147 | Write-Verbose -Message "Filtering users to $ou" 148 | # $users = Get-AdUser -filter * -SearchScope subtree -SearchBase $ou -ResultSetSize $null 149 | $users = Get-AdUser -ldapfilter '(!(name=*$))' -SearchScope subtree -SearchBase $ou -ResultSetSize $null 150 | }else{ 151 | # $users = Get-AdUser -filter * -ResultSetSize $null 152 | $users = Get-AdUser -ldapfilter '(!(name=*$))' -ResultSetSize $null 153 | } 154 | }else{ 155 | Write-Verbose -Message 'Preview mode' 156 | $users = Get-AdUser $PreviewUser 157 | } 158 | if ($demo){ 159 | Write-Verbose -Message 'Demo mode' 160 | # $WhatIfPreference = $true 161 | Write-Output -InputObject "`n" 162 | Write-Host ('{0,-25}{1,-8}{2,-12}' -f 'User', 'Expires', 'Policy') -ForegroundColor cyan 163 | Write-Host ('{0,-25}{1,-8}{2,-12}' -f '========================', '=======', '===========') -ForegroundColor cyan 164 | } 165 | 166 | Write-Verbose -Message 'Setting event log configuration' 167 | [object]$evt = New-Object -TypeName System.Diagnostics.EventLog -ArgumentList ('Application') 168 | [string]$evt.Source = $ScriptName 169 | $infoevent = [Diagnostics.EventLogEntryType]::Information 170 | [string]$EventLogText = 'Beginning processing' 171 | # $evt.WriteEntry($EventLogText,$infoevent,70) 172 | 173 | Write-Verbose -Message 'Getting password policy configuration' 174 | $DefaultDomainPasswordPolicy = Get-ADDefaultDomainPasswordPolicy 175 | [int]$MinPasswordLength = $DefaultDomainPasswordPolicy.MinPasswordLength 176 | # this needs to look for FGPP, and then default to this if it doesn't exist 177 | [bool]$PasswordComplexity = $DefaultDomainPasswordPolicy.ComplexityEnabled 178 | [int]$PasswordHistory = $DefaultDomainPasswordPolicy.PasswordHistoryCount 179 | 180 | ForEach ($user in $users){ 181 | Get-ADUserPasswordExpirationDate $user.samaccountname 182 | } 183 | 184 | Write-Verbose -Message 'Writing summary event log entry' 185 | $EventLogText = "Finished processing $global:UsersNotified account(s). `n`nFor more information about this script, run Get-Help .\$ScriptName. See the blog post at https://ucunleashed.com/318." 186 | $evt.WriteEntry($EventLogText,$infoevent,70) 187 | 188 | # $WhatIfPreference = $false 189 | 190 | Remove-ScriptVariables -path $ScriptPathAndName 191 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # New-AdPasswordReminder 2 | PowerShell script to email users that their Active Directory password is soon expiring, along with info on how to change it. It is designed to run as a scheduled task on a server with the Active Directory PowerShell module installed. 3 | -------------------------------------------------------------------------------- /functions/Get-AdUserPasswordExpirationDate.ps1: -------------------------------------------------------------------------------- 1 | function Get-ADUserPasswordExpirationDate { 2 | [cmdletBinding(SupportsShouldProcess)] 3 | Param ( 4 | [Parameter(Mandatory, Position = 0, ValueFromPipeline, HelpMessage = 'Identity of the Account')] 5 | [Object]$accountIdentity 6 | ) 7 | PROCESS { 8 | Write-Verbose -Message "Getting the user info for $accountIdentity" 9 | $accountObj = Get-ADUser -Identity $accountIdentity -Properties PasswordExpired, PasswordNeverExpires, PasswordLastSet, Name, Mail 10 | # Make sure the password is not expired, and the account is not set to never expire 11 | Write-Verbose -Message 'verifying that the password is not expired, and the user is not set to PasswordNeverExpires' 12 | if (((-Not ($accountObj.PasswordExpired)) -and (-Not ($accountObj.PasswordNeverExpires))) -or ($PreviewUser)) { 13 | Write-Verbose -Message 'Verifying if the date the password was last set is available' 14 | $passwordSetDate = $accountObj.PasswordLastSet 15 | if ($passwordSetDate -ne $null) { 16 | $maxPasswordAgeTimeSpan = $null 17 | # see if we're at Windows2008 domain functional level, which supports granular password policies 18 | Write-Verbose -Message 'Determining domain functional level' 19 | if ($global:dfl -ge 4) { # 2008 Domain functional level 20 | $accountFGPP = Get-ADUserResultantPasswordPolicy -Identity $accountObj 21 | if ($accountFGPP -ne $null) { 22 | $maxPasswordAgeTimeSpan = $accountFGPP.MaxPasswordAge 23 | } else { 24 | $maxPasswordAgeTimeSpan = (Get-ADDefaultDomainPasswordPolicy).MaxPasswordAge 25 | } 26 | } else { # 2003 or ealier Domain Functional Level 27 | $maxPasswordAgeTimeSpan = (Get-ADDefaultDomainPasswordPolicy).MaxPasswordAge 28 | } 29 | if ($maxPasswordAgeTimeSpan -eq $null -or $maxPasswordAgeTimeSpan.TotalMilliseconds -ne 0) { 30 | $DaysTillExpire = [math]::round(((New-TimeSpan -Start (Get-Date) -End ($passwordSetDate + $maxPasswordAgeTimeSpan)).TotalDays),0) 31 | if ($preview){$DaysTillExpire = 1} 32 | if ($DaysTillExpire -le $DaysToWarn){ 33 | Write-Verbose -Message 'User should receive email' 34 | $PolicyDays = [math]::round((($maxPasswordAgeTimeSpan).TotalDays),0) 35 | if ($demo) {Write-Host ('{0,-25}{1,-8}{2,-12}' -f $accountObj.Name, $DaysTillExpire, $PolicyDays)} 36 | # start assembling email to user here 37 | $EmailName = $accountObj.Name 38 | $DateofExpiration = (Get-Date).AddDays($DaysTillExpire) 39 | $DateofExpiration = (Get-Date -Date ($DateofExpiration) -Format $DateFormat) 40 | 41 | Write-Verbose -Message 'Assembling email message' 42 | [string]$emailbody = @' 43 | 44 | 45 | 46 | 47 | 48 | 49 | '@ 50 | 51 | if (-Not ($NoImages)){ 52 | $emailbody += @" 53 | 54 | 55 | 57 | 58 | "@ 59 | 60 | if ($HelpDeskURL){ 61 | $emailbody += @" 62 | 63 | "@ 64 | }else{ 65 | $emailbody += @" 66 | 67 | "@ 68 | } 69 | 70 | $emailbody += @" 71 | 72 | 199 | 200 |
Description: $ImagePath/spacer.gif 56 |
Description: $ImagePath/header.gif
Description: $ImagePath/header.gif
73 | 74 | 75 | 76 | 77 | 171 | 172 | 173 | 174 |
Description: $ImagePath/spacer50.gifDescription: $ImagePath/spacer.gif 78 | "@ 79 | } 80 | if ($DaysTillExpire -le 1){ 81 | $emailbody += @" 82 |
83 | 84 | 85 | "@ 86 | if (-Not ($NoImages)){ 87 | $emailbody += @" 88 | 89 | "@ 90 | } 91 | $emailbody += @' 92 | 93 | '@ 94 | if (-Not ($NoImages)){ 95 | $emailbody += @" 96 | 97 | "@ 98 | } 99 | $emailbody += @' 100 | 101 |
Description: $ImagePath/image001b.gifALERT: You must change your password today or you will be locked out!Description: $ImagePath/image005b.gif
102 |
103 | '@ 104 | } 105 | 106 | $emailbody += @" 107 |

Hello, $EmailName,

108 |

It's change time again! Your $company password expires in  $DaysTillExpire  day(s), on $DateofExpiration.

109 |

Please use one of the methods below to update your password:

110 |
    111 |
  1. $company office computers and Terminal Server users: You may update your password on your computer by pressing Ctrl-Alt-Delete and selecting 'Change Password' from the available options. If you use a $company laptop in addition to a desktop PC, be sure and read #3 below.
  2. 112 |
  3. Remote Outlook Client, Mac, and/or Outlook Web App users: If you only access our email system, please use the following method to easily change your password:
  4. 113 |
      114 |
    • Log into Outlook Web App using Internet Explorer (PC) or Safari or Firefox (Mac).
    • 115 |
    • Click on the Options button in the upper right corner of the page.
    • 116 |
    • Select the "Change Password" link to change your password.
    • 117 |
    • Enter your current password, then your new password twice, and click Save
    • 118 |
    • NOTE: You will now need to use your new password when logging into Outlook Web App, Outlook 2010, SharePoint, Windows Mobile (ActiveSync) devices, etc. Blackberry Enterprise Users (BES) will not need to update their password. Blackberry Internet Service (BIS) users will be required to use their new password on their device.
    • 119 |
    120 |
  5. $company issued laptops: If you have been issued a $company laptop, you must be in a corporate office and directly connected to the company network to change your password. If you also use a desktop PC in the office, you must remember to always update your domain password on the laptop first. Your desktop will automatically use the new password.
  6. 121 |
      122 |
    • Log in on laptop
    • 123 |
    • Press Ctrl-Alt-Delete and select 'Change Password' from the available options.
    • 124 |
    • Make sure your workstation (if you have one) has been logged off any previous sessions so as to not cause conflict with your new password.
    • 125 |
    126 |
127 |

Think you've got a complex password? Run it through the The Password Meter

128 |

Think your password couldn't easily be hacked? See how long it would take: How Secure Is My Password

129 |

Remember, if you do not change your password before it expires on $DateofExpiration, you will be locked out of all $company Computer Systems until an Administrator unlocks your account.

130 |

If you are traveling or will not be able to bring your laptop into the office before your password expires, please call the number below for additional instructions.

131 |

You will continue to receive these emails daily until the password is changed or expires.

132 | 133 |

Thank you,
134 | The $company Help Desk
135 | $HelpDeskPhone

136 | "@ 137 | if ($accountFGPP -eq $null){ 138 | $emailbody += @" 139 | 140 | 141 | 164 | 165 |
$company Password Policy 142 |
    143 |
  • Your password must have a minimum of a $MinPasswordLength characters.
  • 144 |
  • You may not use a previous password.
  • 145 |
  • Your password must not contain parts of your first, last, or logon name.
  • 146 |
  • Your password must be changed every $PolicyDays days.
  • 147 | "@ 148 | 149 | if ($PasswordComplexity){ 150 | Write-Verbose -Message 'Password complexity' 151 | $emailbody += @' 152 |
  • Your password requires a minimum of two of the following three categories:
  • 153 |
      154 |
    • 1 upper case character (A-Z)
    • 155 |
    • 1 lower case character (a-z)
    • 156 |
    • 1 numeric character (0-9)
    • 157 |
    158 | '@ 159 | } 160 | $emailbody += @" 161 |
  • You may not reuse any of your last $PasswordHistory passwords
  • 162 |
163 |
166 | "@ 167 | } 168 | if (-Not ($NoImages)){ 169 | $emailbody += @" 170 |
Description: $ImagePath/spacer50.gif
175 | 176 | 177 | 178 | 179 | 180 | 181 | 182 | 183 | 195 | 196 | 197 |
Description: $ImagePath/spacer.gif

This email was sent by an automated process. 184 | "@ 185 | } 186 | if ($HelpDeskURL){ 187 | $emailbody += @" 188 | If you would like to comment on it, please visit click here 189 | "@ 190 | } 191 | if (-Not ($NoImages)){ 192 | $emailbody += @" 193 |

194 |
Description: $ImagePath/spacer.gif
198 |
201 | "@ 202 | } 203 | $emailbody += @' 204 | 205 | 206 | '@ 207 | if (-Not ($demo)){ 208 | $emailto = $accountObj.mail 209 | if ($emailto){ 210 | Write-Verbose -Message "Sending demo message to $emailto" 211 | Send-MailMessage -To $emailto -Subject "Your password expires in $DaysTillExpire day(s)" -Body $emailbody -From $EmailFrom -Priority High -BodyAsHtml 212 | $global:UsersNotified++ 213 | }else{ 214 | Write-Verbose -Message 'Can not email this user. Email address is blank' 215 | } 216 | } 217 | } 218 | } 219 | } 220 | } 221 | } 222 | } # end function Get-ADUserPasswordExpirationDate 223 | #endregion functions -------------------------------------------------------------------------------- /functions/Invoke-Installation.ps1: -------------------------------------------------------------------------------- 1 | function Invoke-Installation { 2 | [cmdletBinding(SupportsShouldProcess, HelpUri = 'http://technet.microsoft.com/en-us/library/cc725744(WS.10).aspx')] 3 | param() 4 | $error.clear() 5 | Write-Output -InputObject "Creating scheduled task `"$ScriptName`"..." 6 | $TaskCreds = Get-Credential -Credential ("$env:userdnsdomain\$env:username") 7 | $TaskPassword = [Runtime.InteropServices.Marshal]::PtrToStringAuto([Runtime.InteropServices.Marshal]::SecureStringToBSTR($TaskCreds.Password)) 8 | schtasks /create /tn $ScriptName /tr "$env:windir\system32\windowspowershell\v1.0\powershell.exe -noprofile -command $ScriptPathAndName" /sc Daily /st 06:00 /ru $TaskCreds.UserName /rp $TaskPassword | Out-Null 9 | if (-Not ($error)){ 10 | Write-Host 'Installation complete!' -ForegroundColor green 11 | }else{ 12 | Write-Host 'Installation failed!' -ForegroundColor red 13 | } 14 | Remove-Variable -Name taskpassword 15 | exit 16 | } # end function Invoke-Installation -------------------------------------------------------------------------------- /functions/Remove-ScriptVariables.ps1: -------------------------------------------------------------------------------- 1 | function Remove-ScriptVariables { 2 | [cmdletBinding(SupportsShouldProcess)] 3 | param( 4 | [string]$path 5 | ) 6 | $result = Get-Content -Path $path | 7 | ForEach-Object { 8 | if ( $_ -match '(\$.*?)\s*=') { 9 | $matches[1] | Where-Object { $_ -notlike '*.*' -and $_ -notmatch 'result' -and $_ -notmatch 'env:'} 10 | } 11 | } 12 | ForEach ($v in ($result | Sort-Object | Get-Unique)){ 13 | Remove-Variable -Name ($v.replace('$','')) -ErrorAction SilentlyContinue 14 | } 15 | } # end function Remove-ScriptVariables -------------------------------------------------------------------------------- /functions/Set-ModuleStatus.ps1: -------------------------------------------------------------------------------- 1 | function Set-ModuleStatus { 2 | [cmdletBinding(SupportsShouldProcess)] 3 | param ( 4 | [Parameter(ValueFromPipeline, ValueFromPipelineByPropertyName, Mandatory, HelpMessage = 'No module name specified!')] 5 | [string] $Name 6 | ) 7 | if(-Not (Get-Module -Name "$name")) { 8 | if(Get-Module -ListAvailable | Where-Object {$_.name -eq "$name"}) { 9 | Import-Module -Name "$name" 10 | # module was imported 11 | return $true 12 | } else { 13 | # module was not available (Windows feature isn't installed) 14 | return $false 15 | } 16 | }else { 17 | # module was already imported 18 | return $true 19 | } 20 | } # end function Set-ModuleStatus -------------------------------------------------------------------------------- /images/7-ChangePassword.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/patrichard/New-AdPasswordReminder/2e7d34a6930a39f69ed86d3b571a4d283629a115/images/7-ChangePassword.png -------------------------------------------------------------------------------- /images/OWA-ChangePassword.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/patrichard/New-AdPasswordReminder/2e7d34a6930a39f69ed86d3b571a4d283629a115/images/OWA-ChangePassword.png -------------------------------------------------------------------------------- /images/OWA-ChangePassword2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/patrichard/New-AdPasswordReminder/2e7d34a6930a39f69ed86d3b571a4d283629a115/images/OWA-ChangePassword2.png -------------------------------------------------------------------------------- /images/XP-ChangePassword.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/patrichard/New-AdPasswordReminder/2e7d34a6930a39f69ed86d3b571a4d283629a115/images/XP-ChangePassword.png -------------------------------------------------------------------------------- /images/footer.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/patrichard/New-AdPasswordReminder/2e7d34a6930a39f69ed86d3b571a4d283629a115/images/footer.gif -------------------------------------------------------------------------------- /images/header.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/patrichard/New-AdPasswordReminder/2e7d34a6930a39f69ed86d3b571a4d283629a115/images/header.gif -------------------------------------------------------------------------------- /images/image001b.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/patrichard/New-AdPasswordReminder/2e7d34a6930a39f69ed86d3b571a4d283629a115/images/image001b.gif -------------------------------------------------------------------------------- /images/image002.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/patrichard/New-AdPasswordReminder/2e7d34a6930a39f69ed86d3b571a4d283629a115/images/image002.gif -------------------------------------------------------------------------------- /images/image003.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/patrichard/New-AdPasswordReminder/2e7d34a6930a39f69ed86d3b571a4d283629a115/images/image003.png -------------------------------------------------------------------------------- /images/image004.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/patrichard/New-AdPasswordReminder/2e7d34a6930a39f69ed86d3b571a4d283629a115/images/image004.png -------------------------------------------------------------------------------- /images/image005b.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/patrichard/New-AdPasswordReminder/2e7d34a6930a39f69ed86d3b571a4d283629a115/images/image005b.gif -------------------------------------------------------------------------------- /images/spacer.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/patrichard/New-AdPasswordReminder/2e7d34a6930a39f69ed86d3b571a4d283629a115/images/spacer.gif -------------------------------------------------------------------------------- /images/spacer50.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/patrichard/New-AdPasswordReminder/2e7d34a6930a39f69ed86d3b571a4d283629a115/images/spacer50.gif --------------------------------------------------------------------------------