AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 406933
Accepted
TechGuyTJ
TechGuyTJ
Asked: 2012-07-12 13:09:51 +0800 CST2012-07-12 13:09:51 +0800 CST 2012-07-12 13:09:51 +0800 CST

Powershell 参数

  • 772

我的脚本中有一个参数块

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 吗?如果不是,我该怎么做才能确保我接受正确类型的变量类型,以便我可以将它传递给用户创建过程?

scripting powershell shell-scripting
  • 3 3 个回答
  • 30084 Views

3 个回答

  • Voted
  1. Best Answer
    BartekB
    2012-07-12T13:28:49+08:002012-07-12T13:28:49+08:00

    指定正确的密码类型就足够了,请尝试:

    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 模式下使用(-键入您的秘密密码不会按预期工作),因此它应该强制脚本的用户省略密码(并获得屏蔽提示)或指定它-接受常规字符串并将其转换为脚本逻辑中的安全字符串的密码参数。

    • 18
  2. fenneh
    2012-07-12T15:30:30+08:002012-07-12T15:30:30+08:00

    破译你想要做什么有点困难......

    编辑; 就像 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 程序只接受以纯文本形式传递给它们的密码,这在您不想将密码硬编码到脚本中的情况下有助于实现自动化..

    • 4
  3. Ryan Ries
    2012-07-12T13:23:58+08:002012-07-12T13:23:58+08:00

    我不确定我是否理解...看来您已经在这样做了。通过将参数设置为强制性参数,如果您未在命令行中提供该参数,Powershell 将提示您输入该参数,并且使用 [string] 可确保可以进入该变量的唯一数据类型是 System.string。

    编辑:基于 Bartek 的回答,在您的脚本中执行此操作:

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

    然后你必须像这样向你的脚本传递一个 SecureString 对象:

    PS:> Read-Host -AsSecureString | .\YourScript.ps1
    
    • 1

相关问题

  • 知道任何适用于 Windows 的快速可编写脚本的 ftp 客户端吗?[关闭]

  • 如果同一个任务已经在运行,如何防止计划任务运行?

  • 需要从 Batch For 循环中排除特定结果

  • Bash 脚本:要求脚本以 root 身份运行(或使用 sudo)

  • 从命令行删除旧的(非引导)Windows Vista 目录

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve