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과 동일)하고 결과 유형은 다른 cmdlet에 필요할 수 있습니다.

편집 : 최근 의견 : 솔루션, 일반 텍스트 암호를 제공하거나 사용자가 암호를 입력 하도록 강제 할 수있는 옵션을 제공 하지만 (읽기 호스트-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 모드에서 사용하기가 매우 어렵습니다 (-비밀 암호가 예상대로 작동하지 않음). 스크립트 사용자는 암호를 생략하거나 마스크 프롬프트를 표시하도록 강제해야합니다. -password 매개 변수는 일반 문자열을 승인하고이를 스크립트 논리 내의 보안 문자열로 변환합니다.


이것은 나에게 오류가 발생합니다.
Ryan Ries

1
모호한 정보를 실제로 도울 수 없습니다. ;) 어떤 오류가 발생합니까? 나는 v2와 v3에서 이것을 테스트했고 그것은 나에게 잘 작동했다. 오류 메시지를 지정하지 않으면 문제의 원인이 어디인지 확실하지 않습니다 ...
BartekB

아니요, 그렇습니다. 죄송합니다. 귀하의 코드는 정확하지만 OP는 문자열이 아닌 명령 줄의 스크립트에 SecureString을 전달하는 방법을 원한다고 생각합니다.
Ryan Ries

이 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-
암호

1
일반 문자열을 보안 문자열로 변환 할 수 없기 때문입니다. 마스크 프롬프트와 선택적으로 -password P @ ssword param으로 암호를 인라인으로 지정할 수있는 가능성을 거의 얻을 수있는 답변으로 내 대답을 업데이트했습니다.
BartekB

4

당신이하려는 일을 해독하는 것은 조금 어렵습니다 ...

편집하다; 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 예제는 특정 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.