DictionaryFile.psm1

function Get-PasswordNumber {
<#
.SYNOPSIS

Calculates the number of possible passwords

.DESCRIPTION

Calculates the number of possible passwords based
on the input so you will know the actual number before
you proceed to create your dictionary file.

.PARAMETER CharacterSet

Specifies the characters (letters, numbers, symbols) that
need to be included. Parameter is mandatory.

.PARAMETER MinCharacters

Specifies the minimum characters of the generated passwords.
Parameter is mandatory.

.PARAMETER MaxCharacters

Specifies the maximum characters of the generated passwords.
Parameter is mandatory.

.PARAMETER IncludeCapital

Specifies whether or not to include upper case letters along with
the lower case letters.

.PARAMETER CapitalOnly

Specifies whether or not all lower case letters to be converted to
upper case letters.

.INPUTS

System.String. Get-PasswordNumber can accept a string value to
determine the CharacterSet parameter.

.OUTPUTS

System.Double. Get-PasswordNumber returns the number of passwords that
can be created.

.EXAMPLE

PS C:\> Get-PasswordNumber -CharacterSet "a,b,c,1,2,3,$,*,&" -MinCharacters 2 -MaxCharacters 5
66420

.EXAMPLE

PS C:\> Get-PasswordNumber -Characters "a,b,c,1,2,3,$,*,&" -MinCharacters 2 -MaxCharacters 5 -IncludeCapital
271440

.EXAMPLE

PS C:\> Get-PasswordNumber -Characters "a,b,c,1,2,3,$,*,&" -MinCharacters 2 -MaxCharacters 5 -CapitalOnly
66420

.EXAMPLE

PS C:\> Get-PasswordNumber -Characters alphabet -MinCharacters 2 -MaxCharacters 5
12356604

.EXAMPLE

PS C:\> Get-PasswordNumber "av,b,c" -MinCharacters 2 -MaxCharacters 2
9

.EXAMPLE

PS C:\> "a,b,c" | Get-PasswordNumber -MinCharacters 2 -MaxCharacters 2
9

.EXAMPLE

PS C:\> Get-PasswordNumber -CharacterSet "ad,b,c" -MinCharacters 2 -MaxCharacters 2 | ForEach-Object {$_ * 2}
18

.LINK

https://www.sconstantinou.com/get-passwordnumber

.LINK

Get-PasswordCombination

.LINK

New-DictionaryFile

.LINK

Get-DictionaryFile
#>


    [cmdletbinding()]

    param(
        [parameter(Mandatory = $true,ValueFromPipeline = $true)][alias("c")][String]$CharacterSet,
        [parameter(Mandatory = $true)][alias("min")][Uint32]$MinCharacters,
        [parameter(Mandatory = $true)][alias("max")][Uint32]$MaxCharacters,
        [alias("ic")][switch]$IncludeCapital,
        [alias("co")][switch]$CapitalOnly)

    if ($MinCharacters -eq "0"){
        throw "MinCharacters value cannot zero."
    }

    if ($CharacterSet -eq "alphabet"){
        $CharacterSet = "a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z"
    }

    if ($CapitalOnly -eq $True){
        $CharacterSet = $CharacterSet.ToUpper()
    }

    if ($IncludeCapital -eq $True){
        $CharactersCapital = $CharacterSet.ToUpper()
        $CharacterSetLow = $CharacterSet
        $CharacterSet = ""
        $CharacterSet = $CharacterSetLow, $CharactersCapital -join ","
    }

    $pool = $CharacterSet -split ','
    $pool = $pool | Select-Object -Unique
    [Uint32]$n = $pool.count

    switch ($MinCharacters){
        {$_ -eq $MaxCharacters}{
            [Uint32]$n = $pool.count
            [Uint32]$r = $_
            [Double]$TotalPossibilities = [math]::Pow($n,$r)
            Write-Output $TotalPossibilities
        }
        {$_ -gt $MaxCharacters}{
            throw "MinCharacters value cannot be greater than MaxCharacters value"
        }
        {$_ -lt $MaxCharacters}{
            [int]$TotalPossibilities = 0

            for ($i = $MinCharacters;$i -le $MaxCharacters; $i++){
                [Uint32]$n = $pool.count
                [Uint32]$r = $i
                [Double]$TempPossibilities = [math]::Pow($n,$r)
                [Double]$TotalPossibilities = $TotalPossibilities + $TempPossibilities
            }

            Write-Output $TotalPossibilities
        }
    }
}
New-Alias -Name gpn -Value Get-PasswordNumber

