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