Thông số Powershell


10

Tôi có một khối Param trong kịch bản của mình

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
)

Tôi có thể sử dụng CmdLet Đọc-Máy chủ trong trường Tham số bắt buộc không? nếu không tôi phải làm gì để đảm bảo tôi nhập đúng loại biến để tôi có thể chuyển nó sang quy trình tạo người dùng?

Câu trả lời:


16

Chỉ định loại chính xác cho mật khẩu là đủ, hãy thử:

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

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

PowerShell sẽ "che dấu" mật khẩu (giống như đối với máy chủ đọc -asSecureString) và loại kết quả sẽ là mật khẩu mà các lệnh ghép ngắn khác có thể yêu cầu.

EDIT: Sau các nhận xét gần đây: giải pháp, cung cấp cả hai tùy chọn để cung cấp mật khẩu văn bản đơn giản hoặc buộc người dùng nhập mật khẩu (nhưng che dấu theo cách tương tự Read-Host -AsSecureString) và trong cả hai trường hợp, hãy nhận [Security.SecureString] . Và, như một phần thưởng, bạn nhận được một số lời nhắc ưa thích cho mật khẩu bí mật của bạn. ;)

[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

Tôi đã sử dụng mánh khóe của Jaykul ở đây để gian lận với lời nhắc nhập mật khẩu an toàn. ;) Nó sẽ làm cho tham số này rất khó sử dụng trong chế độ CLI (-Type mật khẩu bí mật của bạn sẽ không hoạt động như mong đợi), do đó, nó sẽ buộc người dùng tập lệnh bỏ qua mật khẩu (và nhận dấu nhắc bị che) tham số -password chấp nhận chuỗi thông thường và chuyển đổi nó thành chuỗi bảo mật bên trong logic tập lệnh.


Điều này dẫn đến một lỗi cho tôi.
Ryan Ries

1
Không thể thực sự giúp với thông tin mơ hồ. ;) Lỗi gì bạn nhận được? Tôi đã thử nghiệm cả hai trên v2 và v3 và nó hoạt động tốt với tôi. Không chắc nguồn gốc của vấn đề của bạn có thể ở đâu nếu bạn không chỉ định thông báo lỗi ...
BartekB

Không không, bạn đúng - xin lỗi. Mã của bạn là chính xác, nhưng tôi vẫn nghĩ OP sẽ muốn có một cách để chuyển SecureString sang tập lệnh trên dòng lệnh chứ không chỉ là một chuỗi.
Ryan Ries

Tôi gặp lỗi sau khi sử dụng khối Param này [PS] C: \ Windows \ system32> C: \ Util \ Tạo-MailboxUsers.ps1 -FileLocation C: \ Util \ Users.csv -password P @ ssword C: \ Util \ Create-MailboxUsers.ps1: Không thể xử lý chuyển đổi đối số trên tham số 'mật khẩu'. Không thể chuyển đổi giá trị "P @ssword" của loại "System.String" sang loại "System.Security.SecureString". Tại dòng: 1 char: 74 + C: \ Util \ Tạo-MailboxUsers.ps1 -FileLocation C: \ Util \ Users.csv -password <<<< P @ ssword
TechGuyTJ

1
Đó là bởi vì bạn không thể chuyển đổi chuỗi thông thường thành chuỗi bảo mật như thế. Tôi đã cập nhật câu trả lời của mình với một cái gì đó có thể sẽ cho phép bạn nhận được một chút cả hai: dấu nhắc bị che giấu và khả năng tùy chọn để chỉ định mật khẩu nội tuyến với -password P @ ssword param.
BartekB

4

Thật khó để giải mã những gì bạn đang cố gắng làm ...

Biên tập; như được đề cập bởi Ryan, hiện tại bạn đã xác định nó là một chuỗi ...

Nhưng trong một số mã, tôi đã sử dụng chức năng sau khi sử dụng Máy chủ lưu trữ và SecureStrings

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

Trong trường hợp của bạn, bạn gọi nó bằng cách làm như sau;

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: Đưa ra các bình luận, và chỉ vì địa ngục của nó ... đây là một phương pháp thay thế được sử dụng để chuyển đổi chuỗi bảo mật ở trên thành văn bản thuần túy trong 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) )
}

Bạn sẽ sử dụng nó như thế này;

$PWPlain = ConvertTo-PlainText $password

Tóm lại, bạn lấy mật khẩu trong mặt nạ, đó là một chuỗi bảo mật, sau đó bạn có thể chia nó thành văn bản đơn giản để sử dụng ở nơi khác, một ví dụ từ thực sự sẽ là nếu một số chương trình CLI nhất định chỉ chấp nhận mật khẩu được chuyển vào chúng dưới dạng văn bản thuần túy, điều này giúp tự động hóa khi bạn không muốn mã hóa mật khẩu vào tập lệnh của mình ..


1

Tôi không chắc là tôi hiểu ... có vẻ như bạn đã đang làm điều đó. Bằng cách đặt tham số thành bắt buộc, Powershell sẽ nhắc bạn về nó nếu bạn không cung cấp nó trên dòng lệnh và với [chuỗi], bạn đảm bảo rằng loại dữ liệu duy nhất có thể đi vào biến đó là System.opes.

EDIT: Dựa trên câu trả lời của Bartek, hãy làm điều này trong kịch bản của bạn:

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

Sau đó, bạn phải truyền cho tập lệnh của mình một đối tượng SecureString như vậy:

PS:> Read-Host -AsSecureString | .\YourScript.ps1
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.