Назад | Перейти на главную страницу

Параметры Powershell

У меня в скрипте есть блок 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
)

Могу ли я использовать CmdLet Read-Host в обязательном поле параметра? Если нет, что я могу сделать, чтобы убедиться, что я использую правильный тип типа переменной, чтобы я мог передать его в процесс создания пользователя?

Достаточно указать правильный тип пароля, попробуйте:

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

Здесь я использовал уловку Джайкула, чтобы обмануть с запросом безопасного пароля. ;) Это сделает этот параметр очень трудным для использования в режиме CLI (-Введите ваш секретный пароль не будет работать должным образом), поэтому он должен заставить пользователей скрипта либо опустить пароль (и получить замаскированное приглашение), либо указать его с помощью -password параметр, который принимает обычную строку и преобразует ее в защищенную строку внутри логики сценария.

Трудно понять, что вы пытаетесь сделать ...

Редактировать; как упомянул Райан, в настоящее время вы уже указываете его как строку ...

Но в некотором коде я использовал следующую функцию при использовании 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 принимают пароли, передаваемые им только в виде простого текста, это помогает с автоматизацией, когда вы не хотите жестко вводить пароль в свой скрипт.

Я не уверен, что понимаю ... похоже, что вы уже являются делая это. Установив для параметра значение обязательного, Powershell предложит вам его ввести, если вы не укажете его в командной строке, а с помощью [string] вы гарантируете, что единственный тип данных, который может входить в эту переменную, - это System.string.

РЕДАКТИРОВАТЬ: основываясь на ответе Бартека, сделайте это в своем скрипте:

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

Затем вам нужно передать вашему скрипту объект SecureString следующим образом:

PS:> Read-Host -AsSecureString | .\YourScript.ps1