Public/Get-RealLockoutState.ps1
function Get-RealLockoutState { [CmdletBinding()] Param ( [Parameter(Mandatory = $true, Position = 0)] [String]$SAMAccountName, [Parameter(Mandatory = $false, Position = 1)] [String]$Domain = (Get-WmiObject Win32_ComputerSystem | Select-Object -ExpandProperty Domain) ) # Pull out all of the dc's in the domain. [array]$dcList = Get-DirectoryServicesDomainController -Domain $Domain | Select-Object -ExpandProperty Name Write-Verbose -Message ('[GetRealLogonDate] Found {0} DCs in {1}' -f $dcList.count, $Domain) # Define a script block which we'll use to feed into a job. $queryBlock = [scriptblock]::Create(" #Initialize Record `$ThisRecord = [ordered]@{ User = [string]'$SAMAccountName'.ToLower(); 'Lockout Time' = `$null; 'Domain Controller' = [string]`$_.ToLower(); } # Search the individual domain controller for the user in question `$searcher = new-object System.DirectoryServices.DirectorySearcher([ADSI]""LDAP://`$_"") `$searcher.filter = '(&(objectClass=User)(SAMAccountName=$SAMAccountName))' #[void]`$searcher.PropertiesToLoad.Add('lockouttime') try { `$ThisRecord.'Lockout Time' = [datetime]::FromFileTime([int64]::Parse(`$searcher.FindOne().Properties.lockouttime)) } catch { return `$null } if (`$ThisRecord.'Lockout Time' -eq [datetime]::FromFileTime(0)){ Write-Verbose -Message ""User not locked out on: `$_"" `$ThisRecord.'Lockout Time' = `$null } New-Object -TypeName PSObject -Property `$ThisRecord ") # Go through each DC in the list and query for the user account. Write-Verbose -Message "`r`n$($(($QueryResult = ($dcList | Invoke-Parallel -ScriptBlock $queryBlock -ImportVariables) | Sort-Object -Property 'Domain Controller')) | Format-Table -AutoSize | Out-String)" $QueryResult | Sort-Object 'Lockout Time' -Descending | Select-Object -First 1 } |