Powershell Parametreleri


10

Senaryomda bir Param bloğu var

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
)

Read-Host CmdLet'ini gerekli Parametre alanında kullanabilir miyim? değilse, bir kullanıcı oluşturma işlemine geçebilmem için doğru türde değişken türünü aldığınızdan emin olmak için ne yapabilirim?

Yanıtlar:


16

Şifre için doğru türün belirtilmesi yeterli olmalıdır, şunu deneyin:

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

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

PowerShell parolayı "maskeler" (read-host -asSecureString ile aynı) ve sonuç türü diğer cmdlet'lerin gerektirebileceği türdür.

DÜZENLEME: son yorumlara sonra: çözüm, düz metin parolası veya sağlamak için her iki seçeneği de sunar kuvvet tipi şifre kullanıcı (aynı yolu Salt Sunucu -AsSecureString ama maske olur) ve her iki olgu sonuçta [Security.SecureString] olsun içinde . Ve bonus olarak, gizli şifreniz için bazı süslü istemler alırsınız. ;)

[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

Jaykul'un hilesini güvenli şifre istemek için hile yapmak için kullandım. ;) Bu parametreyi CLI modunda kullanmak çok zorlaştıracaktır (-Gizli parolanız beklendiği gibi çalışmaz), bu nedenle komut dosyası kullanıcılarını parolayı atmaya zorlar (ve maskelenmiş komut istemi alır) veya Normal dizeyi kabul eden ve bunu komut dosyası mantığı içindeki güvenli dizeye dönüştüren -password parametresi.


Bu benim için bir hata ile sonuçlanır.
Ryan Ries

1
Bu kadar belirsiz bilgiye gerçekten yardım edemiyorum. ;) Hangi hatayı alıyorsun? Bunu v2 ve v3'te test ettim ve benim için iyi çalıştı. Hata mesajı belirtmezseniz sorununuzun kaynağının nerede olabileceğinden emin değilsiniz ...
BartekB

Hayır hayır, haklısın - üzgünüm. Kodunuz doğru, ancak hala OP komut satırında komut dizesine bir SecureString geçmek için bir yol isteyeceğini düşünüyorum, sadece bir dize değil.
Ryan Ries

Bu Param bloğunu kullandığımda aşağıdaki hatayı alıyorum [PS] C: \ Windows \ system32> C: \ Util \ Create-MailboxUsers.ps1 -FileLocation C: \ Util \ Users.csv -parola P @ ssword C: \ Util \ Create-MailboxUsers.ps1: 'password' parametresinde bağımsız değişken dönüşümü işlenemiyor. "System.String" türündeki "P @ssword" değeri "System.Security.SecureString" türüne dönüştürülemiyor. Satırda: 1 karakter: 74 + C: \ Util \ Create-MailboxUsers.ps1 -FileLocation C: \ Util \ Users.csv -şifre <<<< P @ ssword
TechGuyTJ 12:12

1
Bunun nedeni, normal dizeyi bu şekilde güvenli dizeye dönüştüremezsiniz. Cevabımı muhtemelen her ikisinden de az almanıza izin verecek bir şeyle güncelledim: maskeli komut istemi ve isteğe bağlı olarak -password P @ ssword param ile parola satır içi belirtme imkanı.
BartekB

4

Yapmaya çalıştığın şeyi deşifre etmek biraz zor ...

Düzenle; Ryan'ın belirttiği gibi, şu anda zaten bir dize olarak belirtiyorsunuz ...

Ancak bazı kodlarda Read-Host ve SecureStrings kullanırken aşağıdaki işlevi kullandım

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

Sizin durumunuzda, aşağıdakileri yaparak arayacaksınız;

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: Verilen yorumlar ve sadece cehennem için ... İşte yukarıdaki güvenli dizeyi Powershell içinde düz metne dönüştürmek için kullanılan alternatif bir yöntem;

# Taking a secure password and converting to plain text
Function ConvertTo-PlainText( [security.securestring]$secure ) {
    $marshal = [Runtime.InteropServices.Marshal]
    $marshal::PtrToStringAuto( $marshal::SecureStringToBSTR($secure) )
}

Bunu böyle kullanırdınız;

$PWPlain = ConvertTo-PlainText $password

Çok özetlemek gerekirse, şifreyi maskeli olarak alırsınız, bu güvenli bir dizedir, daha sonra bunu başka bir yerde kullanmak için düz metne bölebilirsiniz, gerçek bir kelime örneği, bazı CLI programlarının yalnızca şifreleri düz metin olarak geçirilmesini kabul etmesi durumunda, bu betiğinize bir şifre kodlamak istemediğiniz otomasyona yardımcı olur ..


1

Eminim daha önce bu görünür ... anlamaya değilim edilmektedir yapıyor. Parametreyi zorunlu olarak ayarladığınızda, Powershell komut satırında sağlamazsanız sizden bunu isteyecektir ve [string] ile bu değişkene girebilecek tek veri türünün System.string olduğundan emin olursunuz.

DÜZENLEME: Bartek'in cevabına dayanarak bunu senaryoda yapın:

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

Sonra betiğinize böyle bir SecureString nesnesi iletmeniz gerekir:

PS:> Read-Host -AsSecureString | .\YourScript.ps1
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.