簡體   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