Parâmetros do Powershell

9

Eu tenho um bloco Param no meu script

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
)

Posso usar o CmdLet do host de leitura em um campo de parâmetro obrigatório? se não o que posso fazer para ter certeza de levar o tipo correto de tipo de variável para que eu possa passá-lo para um processo de criação de usuário?

    
por TechGuyTJ 11.07.2012 / 23:09

3 respostas

16

Especificar o tipo correto de senha deve ser suficiente, tente:

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

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

O PowerShell irá "mascarar" a senha (o mesmo que para o read-host -asSecureString) e o tipo de resultado será aquele que outros cmdlets podem exigir.

EDITAR: Após comentários recentes: solução, que fornece a opção de fornecer senha em texto simples, ou o usuário força para digitar a senha (mas mascarar da mesma maneira como Read-Host -AsSecureString seria) e em ambos os casos, obter [Security.SecureString] no final. E, como bônus, você recebe um aviso de sua senha secreta. ;)

[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

Eu usei o truque do Jaykul aqui para enganar com a solicitação de senha segura. ;) Tornará esse parâmetro muito difícil de usar no modo CLI (-Type sua senha secreta não funcionará como esperado), portanto, deve forçar os usuários do script a omitir a senha (e obter um prompt mascarado) ou especificá-lo com O parâmetro -password que aceita string regular e converte-a em string segura dentro da lógica do script.

    
por 11.07.2012 / 23:28
4

É um pouco difícil decifrar o que você está tentando fazer ...

Editar; como mencionado por Ryan, você já está especificando como uma string ...

Mas em alguns códigos, usei a seguinte função ao usar Read-Host e SecureStrings

function AskSecureQ ([String]$Question, [String]$Foreground="Yellow", [String]$Background="Blue") {
    Write-Host $Question -ForegroundColor $Foreground -BackgroundColor $Background -NoNewLine
    Return (Read-Host -AsSecureString)
}

No seu caso, você ligaria fazendo o seguinte:

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

    [Parameter(Mandatory=$True)]
    [string]$password = AskSecureQ "Type the password you would like to set all the users to"
)

EDIT: Com base nos comentários, e apenas para o inferno ... aqui está um método alternativo usado para converter a string segura acima em texto simples dentro do 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) )
}

Você usaria assim:

$PWPlain = ConvertTo-PlainText $password

Resumindo, você pega a senha em mascarado, é uma string segura, você pode dividi-la em texto sem formatação para usar em outro lugar, um exemplo de palavra real seria se certos programas CLI aceitassem apenas senhas sendo passadas para eles como simples texto, isso ajuda com a automação onde você não quer codificar uma senha em seu script ..

    
por 12.07.2012 / 01:30
1

Não tenho certeza se entendi ... parece que você já está fazendo isso. Definindo o parâmetro como obrigatório, o Powershell solicitará a você caso você não o forneça na linha de comando e, com [string], você esteja garantindo que o único tipo de dados que pode entrar nessa variável seja System.string. / p>

EDIT: Com base na resposta de Bartek, faça isso no seu script:

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

Então você tem que passar ao seu script um objeto SecureString assim:

PS:> Read-Host -AsSecureString | .\YourScript.ps1
    
por 11.07.2012 / 23:23