Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
# 移除兩個不實用的 Cmdlet Aliases
If (Test-Path Alias:curl) {Remove-Item Alias:curl}
If (Test-Path Alias:wget) {Remove-Item Alias:wget}
# 快速開啟 c:\windows\system32\drivers\etc\hosts 檔案
function hosts { notepad c:\windows\system32\drivers\etc\hosts }
# 快速產生一組亂數密碼 (預設會產生 10 個字元的密碼)
function New-Password {
<#
.SYNOPSIS
Generate a random password.
.DESCRIPTION
Generate a random password.
.NOTES
Change log:
27/11/2017 - faustonascimento - Swapped Get-Random for System.Random.
Swapped Sort-Object for Fisher-Yates shuffle.
17/03/2017 - Chris Dent - Created.
#>
[CmdletBinding()]
[OutputType([String])]
param (
# The length of the password which should be created.
[Parameter(ValueFromPipeline)]
[ValidateRange(8, 255)]
[Int32]$Length = 10,
# The character sets the password may contain. A password will contain at least one of each of the characters.
[String[]]$CharacterSet = ('abcdefghijklmnopqrstuvwxyz',
'ABCDEFGHIJKLMNOPQRSTUVWXYZ',
'0123456789',
'!$%&^.#;'),
# The number of characters to select from each character set.
[Int32[]]$CharacterSetCount = (@(1) * $CharacterSet.Count),
[Parameter()]
[switch]$ConvertToSecureString
)
begin {
$bytes = [Byte[]]::new(4)
$rng = [System.Security.Cryptography.RandomNumberGenerator]::Create()
$rng.GetBytes($bytes)
$seed = [System.BitConverter]::ToInt32($bytes, 0)
$rnd = [Random]::new($seed)
if ($CharacterSet.Count -ne $CharacterSetCount.Count) {
throw "The number of items in -CharacterSet needs to match the number of items in -CharacterSetCount"
}
$allCharacterSets = [String]::Concat($CharacterSet)
}
process {
try {
$requiredCharLength = 0
foreach ($i in $CharacterSetCount) {
$requiredCharLength += $i
}
if ($requiredCharLength -gt $Length) {
throw "The sum of characters specified by CharacterSetCount is higher than the desired password length"
}
$password = [Char[]]::new($Length)
$index = 0
for ($i = 0; $i -lt $CharacterSet.Count; $i++) {
for ($j = 0; $j -lt $CharacterSetCount[$i]; $j++) {
$password[$index++] = $CharacterSet[$i][$rnd.Next($CharacterSet[$i].Length)]
}
}
for ($i = $index; $i -lt $Length; $i++) {
$password[$index++] = $allCharacterSets[$rnd.Next($allCharacterSets.Length)]
}
# Fisher-Yates shuffle
for ($i = $Length; $i -gt 0; $i--) {
$n = $i - 1
$m = $rnd.Next($i)
$j = $password[$m]
$password[$m] = $password[$n]
$password[$n] = $j
}
$password = [String]::new($password)
if ($ConvertToSecureString.IsPresent) {
ConvertTo-SecureString -String $password -AsPlainText -Force
} else {
$password
}
} catch {
Write-Error -ErrorRecord $_
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment