如何使用powershell的read-host函数接受外部服务的密码?

lqfhib0f  于 2023-03-23  发布在  Shell
关注(0)|答案(3)|浏览(167)

我有一个脚本,我正在写一个连接到SOAP服务。连接建立后,我需要在我发送的每个命令中传递一个用户名/通行证。我遇到的问题是,当我使用read-host来做这件事时,我的密码以明文显示,并保留在shell中:

PS C:\Users\Egr> Read-Host "Enter Pass"
Enter Pass: MyPassword
MyPassword

如果我使用-AsSecureString隐藏它,则该值将无法再传递给服务,因为它现在是一个System.Security.SecureString对象:

PS C:\Users\gross> Read-Host "Enter Pass" -AsSecureString
Enter Pass: **********
System.Security.SecureString

当我传递这个时,它不起作用。我不关心密码以明文形式传递给服务,我只是不希望它们在用户输入密码后停留在用户的shell上。是否可以隐藏Read-Host输入,但仍然以明文形式存储密码?如果不行,有没有一种方法可以将System.Security.SecureString对象以明文形式传递?
谢谢

ecbunoof

ecbunoof1#

$Password是一个Securestring,这将返回纯文本密码。

[Runtime.InteropServices.Marshal]::PtrToStringAuto([Runtime.InteropServices.Marshal]::SecureStringToBSTR($Password))
xv8emn3q

xv8emn3q2#

你可以保存密码(输入)作为变量并将其传递给您的服务。如果代码在脚本中或作为函数运行,则包含密码的变量将在完成后删除(它们存储在临时本地作用域中)。如果在控制台中运行命令(或者像. .\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

fnvucqvd

fnvucqvd3#

在PowerShell版本6.x+中有一种方法可以做到这一点:

$password = Read-Host -MaskInput "Enter password"

相关问题