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)

返回 False。

现在的脚本无需两次提示和比较用户输入,如下所示,它可以重置用户的密码。

$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 脚本来重置域用户密码

答案1

根据科技网,您必须使用以下方法“解密”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)

这将按预期工作。

您还可以创建一个直接比较两个给定的 SecureStrings 的函数,但具体的实现将由您决定。

相关内容