30

我正在编写一个脚本来连接到 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

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

谢谢

4

2 回答 2

52

$Password 是一个安全字符串,这将返回纯文本密码。

[Runtime.InteropServices.Marshal]::PtrToStringAuto([Runtime.InteropServices.Marshal]::SecureStringToBSTR($Password))
于 2013-02-21T16:30:11.533 回答
2

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

于 2013-02-21T16:32:23.480 回答