web-dev-qa-db-ja.com

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を必須パラメーターフィールドで使用できますか?そうでない場合、ユーザー作成プロセスに渡すことができるように、変数タイプの正しいタイプを確実に取り込むにはどうすればよいですか?

10
TechGuyTJ

パスワードに正しいタイプを指定するだけで十分です。次を試してください:

Param (
    [Parameter(Mandatory=$True)]
    [string]$FileLocation,

    [Parameter(Mandatory=$True)]
    [Security.SecureString]$password
)

PowerShellはパスワードを「マスク」し(read-Host -asSecureStringと同じ)、結果のタイプは他のコマンドレットで必要になる可能性があります。

編集:最近のコメントの後:ソリューション。これは、プレーンテキストのパスワードを提供するオプション、またはforceユーザーがパスワードを入力するオプション(ただし、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の秘密のパスワードは期待どおりに機能しません)。そのため、スクリプトのユーザーはパスワードを省略(またはマスクされたプロンプトを表示)するか、または通常の文字列を受け入れ、それをスクリプトロジック内の安全な文字列に変換する-passwordパラメーター。

16
BartekB

あなたがやろうとしていることを解読するのは少し難しいです...

編集;ライアンによって言及されたように、あなたは現在それを文字列として指定しています...

しかし、一部のコードでは、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

要約すると、パスワードはマスクされた安全な文字列です。これをプレーンテキストに分解して、他の場所で使用できます。実際のWordの例は、特定のCLIプログラムがプレーンテキストとして渡されるパスワードのみを受け入れる場合です。スクリプトにパスワードをハードコーディングしたくない自動化に役立ちます。

4
fenneh

よくわかりません...あなたはすでにあるのようです。パラメーターを必須に設定することにより、コマンドラインでパラメーターを指定しない場合、Powershellはプロンプトを表示し、[string]を使用すると、その変数に入ることができる唯一のデータ型がSystem.stringであることを確認できます。

編集:Bartekの答えに基づいて、スクリプトでこれを行います:

Param ([Parameter(Mandatory=$true,ValueFromPipeline=$true)][Security.SecureString]$Password)       

次に、スクリプトに次のようなSecureStringオブジェクトを渡す必要があります。

PS:> Read-Host -AsSecureString | .\YourScript.ps1
1
Ryan Ries