How to Filter AD Users Who Haven’t Changed Their Password Since a Certain Date?

0
4
Asked By CuriousCoder123 On

I'm working with a new product from our cyber team that helps identify users whose passwords have been compromised in breaches. Every week, we get a list of around 50-100 users who need to have their passwords reset. Unfortunately, our setup doesn't allow us to enforce a mandatory password change at the next logon. To manage this, I'm taking the user names that need to be contacted and running some PowerShell commands to check which ones haven't reset their passwords since the alert came in.

In a SQL environment, I could easily run a query to check the password status like this:

`SELECT Name, SamAccountName, UserPrincipalName, PasswordLastSet FROM ADUser WHERE (Name in ('User1', 'User2', 'User3') AND PasswordLastSet < 'datetime')`

Now, I'm trying to replicate this in PowerShell with the following code:

`$passwordChangeDate = [DateTime] "datetime"`
`$userList = @("user1","user2","user3")`
`$userList | Get-ADUser -Filter '(PasswordLastSet -lt $passwordChangeDate)' -Properties * | Select-Object Name, SamAccountName, UserPrincipalName, PasswordLastSet`

But it doesn't seem to work. What am I missing? Any suggestions would be appreciated!

Also, I tried to import a CSV file of usernames but faced the same issue, as it returned all users instead of just the ones from the list.

5 Answers

Answered By CSVExpert On

I had a similar scenario, and this script worked well for me to output users to a CSV. It checks each user against the password change date. Here’s a quick example:

```powershell
$passwordChangeDate = Get-Date "2024-04-01"
$userList = @("user1","user2","user3")

$output = foreach ($user in $userList) {
$adUser = Get-ADUser -Identity $user -Properties PasswordLastSet
if ($adUser.PasswordLastSet -lt $passwordChangeDate) {
[PSCustomObject]@{
Name = $adUser.Name
SamAccountName = $adUser.SamAccountName
UserPrincipalName = $adUser.UserPrincipalName
PasswordLastSet = $adUser.PasswordLastSet
}
}
}

$output | Export-Csv -Path "C:PathToOutput.csv"
```

DataDrivenDev -

This method of building PSObjects is very effective, especially when you need specific properties in your output.

Answered By TechSavvy14 On

You might need to have the Remote Server Administration Tools (RSAT) installed on the machine where you’re running this command. Try this command instead:

`$date =(get-date).AddDays(-180); Get-AdUser -Properties PasswordLastSet -Filter {(PasswordLastSet -le $date) -and (Enabled -eq $True)} | Select-Object Name, UserPrincipalName, PasswordLastSet`

QueryNinja88 -

Why is '-Properties PasswordLastSet' necessary in this command?

PowerUser007 -

This doesn't take into account your specific user list. It's querying all of AD without your filtered names.

Answered By Troubleshooter22 On

Make sure each part of your script works correctly. Start with retrieving the users without applying a filter, and then filter the results with `Where-Object`:

```powershell
$username_list = @("Alice", "Bob", "Charlie")
$users = $username_list | ForEach-Object { Get-ADUser -Identity $_ -Property * }
```

Answered By ScriptMaster99 On

There are a couple of things to check. First, ensure you're using double quotes in your filters for proper string interpolation, like this:

`-Filter "PasswordLastSet -lt '$passwordChangeDate'"`

Also, avoid using `SELECT *`. Just specify the properties you need with `-Properties Name, SamAccountName, UserPrincipalName, PasswordLastSet`. This helps in making your command cleaner and faster.

SystemUser001 -

It’s important to select only the properties you need for efficient processing.

PowershellNewbie -

Just a note, the double quotes might work, but I had issues validating that with pwsh7. What did you find?

Answered By DirectAccessDev On

To streamline your approach, you could directly use:

`$userList | Get-AdUser -Properties Name, SamAccountName, UserPrincipalName, PasswordLastSet`

But remember, you can’t use the `-Filter` parameter at the same time. Instead, filter afterward based on the password date like this:

`... | Where-Object { $_.PasswordLastSet -lt $cutoffdate }`

Related Questions

LEAVE A REPLY

Please enter your comment!
Please enter your name here

This site uses Akismet to reduce spam. Learn how your comment data is processed.