Параметри Powershell


10

У мене сценарій блоку 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 у необхідному полі параметра? якщо ні, що я можу зробити, щоб переконатися, що я приймаю правильний тип змінної типу, щоб я міг передати його в процес створення користувача?

Відповіді:


16

Вказавши правильний тип пароля, має бути достатньо, спробуйте:

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

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

PowerShell буде "маскувати" пароль (такий же, як і для read-host -asSecureString), а тип результату буде таким, який може знадобитися іншим командлетам.

EDIT: Після останніх коментарів: рішення, яке дає обидва варіанти надати звичайний текстовий пароль або змусити користувача вводити пароль (але маскувати його так само, як 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, який приймає звичайний рядок і перетворює його, щоб захистити рядок всередині логіки сценарію.


Це призводить до помилки для мене.
Ryan Ries

1
Не можу реально допомогти з такою невиразною інформацією. ;) Яку помилку ви отримуєте? Я перевірив це як на v2, так і на v3, і він добре працював для мене. Не знаєте, де може бути джерело вашої проблеми, якщо ви не вкажете повідомлення про помилку ...
BartekB

Ні, ні, ти маєш рацію - вибач. Ваш код правильний, але я все ще думаю, що ОП бажає способу передавати SecureString до сценарію в командному рядку, а не лише рядку.
Ryan Ries

Я отримую таку помилку, коли використовую цей блок Param [PS] C: \ Windows \ system32> C: \ Util \ Create-MailboxUsers.ps1 -FileLocation C: \ Util \ Users.csv -password P @ ssword C: \ Util \ Create-MailboxUsers.ps1: Неможливо обробити перетворення аргументів параметром 'password'. Неможливо перетворити значення "P @ssword" типу "System.String" у тип "System.Security.SecureString". У рядку: 1 char: 74 + C: \ Util \ Create-MailboxUsers.ps1 -FileLocation C: \ Util \ Users.csv -password <<<< P @ ssword
TechGuyTJ

1
Це тому, що ви не можете перетворити звичайний рядок у такий безпечний рядок. Я оновив свою відповідь чимось, що, ймовірно, дозволить вам отримати і те і інше: маскувальний запит і, можливо, можливість вказати введення пароля за допомогою параметра -password P @ ssword.
BartekB

4

Трохи важко розшифрувати те, що ти намагаєшся зробити ...

Редагувати; як згадував Райан, ви зараз вже вказуєте це як рядок ...

Але в деякому коді я використовував таку функцію, коли використовував 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"
)

EDIT: Дано коментарі, і просто для біса ... ось альтернативний метод, який використовується для перетворення вищезазначеного захищеного рядка в звичайний текст в 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 приймають лише паролі, передані їм як звичайний текст, це допомагає в автоматизації, де ви не хочете вводити жорсткий пароль у свій сценарій ..


1

Я не впевнений, що розумію ... виявляється, ви вже це робите. Встановивши параметр як обов'язковий, Powershell запропонує вам його, якщо ви не введете його в командному рядку, а за допомогою [string] ви гарантуєте, що єдиним типом даних, який може перейти в цю змінну, є System.string.

EDIT: Спираючись на відповідь Bartek, зробіть це у своєму сценарії:

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

Тоді вам слід передати свій скрипт об’єкту SecureString так:

PS:> Read-Host -AsSecureString | .\YourScript.ps1
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.