পাওয়ারশেল পরামিতি


10

আমার স্ক্রিপ্টে আমার একটি পরম ব্লক রয়েছে

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
)

আমি কি প্রয়োজনীয় প্যারামিটার ক্ষেত্রে রিড-হোস্ট সিএমডিলেট ব্যবহার করতে পারি? যদি না হয় আমি সঠিক ধরণের ভেরিয়েবল টাইপ গ্রহণ করি তা নিশ্চিত করার জন্য আমি কী করতে পারি যাতে আমি এটি কোনও ব্যবহারকারী তৈরির প্রক্রিয়ায় পাস করতে পারি?

উত্তর:


16

পাসওয়ার্ডের জন্য সঠিক ধরণ উল্লেখ করা যথেষ্ট হওয়া উচিত, চেষ্টা করুন:

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

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

পাওয়ারশেল "মাস্ক" পাসওয়ার্ডটি (পঠন-হোস্ট -স্যাসেকচার স্ট্রিংয়ের মতো) এবং ফলাফলের ধরণটি অন্য সেমিডলেটগুলির প্রয়োজন হতে পারে।

সম্পাদনা: সাম্প্রতিক মন্তব্যগুলির পরে: সমাধান, এটি প্লেইন পাঠ্য পাসওয়ার্ড প্রদানের উভয় বিকল্প দেয়, বা ব্যবহারকারীকে পাসওয়ার্ড টাইপ করতে বাধ্য করে (তবে এটি একইভাবে মুখোশ করুন-পড়ুন-হোস্ট-এ্যাসেকচারস্ট্রিং করবে) এবং উভয় ক্ষেত্রেই [সিকিউরিটি.সিকিউরস্ট্রিং] শেষ পর্যন্ত পাবেন । এবং, একটি বোনাস হিসাবে, আপনি আপনার গোপন পাসওয়ার্ডের জন্য কিছু অভিনব প্রম্পট পান। ;)

[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

সুরক্ষিত পাসওয়ার্ডের অনুরোধ দিয়ে প্রতারণা করার জন্য আমি এখানে জয়কুলের কৌশলটি ব্যবহার করেছি। ;) এটি এই প্যারামিটারটিকে সিএলআই মোডে ব্যবহার করা খুব শক্ত করে তুলবে (-আপনার গোপন পাসওয়ার্ডটি প্রত্যাশার মতো কাজ করবে না), সুতরাং এটি স্ক্রিপ্টের ব্যবহারকারীদের পাসওয়ার্ড বাদ দিতে বাধ্য করবে (এবং মুখোশযুক্ত প্রম্পট পেতে হবে) বা এটির সাহায্যে এটি নির্দিষ্ট করতে হবে -পাসওয়ার্ড প্যারামিটার যা নিয়মিত স্ট্রিং গ্রহণ করে এবং স্ক্রিপ্ট যুক্তির অভ্যন্তরে সুরক্ষিত স্ট্রিংয়ে রূপান্তর করে।


এটি আমার জন্য একটি ত্রুটির ফলস্বরূপ।
রায়ান রাইস

1
এত অস্পষ্ট তথ্যের সাথে সত্যই সহায়তা করতে পারে না। ;) আপনি কি ত্রুটি পেতে পারি? আমি এটি উভয় v2 এবং v3 এ পরীক্ষা করেছি এবং এটি আমার পক্ষে ভাল কাজ করেছে। আপনি যদি ত্রুটি বার্তা নির্দিষ্ট না করেন তবে আপনার সমস্যার উত্সটি কোথায় হতে পারে তা নিশ্চিত নয় ...
বারটেকবি

না না, আপনি ঠিক বলেছেন - দুঃখিত। আপনার কোডটি সঠিক, তবে আমি এখনও ভাবছি ওপি কমান্ড লাইনের স্ক্রিপ্টটিতে একটি সিকিউরস্ট্রিং পাস করার উপায় চাইবে, এবং কেবল একটি স্ট্রিং নয়।
রায়ান রাইস

