我正在制作一个“快捷”PS1脚本来更新域用户的密码。我想两次提示用户输入新密码,而不显示屏幕上的密码。当我使用具有相同输入(例如'1‘)的$Text1=Read-Host ; $Text2=Read-Host ; $Text1 -eq $Text2时,该一行的输出是"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()
发布于 2019-01-16 13:31:22
根据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)这将像预期的那样起作用。
您还可以创建一个函数,直接比较两个给定的SecureStrings,但具体实现由您决定。
https://serverfault.com/questions/949289
复制相似问题