我有一个简单的例子拼凑在一起其他帖子:
[CmdletBinding(
DefaultParameterSetName = 'Secret'
)]
Param (
[Parameter(Mandatory=$True)]
[string]$FileLocation,
[Parameter(
Mandatory = $True,
ParameterSetName = 'Secret'
)]
[Security.SecureString]${Type your secret password},
[Parameter(
Mandatory = $True,
ParameterSetName = 'Plain'
)]
[string]$Password
)
if ($Password) {
$SecretPassword = $Password | ConvertTo-SecureString -AsPlainText -Force
} else {
$SecretPassword = ${Type your secret password}
}
Write-Host $SecretPassword
$BSTR = `
[System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($SecretPassword)
$PlainPassword = [System.Runtime.InteropServices.Marshal]::PtrToStringAuto($BSTR)
Write-Host $PlainPassword
How can I use powershell's read-host function to accept a password for an external service?
运行脚本时,如何才能屏蔽输入的密码?
所以不要这样:
PS C:\temp> .\test.ps1 -FileLocation C:\Temp\file.csv -Password secret
此
PS C:\temp> .\test.ps1 -FileLocation C:\Temp\file.csv -Password ******
答案 0 :(得分:3)
首先,你的例子不会发生。在脚本执行之前,您建议您希望它们执行脚本的任何shell都要屏蔽密码,因为它是作为参数输入的。没有发生。
现在,另一种方法是不接受密码作为参数,而是每次都提示输入密码。在这种情况下,您可以将整个If($Password)
语句简化为:
$SecretPassword = Read-Host 'Type your secret password' -AsSecureString
答案 1 :(得分:1)
AsSecureString参数执行此操作:
-AsSecureString
表示cmdlet显示星号(*)代替用户键入的字符作为输入。
答案 2 :(得分:1)
首先使用以下声明捕获密码。
$ password = Read-Host"输入您的密码" -AsSecureString
上述语句将屏蔽用户在屏幕上输入的字符
但问题是你不能直接在你的程序中使用这个字符串。 要在脚本中使用用户输入的此安全字符串,您需要将其转换为二进制字符串,如下所示。
$ Newpass = [Runtime.InteropServices.Marshal] :: PtrToStringAuto([Runtime.InteropServices.Marshal] :: SecureStringToBSTR($ password))
然后使用$ Newpass作为用户输入的密码。