Paramètres Powershell

10

J'ai un bloc Param dans mon 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
)

Puis-je utiliser le Read-Host CmdLet dans un champ de paramètre requis? sinon, que puis-je faire pour m'assurer que je prends le bon type de variable afin de pouvoir le passer à un processus de création d'utilisateur?

TechGuyTJ
la source

Réponses:

16

La spécification d'un type de mot de passe correct devrait suffire, essayez:

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

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

PowerShell "masquera" le mot de passe (comme pour read-host -asSecureString) et le type de résultat sera celui dont les autres applets de commande peuvent avoir besoin.

EDIT: Après les commentaires récents: solution, qui donne aux deux options pour fournir un mot de passe en texte brut, ou forcer l' utilisateur à taper le mot de passe (mais le masquer de la même manière que Read-Host -AsSecureString le ferait) et dans les deux cas obtenir [Security.SecureString] à la fin . Et, en prime, vous obtenez une invite de fantaisie pour votre mot de passe secret. ;)

[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

J'ai utilisé l'astuce de Jaykul ici pour tricher en demandant un mot de passe sécurisé. ;) Cela rendra ce paramètre très difficile à utiliser en mode CLI (-Tapez votre mot de passe secret ne fonctionnera pas comme prévu), donc il devrait forcer les utilisateurs du script à omettre le mot de passe (et à obtenir une invite masquée) ou à le spécifier avec -password paramètre qui accepte une chaîne régulière et la convertit en chaîne sécurisée dans la logique de script.

BartekB
la source
Cela se traduit par une erreur pour moi.
Ryan Ries
1
Je ne peux pas vraiment aider avec des informations si vagues. ;) Quelle erreur obtenez-vous? J'ai testé cela à la fois sur v2 et v3 et cela a bien fonctionné pour moi. Je ne sais pas où la source de votre problème peut être si vous ne spécifiez pas de message d'erreur ...
BartekB
Non non, vous avez raison - désolé. Votre code est correct, mais je pense toujours que l'OP va vouloir un moyen de passer une SecureString au script sur la ligne de commande, et pas seulement une chaîne.
Ryan Ries
Je reçois l'erreur suivante lorsque j'utilise ce bloc Param [PS] C: \ Windows \ system32> C: \ Util \ Create-MailboxUsers.ps1 -FileLocation C: \ Util \ Users.csv -password P @ ssword C: \ Util \ Create-MailboxUsers.ps1: Impossible de traiter la transformation d'argument sur le paramètre 'mot de passe'. Impossible de convertir la valeur "P @ssword" de type "System.String" en type "System.Security.SecureString". À la ligne: 1 caractère: 74 + C: \ Util \ Create-MailboxUsers.ps1 -FileLocation C: \ Util \ Users.csv -password <<<< P @ ssword
TechGuyTJ
1
C'est parce que vous ne pouvez pas convertir une chaîne régulière en chaîne sécurisée comme ça. J'ai mis à jour ma réponse avec quelque chose qui vous permettra probablement d'obtenir peu des deux: l'invite masquée et éventuellement la possibilité de spécifier le mot de passe en ligne avec -password P @ ssword param.
BartekB
4

C'est un peu difficile de déchiffrer ce que vous essayez de faire ...

Éditer; comme mentionné par Ryan, vous le spécifiez déjà en tant que chaîne ...

Mais dans certains codes, j'ai utilisé la fonction suivante lors de l'utilisation de Read-Host et SecureStrings

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

Dans votre cas, vous l'appelleriez en procédant comme suit;

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: Compte tenu des commentaires, et juste pour l'enfer ... voici une méthode alternative utilisée pour convertir la chaîne sécurisée ci-dessus en texte brut dans 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) )
}

Vous l'utiliseriez comme ceci;

$PWPlain = ConvertTo-PlainText $password

Pour résumer, vous prenez le mot de passe masqué, c'est une chaîne sécurisée, vous pouvez ensuite le décomposer en texte brut pour une utilisation ailleurs, un vrai exemple de mot serait si certains programmes CLI n'acceptent que les mots de passe qui leur sont passés en texte brut, ce aide à l'automatisation lorsque vous ne voulez pas coder en dur un mot de passe dans votre script.

fenneh
la source
1

Je ne suis pas sûr que je comprends ... il semble que vous avez déjà faites faire. En définissant le paramètre sur obligatoire, Powershell vous le demandera si vous ne le fournissez pas sur la ligne de commande, et avec [chaîne] vous vous assurez que le seul type de données pouvant entrer dans cette variable est System.string.

EDIT: En s'appuyant sur la réponse de Bartek, faites-le dans votre script:

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

Ensuite, vous devez passer à votre script un objet SecureString comme ceci:

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