Home > Software engineering >  Powershell script for generating
Powershell script for generating

Time:09-26

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

CodePudding user response:

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

CodePudding user response:

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

CodePudding user response:

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

  • Related