Skip to content

Instantly share code, notes, and snippets.

@marcgeld
Created April 5, 2017 13:05
Show Gist options
  • Save marcgeld/4891bbb6e72d7fdb577920a6420c1dfb to your computer and use it in GitHub Desktop.
Save marcgeld/4891bbb6e72d7fdb577920a6420c1dfb to your computer and use it in GitHub Desktop.
Powershell: Generate a random Alphanumeric string
# Generate a random Alphanumeric string
Function Get-RandomAlphanumericString {
[CmdletBinding()]
Param (
[int] $length = 8
)
Begin{
}
Process{
Write-Output ( -join ((0x30..0x39) + ( 0x41..0x5A) + ( 0x61..0x7A) | Get-Random -Count $length | % {[char]$_}) )
}
}
# Write-Host ("Alfa Beta " | Tee-Object -Variable txt) ($txt.length)
Write-Host "A: "(Get-RandomAlphanumericString | Tee-Object -variable teeTime ) ("len=$($teeTime.length)")
Write-Host "B: "(Get-RandomAlphanumericString -length 22 | Tee-Object -variable teeTime ) ("len=$($teeTime.length)")
@KEV1L
Copy link

KEV1L commented Jul 3, 2018

Very helpful, thanks!

@j-i-m-s-t-e-r
Copy link

teeTime ☕ Like it!

@NadalinVini
Copy link

great!

@ediulia
Copy link

ediulia commented Nov 13, 2020

A great solution for me! Thanks

@marcgeld
Copy link
Author

Great that you all find the code useful!

@ediulia
Copy link

ediulia commented Nov 19, 2020

Thanks. Pretty simple and useful. But sometimes it misses the numbers,,,
Like in this output:
JbTWkLOHJrWs

@marcgeld
Copy link
Author

Yes, the selection is randomized and the string might not contain numbers. Likewise it could be a string with only numbers, which is more likely if you generate a short string. If you need a string with more even distribution of word character and digits there are likely better ways to generate then using my function.

@ediulia
Copy link

ediulia commented Nov 19, 2020

@Kipjr
Copy link

Kipjr commented Dec 3, 2020

Any idea why there is a limit of 62 chars?

@marcgeld
Copy link
Author

marcgeld commented Dec 3, 2020

The function creates string in the intervals 0-9A-Z a-z and then sample randomize character from that string. Why Get-Random stops sampling after 62 chars I don't know, but I guess it is dependent on the string length. The function was created to generate fairly randomized short string to be included in some test files back in history. I don't think I have used it to generate any strings longer then 10 chars so I didn't know about the 62 chars limit. I don't write any things for PowerShell at this moment and don't have easy access to a Windows environment so I'm unable to dig in and find out why the 62 chars limit but If anybody knows feel free to write a comment here.

@andreiv3103
Copy link

Any idea why there is a limit of 62 chars?

I think I know why:

image

If you need a longer string (as I needed in a project), you can just add the characters again, like this:

image

@ediulia
Copy link

ediulia commented Jan 18, 2021

Here is my final function with the reference to the source, which I modified a bit
Function Generate-Password
{
<#
https://stackoverflow.com/questions/37256154/powershell-password-generator-how-to-always-include-number-in-string

.EXAMPLE
Generate-Password -Size $PassParmINIObject.Values.MinLength -CharSets ULN -Exclude ABCde123
#>
Param
(
[Int]$Size = 8,
[Char[]]$CharSets = "ULNS",
[Char[]]$Exclude,
$SpecialCharactersList # = '!"#$%&''()*+,-./:;<=>?@[]^_`{|}~' # Default if the characters list is not set in passparm.ini
)

# Debug output of Special Characters received to the function instead of the default

# Write-Host $SpecialCharactersList -ForegroundColor Red
#pause
$Chars = @(); $TokenSet = @()

If (!$TokenSets) {$Global:TokenSets = @{
    U = [Char[]]'ABCDEFGHIJKLMNOPQRSTUVWXYZ'                                #Upper case
    L = [Char[]]'abcdefghijklmnopqrstuvwxyz'                                #Lower case
    N = [Char[]]'0123456789'                                                #Numerals
    S = [Char[]]$SpecialCharactersList                                      #Symbols
}}

$CharSets | ForEach {
    
    $Tokens = $TokenSets."$_" | ForEach {If ($Exclude -cNotContains $_) {$_}}
    If ($Tokens) {
        $TokensSet += $Tokens
        If ($_ -cle [Char]"Z") {$Chars += $Tokens | Get-Random}             #Character sets defined in upper case are mandatory
    }
}

While ($Chars.Count -lt $Size) 
    {
        $Chars += $TokensSet | Get-Random

        # Debug output of random chars to be sent to the string and string length
        # Write-Host "$Chars : $($Chars.Count) ######## Output Here ######### $Size" -ForegroundColor Red
    }
($Chars | Sort-Object {Get-Random}) -Join ""                                #Mix the (mandatory) characters and output string

} # End of Function Generate-Password

@marcgeld
Copy link
Author

Great! Thanks for improving this tread!

@GoldeneyesII
Copy link

This is a great solution to my issue of generating a password without special characters!

The only concern I had was that characters could not be re-used, which drastically reduces the randomness of the strings it makes. So I worked out a solution that hopefully can help some other people frustrated by the GeneratePassword forced random characters.

The 62 Character limit is because the Get-Random function will not get the same character twice. When it gets, it essentially pops that item out of the array and can no longer choose it.

Here is a way around it which seems to work quite well.

$length = 72
$pwd = ""; do { $pwd = $pwd + ((0x30..0x39) + (0x41..0x5A) + (0x61..0x7A) | Get-Random | % {[char]$_}) } until ($pwd.length -eq $length)

This may or may not use every character in the array, as the array is refreshed after each letter is added.

Btw, first time posting on git. Woot!

@me-suzy
Copy link

me-suzy commented Apr 10, 2021

ok, in powershell, does anyone know how to make a shuffle words, on several txt files, search and replace like this https://onlinerandomtools.com/shuffle-words ?

@BeMor81
Copy link

BeMor81 commented Jul 8, 2022

As others have said, the maximum length is 62 and also the characters are never reused so greatly reduces the complexity of the string. The below works around these issues

Write-Output ( -join ($(for($i=0; $i -lt $length; $i++) { ((0x30..0x39) + ( 0x41..0x5A) + ( 0x61..0x7A) | Get-Random | % {[char]$_}) })) )

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment