Powershellパラメーター


10

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

回答:


16

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

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

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

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

編集:最近のコメントの後:解決策、プレーンテキストのパスワードを提供するか、ユーザーにパスワードの入力を強制する(ただし、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パラメーター。


これは私にとってエラーになります。
ライアンリース

1
あいまいな情報を実際に手助けすることはできません。;)どのエラーが発生しますか?これをv2とv3の両方でテストしましたが、問題なく動作しました。エラーメッセージを指定しないと、問題の原因がどこにあるかわからない...
BartekB

いやいや、あなたは正しい-すみません。あなたのコードは正しいですが、OPはコマンドラインでスクリプトにSecureStringを渡すだけでなく、文字列だけを渡す方法が欲しいと思っています。
ライアンリース

このParamブロックを使用すると、次のエラーが発生します[PS] C:\ Windows \ system32> C:\ Util \ Create-MailboxUsers.ps1 -FileLocation C:\ Util \ Users.csv -password P @ ssword C:\ Util \ Create-MailboxUsers.ps1:パラメーター 'password'の引数変換を処理できません。タイプ「System.String」の「P @ssword」値をタイプ「System.Security.SecureString」に変換できません。行:1 char:74 + C:\ Util \ Create-MailboxUsers.ps1 -FileLocation C:\ Util \ Users.csv -password <<<< P @ ssword
TechGuyTJ

1
これは、通常の文字列をそのような安全な文字列に変換できないためです。私はおそらくあなたが両方のほとんどを得ることができるもので私の答えを更新しました:マスクされたプロンプトとオプションで-password P @ ssword paramでインラインでパスワードを指定する可能性。
BartekB 2012

4

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

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

しかし、一部のコードでは、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プログラムがプレーンテキストとして渡されるパスワードのみを受け入れる場合です。スクリプトにパスワードをハードコーディングしたくない自動化に役立ちます。


1

私は確かに私はあなたがすでに表示されていることを理解していないよ... されていることをやって。パラメーターを必須に設定することにより、コマンドラインでパラメーターを指定しない場合、Powershellはそれを要求します。[string]を使用すると、その変数に入力できる唯一のデータ型がSystem.stringであることを確認できます。

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

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

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

PS:> Read-Host -AsSecureString | .\YourScript.ps1
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.