使用屏蔽输入密码

时间:2017-02-07 19:39:47

标签: powershell

我有一个简单的例子拼凑在一起其他帖子:

[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

https://social.technet.microsoft.com/wiki/contents/articles/4546.working-with-passwords-secure-strings-and-credentials-in-windows-powershell.aspx

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 ******

3 个答案:

答案 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作为用户输入的密码。