This script retrieves all Active Directory users along with their properties such as proxy addresses, userPrincipalName, and last logon timestamp. It compares each user's `userPrincipalName` (UPN) with their primary email address (extracted from the `proxyAddresses` field). If the primary email and UPN differ, the script flags the user by adding a `ChangeUPN` property. The script also calculates and formats the `LastLogonTimeStamp` for each user. It includes optional logic to update UPNs, but this part is currently commented out.
Here is the script:
#$exclude = "DiscoverySearchMailbox {D919BA05-46A6-415f-80AD-7E09334BB852}","Administrator","Public Folder"$allUsers = Get-ADUser -f * -SearchBase "CN=Users,DC=XXX-Forest,DC=local" -Properties proxyAddresses,mail,userPrincipalName,lastlogontimestamp
$Property = $allUsers | Get-Member -Type Property |Where-Object Name -ne "LastLogonTimeStamp"|Select-Object -ExpandProperty Name$Property += @{Name="LastLogonTimeStamp";Expression={([datetime]::FromFileTime($_.LastLogonTimeStamp))}}$allUsers = $allUsers | Select-Object -Property $Property#$AllUsersToChangeUPN = @()
$allUsers | ForEach-Object {# if($_.name -notin $exclude){ $UPN = $_.userPrincipalName $PEmail = $_.proxyAddresses | Where-Object {$_ -CLike "SMTP:*"} if($PEmail) { $PEmail = ($PEmail.split(':'))[1] if($PEmail -ne $UPN) { #Write-Host "UPN: $UPN diffent then Email: $PEmail" #$AllUsersToChangeUPN += $_ $ChangeUPN = $true } else { $ChangeUPN = $false } }# } $_ | Add-Member -Name 'PrimaryEmail' -Value $PEmail -MemberType NoteProperty $_ | Add-Member -Name 'ChangeUPN' -Value $ChangeUPN -MemberType NoteProperty}
<#$AllUsersToChangeUPN | ForEach-Object { $PEmail = $_.proxyAddresses | Where-Object {$_ -CLike "SMTP:*"} $_ | Set-ADUser -UserPrincipalName $PEmail -WhatIf}
$allUsers = Get-ADUser -f * -SearchBase "CN=Users,DC=xxx-Forest,DC=local" -Properties lastlogontimestamp,proxyAddresses,mail,userPrincipalName $Property = $allUsers | Get-Member -Type Property |Where-Object Name -ne "LastLogonTimeStamp"|Select-Object -ExpandProperty Name$Property += @{Name="LastLogonTimeStamp";Expression={([datetime]::FromFileTime($_.LastLogonTimeStamp))}}$allUsers = $allUsers | Select-Object -Property $Property
$Now = Get-Date$date = $Now.AddMonths(-8)$allUsers | Where-Object LastLogonTimeStamp -lt $date | Where-Object Enabled | ft -AutoSize Name,LastLogonTimeStamp,Enabled#>
Help Center