我的脚本中有一个 Param 块
Param (
[Parameter(Mandatory=$True)]
[string]$FileLocation,
[Parameter(Mandatory=$True)]
[string]$password = Read-Host "Type the password you would like to set all the users to" -assecurestring
)
我可以在必需的参数字段中使用 Read-Host CmdLet 吗?如果不能,我该怎么做才能确保我采用正确类型的变量类型,以便可以将其传递给用户创建过程?
答案1
指定正确的密码类型就足够了,尝试:
Param (
[Parameter(Mandatory=$True)]
[string]$FileLocation,
[Parameter(Mandatory=$True)]
[Security.SecureString]$password
)
PowerShell 将“屏蔽”密码(与 read-host -asSecureString 相同),结果类型将是其他 cmdlet 可能需要的类型。
编辑:经过最近的评论:解决方案,提供了提供纯文本密码的选项,或者力量用户输入密码(但使用与 Read-Host -AsSecureString 相同的方式屏蔽它),在这两种情况下,最终都会得到 [Security.SecureString]。而且,作为奖励,您会得到一些输入秘密密码的奇特提示。;)
[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}
}
Do-Stuff -With $SecretPassword
我在这里使用了 Jaykul 的技巧来作弊,提示输入安全密码。;) 这将使这个参数在 CLI 模式下很难使用(-Type your secret password 将无法按预期工作),因此它应该强制脚本用户省略密码(并得到屏蔽提示)或使用 -password 参数指定它,该参数接受常规字符串并将其转换为脚本逻辑内的安全字符串。
答案2
有点难以理解你在做什么......
编辑;就像 Ryan 提到的那样,您目前已经将其指定为字符串......
但在某些代码中,我在使用 Read-Host 和 SecureStrings 时使用了以下函数
function AskSecureQ ([String]$Question, [String]$Foreground="Yellow", [String]$Background="Blue") {
Write-Host $Question -ForegroundColor $Foreground -BackgroundColor $Background -NoNewLine
Return (Read-Host -AsSecureString)
}
在你的情况下,你可以通过执行以下操作来调用它;
Param (
[Parameter(Mandatory=$True)]
[string]$FileLocation,
[Parameter(Mandatory=$True)]
[string]$password = AskSecureQ "Type the password you would like to set all the users to"
)
编辑:给出评论,只是为了好玩......这里有一种用于在 Powershell 中将上述安全字符串转换为纯文本的替代方法;
# Taking a secure password and converting to plain text
Function ConvertTo-PlainText( [security.securestring]$secure ) {
$marshal = [Runtime.InteropServices.Marshal]
$marshal::PtrToStringAuto( $marshal::SecureStringToBSTR($secure) )
}
你可以像这样使用它;
$PWPlain = ConvertTo-PlainText $password
总而言之,您将密码屏蔽起来,这是一个安全字符串,然后您可以将其分解为纯文本以供其他地方使用,一个真实的例子是,如果某些 CLI 程序只接受以纯文本形式传递给它们的密码,这有助于实现自动化,您不想将密码硬编码到脚本中。
答案3
我不确定我是否理解了……看来你已经是这样做。通过将参数设置为强制,如果您未在命令行中提供该参数,Powershell 将提示您输入该参数,并且使用 [string],您可以确保可以进入该变量的唯一数据类型是 System.string。
编辑:根据 Bartek 的回答,在脚本中执行以下操作:
Param ([Parameter(Mandatory=$true,ValueFromPipeline=$true)][Security.SecureString]$Password)
然后你必须向你的脚本传递一个 SecureString 对象,如下所示:
PS:> Read-Host -AsSecureString | .\YourScript.ps1