需求是這樣的,給員工重置密碼,密碼要是隨機的,但是0和O i和I這些不要,防止誤殺。
我用的方法是這樣的,這是c#中web的一個方法,很給力。
$Assembly = Add-Type -AssemblyName System.Web $global:passwordrandom = [System.Web.Security.Membership]::GeneratePassword(8, 1)
代碼簡短,問題也有,那就是數字完全隨機,剔除不了不需要的東西。
所以九叔用下面的方法來實現
$mimacount =8 #密碼位數 #取得第一位密碼 function suijimima { $mimahalf =$mimacount/2 #密碼總數一半,用做下一次隨機取值的依據 $mimaarray = @{x= 1..$mimahalf} #密碼取值的陣列 $global:mimax =($mimaarray.x|get-random -Count 1) echo 當前取得密碼爲 $mimax $global:mimacount=$mimacount -$mimax #echo 密碼計數器被縮小爲 $mimacount } suijimima suijimima suijimima echo 當前取得密碼爲 $global:mimacount
首先是8位密碼,我分成4個部分,分別是數字、小寫、大寫、符號,每個部分分一些。
這樣一個密碼就可以包含4種元素,而且這四種元素的數量是不同的
上面這個方法寫了一半,發現有很多問題,所以放棄,用下面這個最終版的。
具體不多說,自己看。
用到的技術點主要是生成字符區分大小寫、哈希表、隨機函數get-random
$mimacount =8 #生成的密碼位數 這一行是處理生成的密碼長度
#############生成處理過的隨機密碼 $xiaoxie =@('a','b','c','d','e','f','g','h','j','k','m','n','p','q','r','s','t','u','v','w','x','y','z') $daxie =@('A','B','C','D','E','F','G','H','J','K','L','M','N','P','Q','R','S','T','U','V','W','X','Y','Z') $shuzi =@('2','3','4','5','6','7','8','9') $fuhao =@('!','~','-','=') $xxxx =@('xiaoxie','daxie','shuzi','fuhao') $hashtable = New-Object System.Collections.Hashtable $hashtable= @{ 'xiaoxie' = $xiaoxie 'daxie' = $daxie 'shuzi' = $shuzi 'fuhao' = $fuhao } $mimacount =8 #生成的密碼位數 function suijimima { $countsuiji=$xxxx|Get-Random $a =[string]($hashtable.$countsuiji|Get-Random ) $a } $bx="" $jilubiao = New-Object System.Collections.Hashtable $jilubiao =@{'x' = "X"} for ($i=1;$i -lt $mimacount+1;$i++) { $bx2=suijimima if( [string]$hashtable.shuzi -cmatch $bx2) { $jilubiao+=@{'shuzi' = "X"} } elseif ([string]$hashtable.xiaoxie -cmatch $bx2) { $jilubiao+=@{'xiaoxie' = "X"} } elseif ([string]$hashtable.fuhao -cmatch $bx2) { $jilubiao+=@{'fuhao' = "X"} } elseif ([string]$hashtable.daxie -cmatch $bx2) { $jilubiao+=@{'daxie' = "X"} } $bx += $bx2 } cls $bx