Public/ActiveDirectory/Get-CredentialValidate.ps1
function Get-CredentialValidate { <# .SYNOPSIS Get domain credential. .DESCRIPTION Get and check domain credential. .PARAMETER UserName Specify UserName. .PARAMETER Credential Specify Credential as PSCredential. .EXAMPLE Get-CredentialValidate Get credential, check them and if correct pass them by. .EXAMPLE Get-CredentialValidate -Verbose Show login and password on the screen. Get credential, check them and pass them by if correct. .EXAMPLE $Credentials = Get-Credential Get-CredentialValidate -Credential $Credentials Check credential specify as parameter and if correct pass them by. #> [Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSPlaceCloseBrace', '')] [CmdletBinding(PositionalBinding = $false)] [OutputType([PSCredential])] param ( [Parameter()] [System.String]$UserName = "$env:USERDOMAIN\$env:USERNAME", [Parameter()] [System.Management.Automation.PSCredential]$Credential, [Parameter()] [System.String]$Message = 'Please provide credential:' ) Add-Type -AssemblyName System.DirectoryServices.AccountManagement if (-not $Credential) { Write-Verbose -Message 'Getting credential...' $Credential = Get-Credential -Message $Message -UserName $UserName $Password = $Credential.GetNetworkCredential().Password } #Checking if user exist by taking login from Credential if ($Credential) { $UserName = $Credential.UserName if ($UserName -like '*\*') { $DomainNetBIOS = $UserName.Split('\')[0] $Server = (Get-ADDomain $DomainNetBIOS).PDCEmulator $SamAccountName = $UserName.Split('\')[-1] } elseif ($UserName -like '*@*') { $DomainNetBIOS = $UserName.Split('@')[1] $Server = (Get-ADDomain $DomainNetBIOS).PDCEmulator $SamAccountName = $UserName.Split('@')[0] } else { $DomainNetBIOS = $env:USERDNSDOMAIN $Server = (Get-ADDomain $DomainNetBIOS).PDCEmulator $SamAccountName = $UserName } if ($DomainFQDN = (Get-ADDomain $DomainNetBIOS).DNSRoot) { Write-Verbose -Message "Fully qualified domain name found: '$DomainFQDN'" } else { $errMsg = "Fully qualified domain name of '$DomainNetBIOS' was found." Throw $errMsg } Write-Verbose -Message "Checking login: $SamAccountName, in domain: $DomainNetBIOS at server: $Server" if (Get-ADUser -Filter { SamAccountName -eq $SamAccountName } -Server $Server) { Write-Verbose -Message "Login $SamAccountName exist in $DomainNetBIOS" } else { $errMsg = "Login $SamAccountName doesn't exist in $DomainNetBIOS domain." Throw $errMsg } } else { $errMsg = 'No valid credential.' Throw $errMsg } #Checking Credential and doing loop if false do { Write-Verbose -Message 'Checking credential...' if ((-not $Check -and $Credential -and -not $Password) -and $DomainADSI) { Write-Verbose -Message 'Getting credential (password was empty)...' $UserName = $UserName $Credential = Get-Credential -Message 'Provide correct credential (password was empty):' -UserName $UserName } elseif ((-not $Check -and $Credential) -and $DomainADSI) { Write-Verbose -Message 'Getting credential (no valid login or password)...' $UserName = $UserName $Credential = Get-Credential -Message 'Provide correct credential (no valid login or password):' -UserName $UserName } else { Write-Verbose -Message 'Credential arguments provided (not empty).' } Write-Verbose -Message 'Validating...' $DomainADSI = "LDAP://" + $DomainFQDN $UserName = $Credential.UserName $Password = $Credential.GetNetworkCredential().Password $Check = (New-Object System.DirectoryServices.DirectoryEntry($DomainADSI, $UserName, $Password)).distinguishedName } while ( -not $Check -or -not $Password ) Write-Verbose -Message "Login: $UserName, Password: $Password" $Credential } |