• Home
  • PowerShell
  • How to get an AD user account expiration date using PowerShell

How to get an AD user account expiration date using PowerShell

The Get-ADUser cmdlet with AccountExpirationDate property is fundamental for managing expired user accounts in Active Directory. Whether you need to export expired AD users PowerShell reports for compliance, create an account expiration report PowerShell script for auditing, or generate expired accounts CSV files for cleanup operations, this cmdlet provides essential data. However, filtering expired users, handling date comparisons, and performing PowerShell expired user export across multiple domains requires careful scripting and proper date manipulation.

Configuring password expiration for AD users

The PasswordNeverExpires property determines whether a user's password follows the domain's policy. Setting it to False ensures the password will expire according to the domain's policy. In rare cases like service accounts, hardcoded credentials, or legacy apps that may break if passwords change, you may need to set PasswordNeverExpires to True so the password never expires.

PowerShell

Steps to obtain the Account Expired Users report using PowerShell:

  1. Identify the domain from which you want to retrieve the report.
  2. Identify the LDAP attributes you need to fetch the report.
  3. Identify the primary DC to retrieve the report.
  4. Compile the script.
  5. The script should contain functions to identify the account expiration date by the conditions such as Account Expiration Date LDAP value not equal to Null and Account Expiration Date LDAP less than equal to the current date.
  6. Execute it in Windows PowerShell.
  7. To obtain the report in a different format, modify the script according to the needs of the user.
$OutFile = 'C:\Scripts\AccountExpiredUsers.csv' # your output file
Get-ADUser -Filter * -Properties Name, Enabled, AccountExpirationDate, LastLogonDate | ? {($_.AccountExpirationDate -NE $NULL -AND $_.AccountExpirationDate -LT (Get-Date)) } | foreach {Add-Content -path $OutFile "$($_.Name),$($_.Enabled)"}
ADManager Plus

Finding expired AD users with ADManager Plus:

  1. Navigate to the Reports tab > User Reports > Account expired users.
  2. Select the required domain and OU. Click Generate.
  3. After the report generates, click Export As to download in HTML, CSV, XLS, or PDF.

Example use cases and scripts

Example 1: Export all currently expired user accounts

Generate a basic Get-ADUser expired accounts report showing all expired users.

Get-ADUser -Filter {AccountExpirationDate -lt (Get-Date)} -Properties AccountExpirationDate | Select Name,SamAccountName,AccountExpirationDate | Export-CSV "C:\ExpiredAccounts.csv" -NoTypeInformation

This command identifies all users with accounts that have passed their expiration date.

Example 2: Find accounts that expired in the last 30 days

Create a PowerShell list expired users script for recently expired accounts.

$30DaysAgo = (Get-Date).AddDays(-30)
Get-ADUser -Filter {AccountExpirationDate -lt (Get-Date) -and AccountExpirationDate -gt $30DaysAgo} -Properties AccountExpirationDate,Department | Export-CSV "C:\RecentlyExpired.csv" -NoTypeInformation

This account expiration report PowerShell helps identify recently expired accounts for potential reactivation.

Example 3: Find accounts expiring within the next 7 days

Create a proactive PowerShell AccountExpirationDate query for upcoming expirations.

$NextWeek = (Get-Date).AddDays(7)
Get-ADUser -Filter {AccountExpirationDate -gt (Get-Date) -and AccountExpirationDate -lt $NextWeek} -Properties AccountExpirationDate,EmailAddress | Export-CSV "C:\ExpiringNext7Days.csv" -NoTypeInformation

This helps prevent service disruptions by identifying soon-to-expire accounts.

Supported parameters

Parameters Description
-Filter Essential for comparing AccountExpirationDate with current or specific dates
-SearchBase Specifies the OU or container to search for expired accounts
-SearchScope Controls search depth when looking for expired users
-Properties Must include AccountExpirationDate as it's not returned by default
-LDAPFilter Enables complex LDAP queries for sophisticated expiration filtering
-ResultPageSize Manages pagination for large expired user queries
-Credential Provides alternate credentials for accessing expired user information

Troubleshooting common expired account export issues

Error: No results returned when filtering expired accounts.

  • Cause: AccountExpirationDate is null for users without expiration.
  • Solution: Filter out null values explicitly:
Get-ADUser -Filter {AccountExpirationDate -like "*" -and AccountExpirationDate -lt (Get-Date)}

Error: Date comparison is not working correctly.

  • Cause: AccountExpirationDate format issues or timezone problems.
  • Solution: Use proper DateTime comparison:
Get-ADUser -Filter * -Properties AccountExpirationDate | Where {$_.AccountExpirationDate -ne $null -and $_.AccountExpirationDate -lt (Get-Date)}

Error: Export shows date and time in unexpected format.

  • Cause: Default date and time formatting in Export-CSV.
  • Solution: Format dates before export:
