พารามิเตอร์ 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
)

ฉันสามารถใช้ Read-Host CmdLet ในฟิลด์ Parameter ที่ต้องการได้หรือไม่? หากไม่มีสิ่งที่ฉันสามารถทำได้เพื่อให้แน่ใจว่าฉันใช้ประเภทตัวแปรที่ถูกต้องเพื่อให้ฉันสามารถส่งผ่านไปยังกระบวนการสร้างผู้ใช้ได้หรือไม่

คำตอบ:


16

การระบุประเภทที่ถูกต้องสำหรับรหัสผ่านควรจะเพียงพอลอง:

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

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

PowerShell จะ "ปกปิด" รหัสผ่าน (เหมือนกับ read-host -asSecureString) และประเภทผลลัพธ์จะเป็นรหัสที่ cmdlet อื่นอาจต้องการ

แก้ไข:หลังจากความเห็นล่าสุด: วิธีแก้ปัญหาที่ให้ทั้งสองตัวเลือกเพื่อให้รหัสผ่านข้อความธรรมดาหรือบังคับให้ผู้ใช้พิมพ์รหัสผ่าน (แต่ปิดบังด้วยวิธีเดียวกัน 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

ฉันใช้เล่ห์อุบายของ Jaykul ที่นี่เพื่อโกงรหัสผ่านที่ปลอดภัย ;) มันจะทำให้พารามิเตอร์นี้ยากมากที่จะใช้ในโหมด CLI (- พิมพ์รหัสลับของคุณจะไม่ทำงานตามที่คาดไว้) ดังนั้นจึงควรบังคับให้ผู้ใช้สคริปต์ต้องละเว้นรหัสผ่าน (และได้รับพร้อมท์หน้ากาก) หรือระบุด้วย -password พารามิเตอร์ที่ยอมรับสตริงปกติและแปลงเป็นสตริงที่ปลอดภัยภายในลอจิกสคริปต์


ผลลัพธ์นี้มีข้อผิดพลาดสำหรับฉัน
Ryan Ries

1
ไม่สามารถช่วยด้วยข้อมูลที่คลุมเครือจริงๆ ;) คุณได้รับข้อผิดพลาดอะไร ฉันได้ทดสอบสิ่งนี้ทั้งใน v2 และ v3 และมันใช้ได้ดีสำหรับฉัน ไม่แน่ใจว่าแหล่งที่มาของปัญหาของคุณอาจจะถ้าคุณไม่ได้ระบุข้อผิดพลาด ...
BartekB

ไม่ไม่ถูกต้อง - ขอโทษ รหัสของคุณถูกต้อง แต่ฉันยังคงคิดว่า OP จะต้องการวิธีที่จะส่ง SecureString ไปยังสคริปต์ในบรรทัดคำสั่งไม่ใช่เพียงแค่สตริง
Ryan Ries

ฉันได้รับข้อผิดพลาดต่อไปนี้เมื่อฉันใช้ Param block [PS] C: \ Windows \ system32> C: \ Util \ Create-MailboxUsers.ps1 - FileLocation C: \ Util \ Users.csv - รหัสผ่าน P @ ssword C: \ Util \ Create-MailboxUsers.ps1: ไม่สามารถประมวลผลการแปลงอาร์กิวเมนต์ในพารามิเตอร์ 'รหัสผ่าน' ไม่สามารถแปลงค่า "P @ssword" ประเภท "System.String" เป็นประเภท "System.Security.SecureString" ที่บรรทัด: 1 อักขระ: 74 + C: \ Util \ Create-MailboxUsers.ps1 - ไฟล์ตำแหน่ง C: \ Util \ Users.csv - รหัสผ่าน <<<< P @ ssword
TechGuyTJ

1
นั่นเป็นเพราะคุณไม่สามารถแปลงสตริงปกติให้เป็นสตริงที่ปลอดภัยได้ ฉันได้อัปเดตคำตอบของฉันด้วยสิ่งที่อาจทำให้คุณได้รับทั้งสองอย่างน้อย: การแจ้งเตือนแบบมาสก์และความเป็นไปได้ที่จะระบุรหัสผ่านแบบอินไลน์ด้วย -password P @ ssword param
BartekB

4

เป็นการยากที่จะถอดรหัสสิ่งที่คุณพยายามทำ ...

แก้ไข; เช่นที่ถูกกล่าวถึงโดย Ryan ขณะนี้คุณกำลังระบุว่าเป็นสตริง ...

แต่ในบางรหัสฉันใช้ฟังก์ชั่นต่อไปนี้เมื่อใช้ 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 บางโปรแกรมยอมรับรหัสผ่านที่ถูกส่งผ่านเป็นข้อความธรรมดาเท่านั้น ช่วยด้วยระบบอัตโนมัติที่คุณไม่ต้องการรหัสยากรหัสผ่านลงในสคริปต์ของคุณ ..


1

ฉันไม่แน่ใจว่าฉันเข้าใจ ... ดูเหมือนว่าคุณกำลังทำอยู่แล้ว โดยการตั้งค่าพารามิเตอร์เป็นข้อบังคับ Powershell จะแจ้งให้คุณทราบหากคุณไม่ได้ระบุไว้ในบรรทัดคำสั่งและด้วย [string] คุณจะมั่นใจได้ว่าชนิดข้อมูลเดียวที่สามารถเข้าสู่ตัวแปรนั้นคือ System.string

แก้ไข: สร้างคำตอบของ Bartek ทำสิ่งนี้ในสคริปต์ของคุณ:

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

จากนั้นคุณต้องส่งสคริปต์ SecureString ให้กับสคริปต์ของคุณดังนี้:

PS:> Read-Host -AsSecureString | .\YourScript.ps1
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.