我正在编写一个脚本,用于连接到SOAP服务。连接完成后,我需要在发送的每个命令中都传递username/pass。我遇到的问题是,当我使用read主机来做这件事时,我的密码显示在明文中,并保留在外壳中:
PS C:UsersEgr> Read-Host "Enter Pass"
Enter Pass: MyPassword
MyPassword
如果我用-AsSecureString隐藏它,则该值将无法再传递给服务,因为它现在是System.Security.SecureString对象:
PS C:Usersgross> Read-Host "Enter Pass" -AsSecureString
Enter Pass: **********
System.Security.SecureString
当我通过这个时,它不起作用。我不在乎密码以明文形式传递给服务,我只是不希望它们在用户输入密码后留在用户的外壳上。是否可以隐藏读取主机输入,但仍将密码存储为明文?如果没有,是否有一种方法可以将System.Security.SecureString对象作为明文传递?
感谢
$Password是一个Securestring,它将返回纯文本密码。
[Runtime.InteropServices.Marshal]::PtrToStringAuto([Runtime.InteropServices.Marshal]::SecureStringToBSTR($Password))
您可以将密码(输入)保存为变量并将其传递给您的服务。如果代码是在脚本或函数中运行的,则包含密码的变量在完成后将被删除(它们存储在temp.local范围中)。如果您在控制台中运行命令(或像. .myscript.ps1
这样的点源脚本),密码变量将保留在会话范围内,并且它们将被存储,直到您删除它或关闭会话。如果您想确保在脚本运行后删除变量,您可以自己删除它。像这样:
#Get password in cleartext and store in $password variable
$password = Read-Host "Enter Pass"
#run code that needs password stored in $password
#Delete password
Remove-Variable password
要了解有关变量如何存储在作用域中的更多信息,请查看about_scopes
在PowerShell 6.x+版本中有一种方法可以做到这一点:
$password = Read-Host -MaskInput "Enter password"