繁体   English   中英

有没有办法将凭据传递给基于点的脚本?

[英]Is there a way to pass credentials to dot-sourced scripts?

我是PowerShell的新手,一直在尝试将凭据传递给基于点的脚本。 这个想法是有一个主文件,我可以加载它,然后使用源函数,这样会更干净。

这是到目前为止我尝试过的一个示例:

Functions.ps1

$credentials = Get-Credential -Message "Please enter your credentials."
. .\Unlock.ps1 -Credential $credentials

Unlock.ps1

function Unlock-Account {
  param(
    [Parameter(Mandatory = $true)]
    [string] $username,
    [Parameter(Mandatory = $true, ValueFromPipelineByPropertyName = $true, ValueFromPipeline = $true)] 
    [PSCredential] $Credential
  )
  try {
    Unlock-ADAccount -Identity $username -Credential $credentials
  }
  catch {
    Write-Output " Could not unlock $username"
  }
}

点源脚本不会自动调用源脚本中的函数。 您在方案中通常要做的是:

$credentials = Get-Credential -Message "Please enter your credentials."
. .\Unlock.ps1
Unlock-Account 'somename' -Credential $credentials

如果要避免在每次调用该函数时都指定-Credential $credentials ,则可以将凭证参数设为可选,并分配一个默认值:

Param(
    [Parameter(Mandatory=$true)]
    [string]$Username,

    [Parameter(
        Mandatory=$false,
        ValueFromPipelineByPropertyName=$true,
        ValueFromPipeline=$true
    )]
    [PSCredential]$Credential = $global:Credential
)

这样, $Credential将自动承担因变量的值$Credential ,如果该变量已被定义在全球范围内。 但是请注意,如果在调用函数时未定义全局变量,则参数将为空值。


从技术上讲,您可以点源脚本并向其传递参数:

Param(
    [Parameter(Mandatory=$true)]
    [PSCredential]$Credential
)

function Unlock-Account {
    Param(
        [Parameter(Mandatory = $true)]
        [string]$Username,

        [Parameter(
            Mandatory=$false,
            ValueFromPipelineByPropertyName=$true,
            ValueFromPipeline=$true
        )]
        [PSCredential]$Credential = $script:Credential
    )
    ...
}

然后点源脚本,并调用如下函数:

$credentials = Get-Credential -Message "Please enter your credentials."
. .\Unlock.ps1 -Credential $credentials
Unlock-Account 'somename'

但是,这种方法非常……非常规。 我不建议走这条路。

采购PS1可以有效地在会话中运行该文件的内容,就好像您已将整个内容复制并粘贴到命令行中一样。 实际上,并没有将参数传递到点源文件的概念。

但是,有多种方法可以有效地完成您想做的事情。

一种方法是将要运行的命令添加到脚本末尾。 因此,将以下内容添加到脚本文件的最后一行(在函数的大括号后):

# You could optionally add the line that gathers the credential here as well.
Unlock-Account -Credential $credentials

我个人不喜欢这种方法,因为它有时会在您只希望功能可用时强迫您始终运行该功能。 您可以执行此操作的另一种方法是使脚本文件像函数一样运行。 本质上,您只需要删除脚本中的函数声明并保留其余部分即可。 然后,您只需像调用函数一样调用脚本,而不是对其进行点源采购。

因此,您的脚本内容变为:

param(
    [Parameter(Mandatory = $true)]
    [string] $username,
    [Parameter(Mandatory = $true, ValueFromPipelineByPropertyName = $true, ValueFromPipeline = $true)] 
    [PSCredential] $Credential
)
try {
    Unlock-ADAccount -Identity $username -Credential $credentials
}
catch {
    Write-Output " Could not unlock $username"
}

您这样称呼它:

.\Unlock.ps1 -Credential $credentials

此方法对于快速一次性脚本非常有用。 但是,如果最终有很多彼此相关的东西,那么最好创建一个真正的PowerShell模块

最后一种方法可能是使用最少的方法,但是如果您想保持脚本点源可用并且在点源时不实际调用任何东西,则仍然完全有效。 您可以将dot source命令和函数调用组合成一个单行命令,如下所示:

. .\Unlock.ps1; Unlock-Account -Credential $credentials

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM