Functions/Get-PWADDSExpiringPassword.ps1

Function Get-PWADDSExpiringPassword {
    [cmdletbinding()]

    [OutputType([System.Collections.Generic.List[PSCustomObject]])]

    param (
        [int]$ExpireInDays = 30,

        [scriptblock]$ADFilter,

        [switch]$IncludeAll
    )
    begin {
    #ToDO
    # Email Attribute selection vs. current single attribute. Mail, custom attribute
    # Still needs logging
    }
    Process {
        # System Settings
        $Today = Get-Date
        # End System Settings
        if ($PSBoundParameters.ContainsKey('ADFilter' )) {
            $users = get-aduser -filter $ADFilter -Properties Name, PasswordNeverExpires, PasswordExpired, PasswordLastSet, EmailAddress
            if ($PSBoundParameters.ContainsKey('IncludeAll')) {
                $users = $users | Where-Object {$null -ne $PSItem.PasswordLastSet}
            }
            else {
                $users = $users | Where-Object { ($PSItem.Enabled -eq $true) -and ($PSItem.PasswordNeverExpires -eq $false) -and ($PSItem.PasswordExpired -eq $false) }
            }
        }
        else {
            $users = Get-ADUser -filter * -Properties Name, PasswordNeverExpires, PasswordExpired, PasswordLastSet, EmailAddress
            if ($PSBoundParameters.ContainsKey('IncludeAll')) {
                $users = $users | Where-Object {$null -ne $PSItem.PasswordLastSet}
            }
            else {
                $users = $users |  Where-Object { ($PSItem.Enabled -eq $true) -and ($PSItem.PasswordNeverExpires -eq $false) -and ($PSItem.PasswordExpired -eq $false) }
            }
        }
        $DefaultmaxPasswordAge = (Get-ADDefaultDomainPasswordPolicy).MaxPasswordAge

        $UserCollection = [System.Collections.Generic.List[pscustomobject]]::new()

        foreach ($user in $users) {
            Write-Verbose "$($user.Name)"
            $PasswordPol = (Get-AduserResultantPasswordPolicy $user)
            # Check for Fine Grained Password
            if ($PasswordPol) {
                $maxPasswordAge = ($PasswordPol).MaxPasswordAge
            }
            else{
                # No FGP set to Domain Default
                $maxPasswordAge = $DefaultmaxPasswordAge
            }
            $UserCollection.Add(
                [pscustomobject]@{
                    Name = $user.Name
                    EmailAddress = $user.EmailAddress
                    PasswordExpiresOn = $user.PasswordLastSet + $maxPasswordAge
                    PasswordDaystoExpire = (New-TimeSpan -Start $Today -End ($user.PasswordLastSet + $maxPasswordAge)).Days
                }
            )
        }
        return $UserCollection
    }
    end {}
}