Public/Get-LPCredential.ps1
<#
.Synopsis Returns a PSCredential object for a URL .DESCRIPTION Performs a regular expression match on a URL to create strings for various fuzzy matching scenarios, then returns an array of PSCredential objects that match the given URL. Optionally return only one entry. .EXAMPLE Get-LPCredential #> function Get-LPCredential { [CmdletBinding(PositionalBinding=$true, DefaultParameterSetName='URL', ConfirmImpact='Low')] [Alias("lastpass")] Param ( # URL to find a credential for [Parameter(Mandatory=$true, ParameterSetName='URL', Position=0, ValueFromPipelineByPropertyName=$true, ValueFromPipeline=$true)] [ValidateNotNull()] [ValidateNotNullOrEmpty()] [String] $URL, # Only return the first result [Parameter()] [switch] $First, # Force a refresh [Parameter()] [Switch] $Refresh ) Begin { if (!$LPVault) { $LPVault = Get-LPVault } if (!$LPKeys) { $LPKeys = Get-LPKeys } if (!$LPAccounts -or $Refresh) { $LPAccounts = Get-LPAccounts -Refresh:$Refresh } } Process { if (!($URL -match '(((((?:\w+\:\/\/)?(((?:\d{1,3}\.){3}\d{1,3})|(?:\w+\.)*((?:\w+\.)(?:\w+))|\w+))(?:\:\d+)?)(?:\/[^\?\.]*)*(?:\/)?(?:[-\w\.]*)?)(?:\??[^\/]*)?)?')) { throw "Bad URL format" } Write-Verbose "Searching through $($LPAccounts.Count) accounts" foreach ($match in $matches.GetEnumerator()) { Write-Verbose "Searching for: $($match.Value)" $Candidates = @($LPAccounts | Where-Object PSCredential -NE $null | Where-Object {$_.URL -like "*$($match.Value)" -or $_.URL -like "*$($match.Value)/*" -or $_.URL -like "*$($match.Value):*"}) Write-Verbose "Found $($Candidates.Count) candidates" if ($Candidates.Count -gt 0) { if ($First) { return $($Candidates.PSCredential | Select-Object -First 1) } else { return $Candidates.PSCredential } } } throw "No matches found in LastPass vault" } } |