আমি এই পরম ব্লকটি ব্যবহার করার সময় আমি নিম্নলিখিত ত্রুটিটি পাচ্ছি [পিএস] সি: \ উইন্ডোজ \ সিস্টেম 32> সি: \ ইউটিল \ তৈরি করুন-মেলবক্স-ব্যবহারকারীরা.এসপি-ফাইল-অবস্থান সি: \ ইউটিলি \ ইউজার.সিএসভি-পাসওয়ার্ড পি @ এসওয়ার্ড সি: \ ইউটিলি \ ক্রিয়েট-মেলবক্স ইউজার.পিএস 1: প্যারামিটারের 'পাসওয়ার্ড' এ যুক্তি রূপান্তর প্রক্রিয়া করতে পারে না। "সিস্টেম। স্ট্রিং" টাইপের "পি @ এসওয়ার্ড" মানটিকে "সিস্টেম.সিকিউরিটি.সিকিউরস্ট্রিং" টাইপ করতে রূপান্তর করতে পারে না। লাইনে: 1 চর: 74 + সি: til ইউটিলি \ ক্রিয়েট-মেলবক্স ইউজারস.পিএস 1-ফাইললোকেশন সি: \ ইউটিলি \ ইউজারস.সি.ভি.-পাসওয়ার্ড <<<< পি @ এসওয়ার্ড
টেকগ্যুইটিজে

1
এর কারণ আপনি নিয়মিত স্ট্রিংকে সে মতো সুরক্ষিত স্ট্রিংয়ে রূপান্তর করতে পারবেন না। আমি আমার উত্তরটি এমন কিছু দিয়ে আপডেট করেছি যা সম্ভবত আপনাকে দুটোকেই সামান্যই পেতে দেয়: মাস্কড প্রম্পট এবং pচ্ছিকভাবে পাসওয়ার্ড পি-এসএসওয়ার্ড প্যারামের সাথে পাসওয়ার্ডের ইনলাইন নির্দিষ্ট করার সম্ভাবনা।
বারটেকবি

4

আপনি যা করার চেষ্টা করছেন তা বোঝা কিছুটা শক্ত ...

সম্পাদনা করুন; রায়ান যেমন উল্লেখ করেছে, আপনি ইতিমধ্যে এটি ইতিমধ্যে একটি স্ট্রিং হিসাবে নির্দিষ্ট করছেন ...

তবে কিছু কোডে, আমি পড়ুন-হোস্ট এবং সিকিউরস্ট্রিং ব্যবহার করার সময় নিম্নলিখিত ফাংশনটি ব্যবহার করেছি

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"
)

সম্পাদনা: মন্তব্য দেওয়া হয়েছে, এবং কেবল এটির জন্যই ... এখানে উপরের সুরক্ষিত স্ট্রিংটিকে পাওয়ারশেলের অভ্যন্তরে সরল পাঠ্যে রূপান্তর করার জন্য একটি বিকল্প পদ্ধতি ব্যবহার করা হয়েছে;

# 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

খুব সংক্ষিপ্তসার হিসাবে, আপনি পাসওয়ার্ডটি মুখোশযুক্ত করে নিন, এটি একটি সুরক্ষিত স্ট্রিং, আপনি অন্য কোথাও ব্যবহারের জন্য এটি সরল পাঠ্য হিসাবে ভেঙে ফেলতে পারেন, সত্যিকারের শব্দের উদাহরণ হ'ল যদি নির্দিষ্ট সিএলআই প্রোগ্রামগুলি কেবল পাসওয়ার্ডগুলিকে কেবল সরল পাঠ হিসাবে প্রেরণ করে তবেই এটি গ্রহণ করে অটোমেশনে সহায়তা করে যেখানে আপনি আপনার স্ক্রিপ্টে একটি পাসওয়ার্ড হার্ড কোড করতে চান না ..


1

আমি নিশ্চিত যে আমি বুঝতে পেরেছি না ... মনে হচ্ছে আপনি ইতিমধ্যে এটি করছেন। বাধ্যতামূলক হিসাবে প্যারামিটার সেট করে, পাওয়ারশেল আপনাকে কমান্ড লাইনে সরবরাহ না করে এবং তার জন্য [স্ট্রিং] আপনি নিশ্চিত করে থাকেন যে কেবলমাত্র সেই ডাটা টাইপ যা সেই ভেরিয়েবলটিতে যেতে পারে সেটাই সিস্টেম.স্ট্রিং।

সম্পাদনা: বার্তেকের উত্তরের ভিত্তিতে, আপনার স্ক্রিপ্টে এটি করুন:

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

তারপরে আপনাকে আপনার স্ক্রিপ্টটি সিকিউরস্ট্রিং অবজেক্টের মতো পাস করতে হবে:

PS:> Read-Host -AsSecureString | .\YourScript.ps1
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.