Powershell

Powershell,如何比較使用者輸入

  • January 16, 2019

我正在製作一個“快捷方式”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()

使用 PS1 腳本重置域使用者的密碼

根據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,但我將把確切的實現留給您。

引用自:https://serverfault.com/questions/949289