Parameter Powershell

10

Saya memiliki blok Param di skrip saya

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
)

Dapatkah saya menggunakan CmdLet Baca-Host di bidang Parameter yang diperlukan? jika tidak, apa yang bisa saya lakukan untuk memastikan saya mengambil tipe tipe variabel yang benar sehingga saya bisa meneruskannya ke proses pembuatan pengguna?

TechGuyTJ
sumber

Jawaban:

16

Menentukan jenis kata sandi yang benar sudah cukup, coba:

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

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

PowerShell akan "menutupi" kata sandi (sama seperti untuk read-host -asSecureString) dan tipe hasil akan menjadi yang dibutuhkan oleh cmdlet lain.

EDIT: Setelah komentar baru-baru ini: solusi, yang memberikan kedua opsi untuk memberikan kata sandi teks biasa, atau memaksa pengguna untuk mengetik kata sandi (tapi sembunyikan dengan cara yang sama dengan Read-Host -AsSecureString akan) dan dalam kedua kasus mendapatkan [Security.SecureString] pada akhirnya . Dan, sebagai bonus, Anda mendapatkan prompt mewah untuk kata sandi rahasia Anda. ;)

[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

Saya telah menggunakan trik Jaykul di sini untuk menipu dengan meminta kata sandi aman. ;) Ini akan membuat parameter ini sangat sulit digunakan dalam mode CLI (-Jenis kata sandi rahasia Anda tidak akan berfungsi seperti yang diharapkan), jadi itu akan memaksa pengguna skrip untuk menghilangkan kata sandi (dan mendapatkan masked prompt) atau menentukannya dengan Parameter -password yang menerima string biasa dan mengubahnya menjadi string aman di dalam logika skrip.

BartekB
sumber
Ini menghasilkan kesalahan bagi saya.
Ryan Ries
1
Tidak bisa membantu dengan info yang begitu kabur. ;) Kesalahan apa yang Anda dapatkan? Saya sudah menguji ini baik pada v2 dan v3 dan itu bekerja dengan baik untuk saya. Tidak yakin di mana sumber masalah Anda mungkin jika Anda tidak menentukan pesan kesalahan ...
BartekB
Tidak tidak, Anda benar - maaf. Kode Anda benar, tetapi saya masih berpikir OP akan menginginkan cara untuk meneruskan SecureString ke skrip pada baris perintah, dan bukan hanya string.
Ryan Ries
Saya mendapatkan kesalahan berikut ketika saya menggunakan blok Param ini [PS] C: \ Windows \ system32> C: \ Util \ Create-MailboxUsers.ps1 -FileLocation C: \ Util \ Users.csv -password P @ ssword C: \ Util \ Create-MailboxUsers.ps1: Tidak dapat memproses transformasi argumen pada parameter 'kata sandi'. Tidak dapat mengonversi nilai "P @ssword" dari tipe "System.String" untuk mengetik "System.Security.SecureString". Pada baris: 1 karakter: 74 + C: \ Util \ Create-MailboxUsers.ps1 -FileLocation C: \ Util \ Users.csv -password <<<< P @ ssword
TechGuyTJ
1
Itu karena Anda tidak dapat mengonversi string biasa ke string aman seperti itu. Saya telah memperbarui jawaban saya dengan sesuatu yang mungkin akan memungkinkan Anda untuk mendapatkan sedikit dari keduanya: prompt bertopeng dan kemungkinan untuk menentukan kata sandi sesuai dengan -password P @ ssword param.
BartekB
4

Agak sulit untuk menguraikan apa yang Anda coba lakukan ...

Edit; seperti yang disebutkan oleh Ryan, saat ini Anda telah menetapkannya sebagai string ...

Namun dalam beberapa kode, saya telah menggunakan fungsi berikut saat menggunakan Read-Host dan SecureStrings

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

Dalam kasus Anda, Anda akan menyebutnya dengan melakukan hal berikut;

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: Diberikan komentar, dan hanya untuk itu ... inilah metode alternatif yang digunakan untuk mengubah string aman di atas menjadi teks biasa dalam 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) )
}

Anda akan menggunakannya seperti ini;

$PWPlain = ConvertTo-PlainText $password

Terlalu singkat, Anda mengambil kata sandi dalam topeng, ini adalah string yang aman, Anda kemudian dapat memecahnya menjadi teks biasa untuk digunakan di tempat lain, contoh kata sebenarnya adalah jika program CLI tertentu hanya menerima kata sandi yang diteruskan ke kata-kata tersebut sebagai teks biasa, ini membantu dengan otomatisasi di mana Anda tidak ingin memasukkan kode sandi ke dalam skrip Anda ..

fenneh
sumber
1

Saya tidak yakin saya mengerti ... tampak bahwa Anda sudah sedang melakukan hal itu. Dengan mengatur parameter ke mandatory, Powershell akan meminta Anda untuk itu jika Anda tidak menyediakannya pada baris perintah, dan dengan [string] Anda memastikan bahwa satu-satunya tipe data yang bisa masuk ke variabel itu adalah System.string.

EDIT: Membangun jawaban Bartek, lakukan ini dalam skrip Anda:

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

Maka Anda harus mengirimkan skrip Anda objek SecureString seperti:

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