ps/Modules/Alkami.DevOps.SystemEngineering/Public/New-SftpPasswordHash.ps1

67 lines
2.1 KiB
PowerShell
Raw Normal View History

2023-05-30 22:51:22 -07:00
function New-SftpPasswordHash {
<#
.SYNOPSIS
Generates a password hash for use by SFTP functions.
.PARAMETER Password
[string] The password to hash.
.EXAMPLE
New-SftpPasswordHash -Password "Example"
#>
[CmdletBinding()]
[OutputType([string])]
param(
[Parameter(Mandatory = $true)]
[ValidateNotNullOrEmpty()]
[string]$Password
)
$logLead = Get-LogLeadName
$scriptBlock = {
$modulePath = $args[0]
$password = $args[1]
Import-Module $modulePath
return (New-PasswordHash $password)
}
# Primary directory for DLL based on installed module paths.
$dllPath = [IO.Path]::Combine( "$PSScriptRoot", 'Resources', 'EncryptPassword.dll' )
if ( $false -eq ( Test-Path $dllPath ) ) {
# Fallback directory for local testing of this function.
$dllPath = [IO.Path]::Combine( "$PSScriptRoot", '..', 'Resources', 'EncryptPassword.dll' )
}
if ( $false -eq ( Test-Path $dllPath ) ) {
Write-Error "$logLead : Unable to find EncryptPassword.dll! Check your module path and retry."
return $null
}
# Wrap the call in a PSSession to prevent the DLL from being loaded into our general context.
# If we load the DLL in a new session, the DLL is unloaded when we destroy the session.
#
# Note that wrapping this functionality in an Invoke-Command does not yield a string; it only yields
# an object that behaves like a string unless it is unwrapped by 'ConvertTo-Json'.
#
# To see this for yourself, run the following command:
# ConvertTo-Json ( Invoke-Command -ComputerName localhost -ScriptBlock { return 'Test' })
#
# To avoid this behavior, we cast the result to a string which appears to trim off those extra properties.
#
# To see this for yourself, run the following command:
# ConvertTo-Json ([string](Invoke-Command -ComputerName localhost -ScriptBlock { return 'Test' }))
$tempSession = New-PSSession
[string]$result = Invoke-Command -Session $tempSession -ScriptBlock $scriptBlock -ArgumentList @( $dllPath, $Password )
Remove-PSSession -Session $tempSession
return $result
}