Powershell 参数

Powershell 参数

我的脚本中有一个 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

相关内容