如何在Powershell脚本中添加凭证参数?

时间:2018-07-11 10:53:57

标签: powershell

如何在Powershell脚本中添加凭据?我编写了一个默认情况下使用我的域凭据的脚本。我想使用其他凭据,并想在Powershell语法中添加凭据参数,当我使用凭据参数时,它会提示您输入凭据。

3 个答案:

答案 0 :(得分:1)

您可以在脚本中指定参数:

param(
      [System.Management.Automation.PSCredential]
      $Credential = $(Get-Credential)
    )

如果您传递有效的PSCredential对象,则它将照常进行,脚本可以使用凭据:

$cred = Get-Credential

.\MyScript.ps1 -Credential $cred

如果您未传递任何凭据,则用户将看到标准的UI凭据提示。

答案 1 :(得分:1)

我可能会做这样的事情:

[CmdletBinding()]
Param(
    [Parameter(Mandatory=$false)]
    $Credential = $null
)

if ($Credential -is [String]) {
    $Credential = Get-Credential $Credential
}

如果将凭据对象传递给脚本,它将使用该对象:

$cred = Get-Credential
.\script.ps1 -Credential $cred

如果将字符串传递给脚本,它将提示输入密码:

.\script.ps1 -Credential 'username'

如果调用不带-Credential参数的脚本,则参数值为$null

.\script.ps1

如果您不想将参数传递给参数,而只希望它指示是否提示输入凭据,则可以将其设置为切换参数:

[CmdletBinding()]
Param(
    [Parameter(Mandatory=$false)]
    [switch]$Credential
)

if ($Credential.IsPresent) {
    $cred = Get-Credential
}

我认为不可能有一个参数-Credential使用和不使用参数,除非您将其作为一个参数集中的开关参数和另一参数集中的“常规”参数使用。不过,那将需要可区分的参数集。

我也不认为完全可以在参数定义中做到这一点,至少对于静态参数而言。不确定动态参数。

答案 2 :(得分:0)

正如其他答案所指出的那样,只需在脚本的PARAM块中添加$ Credential参数。这个答案提供了一些更多细节,您可以添加一些其他东西来使事情变得有趣。

Param (
    [Parameter()]
    [ValidateNotNull()]
    [System.Management.Automation.PSCredential]
    [System.Management.Automation.Credential()]
    $Credential = [System.Management.Automation.PSCredential]::Empty 
)

怎么回事:

  • PARAM ( <# ... #> )定义了一个逗号分隔的可能参数列表。在这种情况下,我们只有1个参数:$Credential
  • [Parameter()]指出这是一个参数。我们可以在此处创建规则(例如,将字段设为必填字段,或仅在某些参数集中可用等)。如本例中未指定任何内容时,它并不是真正需要的,但为了完整性起见,将其包括在内。有关详细信息,请参见https://docs.microsoft.com/en-us/powershell/developer/cmdlet/parameter-attribute-declaration
  • [ValidateNotNull()]-确保没有将$null分配给参数,因为如果未明确处理,可能会导致意外行为。
  • [System.Management.Automation.PSCredential]定义此参数的类型;即它是PSCredential class的实例。
  • [System.Management.Automation.Credential()]-这是type converter;负责使PS对其接受的内容具有帮助/智能,而不是坚持接收PSC凭据。即,如果您将字符串-Credential 'username'传递给参数,则该行将使PowerShell将该字符串转换为PSCredential,并提示输入相关密码。
  • $Credential-这是参数的名称。
  • = [System.Management.Automation.PSCredential]::Empty-如果在运行时未传递任何值,则在此处分配默认值。如果您尝试访问类型的属性(例如,$Credential.Username.Length不会引发异常),则空值避免了空异常问题,并且通常理解为“使用当前会话的凭据运行”(尽管不是)保证/并非总是适用,具体取决于上下文/您正在使用的功能/模块)。

如何命名:

假设您的脚本另存为MyScript.ps1并且位于当前工作目录中,则可以执行任何一个(或更多)操作。

  • .\MyScript.ps1-由于凭据不是强制性的,因此默认为空凭据;通常表示“以当前用户身份运行”。
  • .\MyScript.ps1 -Credential 'myDomain\myUser'将提示用户输入给定帐户的密码(用户也可以通过相同的提示来修改帐户)
  • .\MyScript.ps1 -Credential $credential-将预先分配的凭据对象(例如通过$credential = Get-Credential创建的)传递给脚本。

这里有一篇很棒的博客文章,其中有更多详细信息:http://duffney.io/AddCredentialsToPowerShellFunctions

注意:相同的方法适用于任何PARAM块。即可以将其添加到PS1文件的开头,以便脚本获取参数,添加到该函数获取参数的函数或脚本块(例如,作为变量保存的脚本)。有关更多信息,请参见http://www.powertheshell.com/bp_function_parameters/