Function Get-Password {

    Param(
        [Object[]]$FullSet,
        [String]$Comma,
        [Uint32]$CurrentIndex = 0,
        [String]$TemporaryText = "",
        [String]$OutFile)

    $MaximumIndex = $FullSet.Count - 1

    foreach ($_ in $FullSet[$CurrentIndex]){
        [Array]$Password = "$($TemporaryText)$($Comma)$($_)".Trim($Comma)

        If ($CurrentIndex -lt $MaximumIndex) {
            $Password = Get-Password $FullSet -CurrentIndex ($CurrentIndex + 1) -TemporaryText $Password -OutFile $OutFile
        }

        if ($OutFile -eq ""){Write-Output $Password}
        else{Add-Content -Path $OutFile -Value $Password}
    }
}

function Get-PasswordCombination {
<#
.SYNOPSIS

Creates all possbile passwords

.DESCRIPTION

Creates all possible passowrds based on your input
and provides the results in output.

.PARAMETER CharacterSet

Specifies the characters (letters, numbers, symbols) that
need to be included. Parameter is mandatory.

.PARAMETER MinCharacters

Specifies the minimum characters of the generated passwords.
Parameter is mandatory.

.PARAMETER MaxCharacters

Specifies the maximum characters of the generated passwords.
Parameter is mandatory.

.PARAMETER IncludeCapital

Specifies whether or not to include upper case letters along with
the lower case letters.

.PARAMETER CapitalOnly

Specifies whether or not all lower case letters to be converted to
upper case letters.

.INPUTS

System.String. Get-PasswordCombination can accept a string value to
determine the CharacterSet parameter.

.OUTPUTS

System.String. Get-PasswordCombination returns the generated password.

.EXAMPLE

PS C:\> Get-PasswordCombination -CharacterSet "a,b,c" -MinCharacters 1 -MaxCharacters 2
a
b
c
aa
ab
ac
ba
bb
bc
ca
cb
cc

.EXAMPLE

PS C:\> Get-PasswordCombination -CharacterSet "a,b,c" -MinCharacters 1 -MaxCharacters 2 -IncludeCapital
a
b
c
A
B
C
aa
ab
ac
aA
aB
aC
ba
bb
bc
bA
bB
bC
ca
cb
cc
cA
cB
cC
Aa
Ab
Ac
AA
AB
AC
Ba
Bb
Bc
BA
BB
BC
Ca
Cb
Cc
CA
CB
CC

.EXAMPLE

PS C:\> Get-PasswordCombination -CharacterSet "a,b,c" -MinCharacters 1 -MaxCharacters 2 -CapitalOnly
A
B
C
AA
AB
AC
BA
BB
BC
CA
CB
CC

.EXAMPLE

PS C:\> Get-PasswordCombination -CharacterSet "alphabet" -MinCharacters 1 -MaxCharacters 3
a
b
c
d
e
f
g
h
i
j
k
l
m
n
...
xu
xv
xw
xx
xy
xz
ya
yb
yc
yd
ye
yf
yg
...
zzz

.EXAMPLE

PS C:\> Get-PasswordCombination "av,b,c" -MinCharacters 2 -MaxCharacters 2
avav
avb
avc
bav
bb
bc
cav
cb
cc

.EXAMPLE

PS C:\> "a,b,c" | Get-PasswordCombination -MinCharacters 2 -MaxCharacters 2
aa
ab
ac
ba
bb
bc
ca
cb
cc

.EXAMPLE

PS C:\> Get-PasswordCombination -CharacterSet "ad,b,c" -MinCharacters 3 -MaxCharacters 3 | Where-Object {$_ -like "*db*"}
adadb
adbad
adbb
adbc
badb
cadb


.LINK

https://www.sconstantinou.com/get-passwordcombination

.LINK

New-DictionaryFile

.LINK

Get-PasswordNumber

.LINK

Get-DictionaryFile
#>


    [cmdletbinding()]

    param(
        [parameter(Mandatory = $true,ValueFromPipeline = $true)][alias("c")][String]$CharacterSet,
        [parameter(Mandatory = $true)][alias("min")][Uint32]$MinCharacters,
        [parameter(Mandatory = $true)][alias("max")][Uint32]$MaxCharacters,
        [alias("ic")][Switch]$IncludeCapital,
        [alias("co")][Switch]$CapitalOnly)

    if ($CharacterSet -eq "alphabet"){
        $CharacterSet = "a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z"
    }

    if ($CapitalOnly -eq $True){
        $CharacterSet = $CharacterSet.ToUpper()
    }

    if ($IncludeCapital -eq $True){
        $CharactersCapital = $CharacterSet.ToUpper()
        $CharacterSetLow = $CharacterSet
        $CharacterSet = ""
        $CharacterSet = $CharacterSetLow, $CharactersCapital -join ","
    }

    $pool = $CharacterSet -split ','
    [Array]$pool = $pool | Select-Object -Unique

    for ($i = $MinCharacters; $i -le $MaxCharacters; $i++){
        $Passwords = @()

        for ($p = 1;$p -le $i;$p++){
            [Object[]]$Passwords += ,$pool
        }

        Get-Password $Passwords
    }
}
New-Alias -Name gpc -Value Get-PasswordCombination