Get-ADUser -Filter {AccountExpirationDate -lt (Get-Date)} -Properties AccountExpirationDate |
Select Name,@{N='ExpirationDate';E={$_.AccountExpirationDate.ToString('yyyy-MM-dd')}} |
Export-CSV "C:\ExpiredUsers.csv" -NoTypeInformation

Error: A positional parameter cannot be found.

  • Cause: Incorrect filter syntax for AccountExpirationDate.
  • Solution: Use proper filter block syntax:
Get-ADUser -Filter {AccountExpirationDate -lt (Get-Date)} # Correct
# Not: Get-ADUser -Filter "AccountExpirationDate -lt (Get-Date)" # Incorrect

Best practices for expired account reporting

  • Include buffer period: Check accounts expired within specific timeframes for better management.
  • Regular scheduling: Run expired account reports weekly or monthly for timely cleanup.
  • Include metadata: Add LastLogonDate and WhenChanged to make informed decisions.
  • Separate by account type: Filter service accounts, user accounts, and admin accounts separately.

Limitation of using PowerShell for expired account reports

  • Manual date calculations: Calculating days since the user account has expired requires additional scripting and date arithmetic.
  • No visual indicators: Cannot create visual dashboards showing expiration trends without additional tools.
  • Complex scheduling setup: Automated reports require complex configuration and maintenance.
  • Limited notification options: No built-in alerting for upcoming or recent expirations.
  • Performance issues: Large queries for expired AD accounts PowerShell can timeout without optimization.
  • No approval workflow: Cannot integrate approval processes for account extension or deletion.
  • Format restrictions: Export of the expired AD users PowerShell report is limited to basic CSV without formatting.
  • No historical tracking: Cannot track expiration history or patterns without custom logging.

Highlights of using ADManager Plus for expired account reporting

  • Automated expiration monitoring: Real-time tracking of account expired users without any complicated PowerShell scripting.
  • Bulk account management: Process multiple expired user accounts easily with bulk management actions.
  • Compliance reporting: Built-in reports for SOX, HIPAA, the PCI DSS, and other compliance regulations.
  • Historical audit trail: Track all actions taken on expired accounts for accountability.
  • Integration capabilities: Connect with ticketing systems for automated expiration workflows.
  • Export flexibility: Export the report to multiple formats such as PDF, CSV, HTML, and XLS.

Generate and export account expired users report with ADManager Plus

FAQs

AccountExpirationDate and PasswordExpiration serve different purposes:

  • AccountExpirationDate: Controls when the entire user account becomes invalid and cannot authenticate.
  • PasswordExpiration: Indicates when the password needs to be changed, but the account remains active.

To get both expiration dates:

Get-ADUser -Identity "username" -Properties AccountExpirationDate, PasswordLastSet, PasswordNeverExpires |
Select Name, AccountExpirationDate, @{N='PasswordExpiration';E={if($_.PasswordNeverExpires) {'Never'} else {$_.PasswordLastSet.AddDays(90)}}}

Common causes and solutions:

  • Null values: Many accounts don't have expiration dates set.

To filter out null values explicitly

Get-ADUser -Filter * -Properties AccountExpirationDate |
Where-Object {$_.AccountExpirationDate -ne $null -and $_.AccountExpirationDate -lt (Get-Date)}
  • Incorrect filter syntax: Use script blocks with curly braces.

Correct syntax:

Get-ADUser -Filter {AccountExpirationDate -lt (Get-Date)}

Incorrect syntax:

Get-ADUser -Filter "AccountExpirationDate -lt (Get-Date)"

When Active Directory Users and Computers shows "Never", the AccountExpirationDate is actually null:

To find users with no expiration date:

Get-ADUser -Filter * -Properties AccountExpirationDate |
Where-Object {$_.AccountExpirationDate -eq $null} |
Select Name, SamAccountName, @{N='ExpirationStatus';E={'Never Expires'}}

To set expiration date for users without one:

Get-ADUser -Filter {AccountExpirationDate -notlike "*"} |
Set-ADUser -AccountExpirationDate (Get-Date).AddDays(90)

Use date arithmetic to calculate remaining days:

Get-ADUser -Filter {AccountExpirationDate -like "*"} -Properties AccountExpirationDate |
Select Name, AccountExpirationDate, @{N='DaysUntilExpiration';E={
if($_.AccountExpirationDate -gt (Get-Date)) {
($_.AccountExpirationDate - (Get-Date)).Days
} else {
"Already Expired"
}
}} | Sort-Object DaysUntilExpiration

Yes, you can extend expiration dates for multiple accounts.

To extend all expiring accounts by 30 days:

$NextMonth = (Get-Date).AddDays(30)
Get-ADUser -Filter {AccountExpirationDate -lt $NextMonth -and AccountExpirationDate -gt (Get-Date)} -Properties AccountExpirationDate |
ForEach-Object {
Set-ADUser $_ -AccountExpirationDate $_.AccountExpirationDate.AddDays(30)
Write-Host "Extended $($_.Name) until $($_.AccountExpirationDate.AddDays(30))"
}
The one-stop solution to Active Directory Management and Reporting
Email Download Link