Parametri Powershell


10

Ho un blocco Param nel mio 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 usare il CmdLet Read-Host in un campo Parametro richiesto? in caso contrario, cosa posso fare per assicurarmi di inserire il tipo corretto di tipo variabile in modo da poterlo passare a un processo di creazione dell'utente?

Risposte:


16

Specificare il tipo corretto per la password dovrebbe essere sufficiente, prova:

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

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

PowerShell "maschera" la password (come per read-host -asSecureString) e il tipo di risultato sarà quello richiesto da altri cmdlet.

EDIT: Dopo i recenti commenti: soluzione, che dà sia possibilità di fornire la password di testo normale, o la forza all'utente di digitare la password (ma mascherarlo stesso modo -AsSecureString Read-Host sarebbe) e in entrambi i casi ottengono [Security.SecureString] alla fine . E, come bonus, ottieni qualche richiesta di fantasia per la tua password segreta. ;)

[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

Ho usato il trucco di Jaykul qui per imbrogliare chiedendo password sicure. ;) Renderà questo parametro molto difficile da usare in modalità CLI (-Type la tua password segreta non funzionerà come previsto), quindi dovrebbe forzare gli utenti dello script a omettere la password (e ottenere un prompt mascherato) o specificarlo con parametro -password che accetta la stringa regolare e la converte per proteggere la stringa all'interno della logica dello script.


Ciò si traduce in un errore per me.
Ryan Ries l'

1
Non posso davvero aiutarti con informazioni così vaghe. ;) Che errore ricevi? Ho provato questo sia su V2 che V3 e ha funzionato bene per me. Non sei sicuro di dove possa essere la fonte del tuo problema se non specifichi un messaggio di errore ...
BartekB,

No no, hai ragione - scusa. Il tuo codice è corretto, ma sto ancora pensando che l'OP vorrà un modo per passare un SecureString allo script dalla riga di comando e non solo una stringa.
Ryan Ries l'

Ricevo il seguente errore quando utilizzo questo blocco parametri [PS] C: \ Windows \ system32> C: \ Util \ Create-MailboxUsers.ps1 -FileLocation C: \ Util \ Users.csv -password P @ ssword C: \ Util \ Create-MailboxUsers.ps1: Impossibile elaborare la trasformazione dell'argomento sul parametro 'password'. Impossibile convertire il valore "P @ssword" del tipo "System.String" in "System.Security.SecureString". Alla riga: 1 carattere: 74 + C: \ Util \ Create-MailboxUsers.ps1 -FileLocation C: \ Util \ Users.csv -password <<<< P @ ssword
TechGuyTJ

1
Questo perché non è possibile convertire una stringa normale in una stringa sicura come quella. Ho aggiornato la mia risposta con qualcosa che probabilmente ti permetterà di ottenere poco di entrambi: prompt mascherato e facoltativamente possibilità di specificare la password in linea con -password P @ ssword param.
BartekB,

4

È un po 'difficile decifrare ciò che stai cercando di fare ...

Modificare; come menzionato da Ryan, attualmente lo stai già specificando come una stringa ...

Ma in alcuni codici, ho usato la seguente funzione quando utilizzo 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)
}

Nel tuo caso, lo chiameresti nel modo seguente;

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: dati commenti, e solo per il gusto di farlo ... ecco un metodo alternativo usato per convertire la stringa sicura sopra in testo normale all'interno di 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) )
}

Lo useresti così;

$PWPlain = ConvertTo-PlainText $password

Riassumendo, prendi la password in maschera, è una stringa sicura, puoi quindi scomporla in testo normale per usarla altrove, un vero esempio di parola sarebbe se alcuni programmi CLI accettano solo password che vengono passate in loro come testo semplice, questo aiuta con l'automazione in cui non si desidera codificare una password nel proprio script.


1

Non sono sicuro di aver capito ... sembra che lo stia già facendo. Impostando il parametro su obbligatorio, Powershell te lo chiederà se non lo fornisci sulla riga di comando e con [stringa] stai assicurando che l'unico tipo di dati che può andare in quella variabile sia System.string.

EDIT: Basandoti sulla risposta di Bartek, fallo nella tua sceneggiatura:

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

Quindi devi trasmettere allo script un oggetto SecureString in questo modo:

PS:> Read-Host -AsSecureString | .\YourScript.ps1
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.