function New-DictionaryFile {
<#
.SYNOPSIS

Creates a dictionary file.

.DESCRIPTION

Creates a dictionary file containing all possible
passwords that can be created based on your input.

.PARAMETER CharacterSet

Specifies the characters (letters, numbers, symbols) that
need to be included. Parameter is mandatory.

.PARAMETER MinCharacters

Specifies the minimum characters of the generated passwords.
Parameter is mandatory.

.PARAMETER MaxCharacters

Specifies the maximum characters of the generated passwords.
Parameter is mandatory.

.PARAMETER IncludeCapital

Specifies whether or not to include upper case letters along with
the lower case letters.

.PARAMETER CapitalOnly

Specifies whether or not all lower case letters to be converted to
upper case letters.

.PARAMETER Path

Specifies the path and file that generated passwords will be saved.
Parameter is mandatory.

.INPUTS

System.String. New-DictionaryFile can accept a string value to
determine the CharacterSet parameter.

.OUTPUTS

None. New-DictionaryFile will save all the generated passwords to
the specified path.

.EXAMPLE

PS C:\> New-DictionaryFile -CharacterSet "a,b,c,1,$" -MinCharacters 2 -MaxCharacters 5 -Path C:\Scripts_Output\MyFile.txt

.EXAMPLE

PS C:\> New-DictionaryFile -CharacterSet "a,b,c,1,$" -MinCharacters 2 -MaxCharacters 5 -IncludeCapital -Path C:\Scripts_Output\MyFile.txt

.EXAMPLE

PS C:\> New-DictionaryFile -CharacterSet "a,b,c,1,$" -MinCharacters 2 -MaxCharacters 5 -CapitalOnly -Path C:\Scripts_Output\MyFile.txt

.EXAMPLE

PS C:\> New-DictionaryFile -CharacterSet "alphabet" -MinCharacters 1 -MaxCharacters 3 -Path C:\Scripts_Output\MyFile.txt

.EXAMPLE

PS C:\> New-DictionaryFile "av,b,c" -MinCharacters 2 -MaxCharacters 2 -Path C:\Scripts_Output\MyFile.txt

.EXAMPLE

PS C:\> "a,b,c" | New-DictionaryFile -MinCharacters 2 -MaxCharacters 2 -Path C:\Scripts_Output\MyFile.txt

.LINK

https://www.sconstantinou.com/new-dictionaryfile

.LINK

Get-PasswordCombination

.LINK

Get-PasswordNumber

.LINK

Get-DictionaryFile
#>


    [cmdletbinding(SupportsShouldProcess, ConfirmImpact='Medium')]

    param(
        [parameter(Mandatory = $true,ValueFromPipeline = $true)][alias("c")][String]$CharacterSet,
        [parameter(Mandatory = $true)][alias("min")][Uint32]$MinCharacters,
        [parameter(Mandatory = $true)][alias("max")][Uint32]$MaxCharacters,
        [alias("ic")][Switch]$IncludeCapital,
        [alias("co")][Switch]$CapitalOnly,
        [parameter(Mandatory = $true)][alias("p")][String]$Path = "")

    $Directory = Split-Path $Path
    $File = [System.IO.Path]::GetFileName($Path)

    if ($CharacterSet -eq "alphabet"){
        $CharacterSet = "a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z"
    }

    if ($CapitalOnly -eq $True){
        $CharacterSet = $CharacterSet.ToUpper()
    }

    if ($IncludeCapital -eq $True){
        $CharactersCapital = $CharacterSet.ToUpper()
        $CharacterSetLow = $CharacterSet
        $CharacterSet = ""
        $CharacterSet = $CharacterSetLow, $CharactersCapital -join ","
    }

    if (-not (Test-Path -Path $Directory -PathType Container)){
        New-Item -Path $Directory -ItemType Directory -Force |
            Out-Null
    }

    if (-not (Test-Path -Path $Path -PathType Leaf)){
        New-Item -Path $Directory -Name $File -ItemType File -Force |
            Out-Null
    }
    else{
        Remove-Item -Path "$Path" -Force | Out-Null
        New-Item -Path $Directory -Name $File -ItemType File -Force |
            Out-Null
    }

    $pool = $CharacterSet -split ','
    [Array]$pool = $pool | Select-Object -Unique

    for ($i = $MinCharacters; $i -le $MaxCharacters; $i++){
        $Passwords = @()

        for ($p = 1;$p -le $i;$p++){
            [Object[]]$Passwords += ,$pool
        }

        Get-Password $Passwords -OutFile "$Path"
    }
}
New-Alias -Name ndf -Value New-DictionaryFile

