[英]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.