पॉवरशेल पैरामीटर्स


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
)

क्या मैं एक आवश्यक पैरामीटर फ़ील्ड में रीड-होस्ट CmdLet का उपयोग कर सकता हूं? यदि नहीं तो मैं यह सुनिश्चित करने के लिए क्या कर सकता हूं कि मैं सही प्रकार के चर प्रकार में ले जाऊं ताकि मैं इसे उपयोगकर्ता निर्माण प्रक्रिया में पारित कर सकूं?

जवाबों:


16

पासवर्ड के लिए सही प्रकार निर्दिष्ट करना पर्याप्त होना चाहिए, कोशिश करें:

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

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

PowerShell "मास्क" पासवर्ड (रीड-होस्ट -asSecureString के लिए समान) और परिणाम प्रकार वह होगा जिसमें अन्य cmdlets की आवश्यकता हो सकती है।

संपादित करें: हाल की टिप्पणियों के बाद: समाधान, जो सादा पाठ पासवर्ड प्रदान करने के लिए दोनों विकल्प देता है, या उपयोगकर्ता को पासवर्ड टाइप करने के लिए मजबूर करता है (लेकिन इसे उसी तरह से पढ़ें- 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

मैंने सुरक्षित पासवर्ड का संकेत देकर धोखा देने के लिए यहाँ जयकुल की चाल का उपयोग किया है। ;) यह सीएलआई मोड में उपयोग करने के लिए इस पैरामीटर को बहुत कठिन बना देगा (वैसे आपका गुप्त पासवर्ड अपेक्षा के अनुरूप काम नहीं करेगा), इसलिए यह स्क्रिप्ट के उपयोगकर्ताओं को या तो पासवर्ड छोड़ने के लिए बाध्य करना चाहिए (और नकाबपोश शीघ्र प्राप्त करें) या इसके साथ निर्दिष्ट करें -पासवर्ड पैरामीटर जो नियमित स्ट्रिंग को स्वीकार करता है और इसे स्क्रिप्ट लॉजिक के अंदर सुरक्षित स्ट्रिंग में परिवर्तित करता है।


यह मेरे लिए एक त्रुटि का परिणाम है।
रयान रेज़

1
वास्तव में इतनी अस्पष्ट जानकारी के साथ मदद नहीं कर सकता। ;) आपको क्या त्रुटि मिल रही है? मैंने v2 और v3 दोनों पर यह परीक्षण किया है और यह मेरे लिए ठीक काम किया है। यह सुनिश्चित न करें कि त्रुटि संदेश निर्दिष्ट नहीं करने पर आपके मुद्दे का स्रोत कहाँ हो सकता है ...
बार्टेक बी बी

नहीं, आप सही हैं - क्षमा करें। आपका कोड सही है, लेकिन मैं अभी भी सोच रहा हूं कि ओपी कमांड लाइन पर स्क्रिप्ट के लिए सिक्योरस्ट्रीमिंग पास करने का एक तरीका चाहता है, न कि केवल एक स्ट्रिंग।
रयान रीज़

जब मैं इस परम ब्लॉक [PS] C: \ Windows \ system32> C: \ Util \ Create-MailboxUsers.ps1 -FileLocation C: \ Util \ Users.csv -passv का उपयोग कर रहा हूं, तो मुझे निम्नलिखित त्रुटि मिल रही है: P- ssword C: \ Util \ Create-MailboxUsers.ps1: पैरामीटर 'पासवर्ड' पर तर्क परिवर्तन को संसाधित नहीं कर सकता। टाइप नहीं कर सकता "P @ssword" टाइप का मान "System.String" टाइप करने के लिए "System.Security.SecureStest"। लाइन में: 1 char: 74 + C: \ Util \ Create-MailboxUsers.ps1 -FileLocation C: \ Util \ Users.csv -password <<<< P @ ssword
TechGuyTJ

1
ऐसा इसलिए है क्योंकि आप स्ट्रिंग को सुरक्षित करने के लिए नियमित स्ट्रिंग को परिवर्तित नहीं कर सकते हैं। मैंने अपने उत्तर को कुछ के साथ अद्यतन किया है जो संभवतः आपको दोनों में से कुछ प्राप्त करने की अनुमति देगा: नकाबपोश शीघ्र और वैकल्पिक रूप से पासवर्ड इनलाइन को -पासवर्ड पी @ ssword परम के साथ निर्दिष्ट करने की संभावना।

4

यह थोड़ा मुश्किल है कि आप क्या करने की कोशिश कर रहे हैं ...

संपादित करें; रयान द्वारा उल्लिखित की तरह, आप वर्तमान में इसे पहले से ही एक स्ट्रिंग के रूप में निर्दिष्ट कर रहे हैं ...

लेकिन कुछ कोड में, मैंने 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"
)

संपादित करें: टिप्पणियों को देखते हुए, और सिर्फ इसके नरक के लिए ... यहां एक वैकल्पिक विधि का उपयोग किया गया है जो उपरोक्त सुरक्षित स्ट्रिंग को सादे पाठ में सादे पाठ में परिवर्तित करता है;

# 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 आपको इसके लिए संकेत देगा यदि आप इसे कमांड लाइन पर प्रदान नहीं करते हैं, और [स्ट्रिंग] के साथ आप यह सुनिश्चित कर रहे हैं कि एकमात्र डेटा प्रकार जो उस चर में जा सकता है, वह है System.string।

संपादित करें: बार्टेक के उत्तर पर निर्माण, अपनी स्क्रिप्ट में ऐसा करें:

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

फिर आपको अपनी स्क्रिप्ट को सिक्योर स्ट्रींग ऑब्जेक्ट जैसे पास करना होगा:

PS:> Read-Host -AsSecureString | .\YourScript.ps1
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.