Powershell 有没有一种方法可以将凭据传递给源于点的脚本?

Powershell 有没有一种方法可以将凭据传递给源于点的脚本?,powershell,Powershell,我是PowerShell的新手,一直在尝试将凭据传递给点源脚本。我的想法是有一个主文件,我可以加载,然后使用源函数,它会更干净 以下是我迄今为止所尝试的一个例子: 功能.ps1 $credentials = Get-Credential -Message "Please enter your credentials." . .\Unlock.ps1 -Credential $credentials 解锁.ps1 function Unlock-Account { param( [P

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

以下是我迄今为止所尝试的一个例子:

功能.ps1

$credentials = Get-Credential -Message "Please enter your credentials."
. .\Unlock.ps1 -Credential $credentials
解锁.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,可以将Credential参数设置为可选,并指定默认值:

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'
.\Unlock.ps1 -Credential $credentials
. .\Unlock.ps1; Unlock-Account -Credential $credentials

然而,这种方法将非常。。。非常规的。我不建议采用这种方法。

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

然而,有很多方法可以有效地做你想做的事情

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

# You could optionally add the line that gathers the credential here as well.
Unlock-Account -Credential $credentials
我个人不喜欢这种方法,因为它迫使您在有时只希望函数可用时始终运行函数。另一种方法是让脚本文件像函数一样运行。本质上,您只需删除脚本中的函数声明,并保留其余部分。然后您只需像函数一样调用脚本,而不是点源调用它

因此,脚本内容变为:

param [ParameterMandatory=$true] [字符串]$username, [ParameterMandatory=$true,ValueFromPipelineByPropertyName=$true,ValueFromPipeline=$true] [PSCredential]$Credential 试一试{ 解锁ADAccount-标识$username-凭证$credentials } 抓住{ 写入输出无法解锁$username } 你这样称呼它:

$credentials = Get-Credential -Message "Please enter your credentials."
. .\Unlock.ps1 -Credential $credentials
Unlock-Account 'somename'
.\Unlock.ps1 -Credential $credentials
. .\Unlock.ps1; Unlock-Account -Credential $credentials
此方法对于快速的一次性脚本非常有用。但是如果你最终得到了很多彼此相关的东西,你可能会过得更好

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

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

我的理解是,点源文件将其加载到当前上下文中,就像它是脚本的一部分一样。我认为它没有运行脚本的内容。如果您想将第二个脚本作为脚本运行,则需要这样做。如果您只想在脚本中运行函数。。。您需要将它变成一个函数,将其点源代码添加到当前脚本中,然后像调用任何其他函数一样调用它。@Lee_Dailey加载和运行脚本之间没有任何有效的区别。@Lee_Dailey我的一般想法是从单个脚本中生成一组点源代码脚本。然后,我可以使用凭据登录一次,并在PowerShell窗口中输入任何函数。我可以做解锁帐户或其他一些功能。但是,目前我必须输入每个函数的凭据。