Powershell
Powershell,如何比較使用者輸入
我正在製作一個“快捷方式”PS1 腳本來更新域使用者的密碼。我想提示使用者兩次輸入新密碼,而不在螢幕上顯示密碼。當我使用
$Text1=Read-Host ; $Text2=Read-Host ; $Text1 -eq $Text2
相同的輸入(例如“1”)時,該單行的輸出為“True”。然而,$Text1=Read-Host -AsSecureString ; $Text2=Read-Host -AsSecureString ; $Text1 -eq $Text2
和
$Text1=Read-Host -AsSecureString ; $Text2=Read-Host -AsSecureString ; (ConvertFrom-SecureString $Text1) -eq (ConvertFrom-SecureString $Text2)
返回假。
現在的腳本沒有提示兩次並比較使用者輸入,如下所示,它可以重置使用者的密碼。
$UserName = Read-Host "User name " $NewPass = Read-Host -AsSecureString Set-ADAccountPassword ` -NewPassword $NewPass ` -Verbose ` -Identity ( (Get-ADUser -Filter "SamAccountName -like '$UserName'").DistinguishedName ) $NewPass.Dispose()
根據Technet,您必須使用以下方法“解密”secureString:
$BSTR = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($text1) $PlainPassword = [System.Runtime.InteropServices.Marshal]::PtrToStringAuto($BSTR)
首先,這會將安全字元串轉換為“基本字元串”數據類型 (BSTR),然後再將其轉換回可讀字元串。這將為您提供使用者輸入的純文字密碼。例如,您可以將其放在一個小函式中,您可以像這樣呼叫兩個密碼:
function Decrypt-Password ($secureString){ $BSTR = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($secureString) $PlainPassword = [System.Runtime.InteropServices.Marshal]::PtrToStringAuto($BSTR) return $PlainPassword } $Text1=Read-Host -AsSecureString $Text2=Read-Host -AsSecureString (Decrypt-Password -secureString $text1) -eq (Decrypt-Password -secureString $text2)
這將按預期工作。
您還可以創建一個函式來直接比較兩個給定的 SecureString,但我將把確切的實現留給您。