Vadim
Vadim

Reputation: 11

Powershell script for generating

I have a question regarding the script. I found a script that generates a password, but how to do it so that, for example, you can set the length of the password and probably some characters when generating, if you do not set it only after that, let it generate a default password, for some length

function Get-RandomCharacters($length, $characters) {
    $random = 1..$length | ForEach-Object { Get-Random -Maximum $characters.length }
    $private:ofs=""
    return [String]$characters[$random]
}
 
function Scramble-String([string]$inputString){     
    $characterArray = $inputString.ToCharArray()   
    $scrambledStringArray = $characterArray | Get-Random -Count $characterArray.Length     
    $outputString = -join $scrambledStringArray
    return $outputString 
}
 
$password = Get-RandomCharacters -length 5 -characters 'abcdefghiklmnoprstuvwxyz'
$password += Get-RandomCharacters -length 1 -characters 'ABCDEFGHKLMNOPRSTUVWXYZ'
$password += Get-RandomCharacters -length 1 -characters '1234567890'
$password += Get-RandomCharacters -length 1 -characters '!"§$%&/()=?}][{@#*+'
 
Write-Host $password
 
$password = Scramble-String $password
 
Write-Host $password

Upvotes: 0

Views: 515

Answers (3)

DMK
DMK

Reputation: 11

How about condensing down into a smaller function:

Function Generate-Password
{

-join ('abcdefghkmnrstuvwxyzABCDEFGHKLMNPRSTUVWXYZ23456789$%&*#'.ToCharArray() | Get-Random -Count 12)   # Add characters and/or password length to suit your organisation's requirements


}

And then call whenever you need it:

$password = Generate-Password

$securePassword = ConvertTo-SecureString $password -AsPlainText -Force

Upvotes: 1

Theo
Theo

Reputation: 61218

There are more ways than one to generate a password.

For instance this one:

function New-Password {
    [CmdletBinding()]
    param(
        [Parameter(ValueFromPipeline = $true, ValueFromPipelineByPropertyName = $true)]
        [ValidateRange(8, 128)]
        [int]$TotalLength = 10,
        [int]$Digits = 3,
        [int]$Symbols = 2
    )
    # the number of symbols must be => 0 and <= $TotalLength
    $Symbols = [math]::Max(0,[math]::Min($Symbols, $TotalLength))
    # same for the number of digits
    $Digits = [math]::Max(0,[math]::Min($Digits, $TotalLength))
    $alphas = $TotalLength - ($Digits + $Symbols) 
    if ($alphas -lt 0) {
        throw "Too many digits or symbols for the total password length"
    }
    $list = [System.Collections.Generic.List[char]]::new()

    if ($Digits -gt 0)  { $list.AddRange([char[]]([char[]]'0123456789' | Get-Random -Count $Digits)) }
    if ($Symbols -gt 0) { $list.AddRange([char[]]([char[]]'!@#$%^&*()_-+=[{]};:<>|./?~' | Get-Random -Count $Symbols)) }
    if ($alphas -gt 0)  { $list.AddRange([char[]]([char[]]'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ' | Get-Random -Count $alphas)) }

    ($list | Sort-Object {Get-Random}) -join ''
}

Usage:

$password = New-Password -TotalLength 12 -Symbols 4 -Digits 2  # or without parameters to accept the defaults

Or this:

$TotalLength = 10
$password = ([char[]]([char]33..[char]95) + ([char[]]([char]97..[char]126)) + 0..9 | Sort-Object {Get-Random})[0..$TotalLength] -join ''

Or this:

Add-Type -AssemblyName System.Web
# the first parameter specifies the total password length. 
# the second one specifies the minimum number of non-alphanumeric characters
$password = [System.Web.Security.Membership]::GeneratePassword(10, 3)

Note: Apparently you cannot use this last method in .NET Core as it does not support System.Web.dll. See this github issue

Upvotes: 1

inorangestylee
inorangestylee

Reputation: 41

replace line

function Get-RandomCharacters($length, $characters) {

with:

function Get-RandomCharacters($length = 8, $characters = 'abcdefghiklmnoprstuvwxyzABCDEFGHKLMNOPRSTUVWXYZ1234567890') {

it defines default length to 8 chars, and charset as abcdefghiklmnoprstuvwxyzABCDEFGHKLMNOPRSTUVWXYZ1234567890

Upvotes: 0

Related Questions