Powershell 有没有一种方法可以将凭据传递给源于点的脚本?
我是PowerShell的新手,一直在尝试将凭据传递给点源脚本。我的想法是有一个主文件,我可以加载,然后使用源函数,它会更干净 以下是我迄今为止所尝试的一个例子: 功能.ps1Powershell 有没有一种方法可以将凭据传递给源于点的脚本?,powershell,Powershell,我是PowerShell的新手,一直在尝试将凭据传递给点源脚本。我的想法是有一个主文件,我可以加载,然后使用源函数,它会更干净 以下是我迄今为止所尝试的一个例子: 功能.ps1 $credentials = Get-Credential -Message "Please enter your credentials." . .\Unlock.ps1 -Credential $credentials 解锁.ps1 function Unlock-Account { param( [P
$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窗口中输入任何函数。我可以做解锁帐户或其他一些功能。但是,目前我必须输入每个函数的凭据。