我正在编写一个“快捷方式” 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()
答案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 的函数,但具体的实现将由您决定。