function Get-DictionaryFile {
<#
.SYNOPSIS

Imports a dictionary file

.DESCRIPTION

Imports a previously created dictionary file into
memory.

.PARAMETER CharacterSet

Specifies the characters (letters, numbers, symbols) that
need to be included. Parameter is mandatory.

.INPUTS

System.String. Get-DictionaryFile can accept a string value to
determine the path of the dictionary file.

.OUTPUTS

System.Array. Get-DictionaryFile will provide the passwords that
where included in the dictionary file in an array.

.EXAMPLE

PS C:\> Get-DictionaryFile -Path C:\Scripts\DictionaryFile.txt
aa
ab
ac
ba
bb
bc
ca
cb
cc

.EXAMPLE

PS C:\> "C:\Scripts\DictionaryFile.txt" | Get-DictionaryFile
aa
ab
ac
ba
bb
bc
ca
cb
cc

.EXAMPLE

PS C:\> Get-DictionaryFile -Path "C:\Scripts\DictionaryFile.txt" | ForEach-Object {$_ + "a"}
aaa
aba
aca
baa
bba
bca
caa
cba
cca

.EXAMPLE

PS C:\> "C:\Scripts\DictionaryFile.txt" | Get-DictionaryFile | Where-Object {$_ -like "*b*"}
ab
ba
bb
bc
cb

.LINK

https://www.sconstantinou.com/get-dictionaryfile

.LINK

Get-PasswordCombination

.LINK

Get-PasswordNumber

.LINK

New-DictionaryFile
#>


    [cmdletbinding()]

    param([parameter(Mandatory = $true,ValueFromPipeline = $true)][alias("p")][String]$Path)

    [Array]$DictionaryFile = Get-Content -Path $Path

    Write-Output $DictionaryFile
}
New-Alias -Name gdf -Value Get-DictionaryFile