Uragan66, например:
Код:

function Get-RandomPass {
[CmdletBinding()]
param(
[Parameter()][Byte]$Length = 8, # немного сэкономим на памяти
[Parameter()][ValidateSet('U', 'L', 'N', 'S')][Alias('c')]
[Char[]]$CharSets = 'ULNS',
[Parameter()][Byte]$NumLimit = 3
)
end {
if ($NumLimit -ge $Length) {
throw [InvalidOperationException]::new('Вне массива.')
}
$arr = [Linq.Enumerable]::SelectMany(
[Object[]]@{U='A'..'Z';L='a'..'z';N=( # сразу ограничиваем количество цифр
Get-Random ('0'..'9') -Count $NumLimit
);S=('!'..'z').Where{$_ -notmatch '[0-9a-z]'}
}[[String[]]$CharSets], [Func[Object, [Object[]]]]{$args[0]}
).ToArray()
-join (Get-Random (( # просто перемешиваем полученный массив
Get-Random $arr[0..($arr.Length - $NumLimit - 1)] -Count ($Length - $NumLimit)
) + $arr[($NumLimit * -1)..-1]) -Shuffle)
}
}
Пример использования:
Код:

Get-RandomPass -c lsn
Прочую мишуру навесите сами.