指定 ComputerName 與認證參數

當建立自訂指令碼時,您會在指令碼中繼資料中指定目標類型。 在寫入指令碼時請記住目標類型。 在寫入指令碼時的主要考量就是決定是否要在命令中包含 ComputerName 和 Credential 參數。 ITScript 環境會在 ST_ComputerName 變數中提供電腦名稱,並在 ST_Credential 變數中提供該電腦的認證。 例如,在寫入目標類型為 "Any" 的指令碼時,您可以指定此指令:

Get-WmiObject win32_Share -ComputerName $ST_ComputerName -Credential $ST_Credential

不過,在針對本機電腦執行時,此命令將會失敗,並出現下列錯誤:

Get-WmiObject : User credentials cannot be used for local connections

換句話說,若目標類型為 "Any" 且目標電腦並不是控制台,則該指令有效,但會在以下情況中失敗:

  • 目標類型為 'Console'
  • 目標類型為 'WinRM Remoting'
  • 目標類型為 'Any' 且目標為控制台電腦

若要將這些情況列入考量,您的指令碼可能需要測試是否使用遠端,或目標是否為控制台電腦。 若要簡化指令碼建立,ITScript 可提供兩種函式: ST-ComputerAndCredentialST-SubCC

ST-ComputerAndCredential

根據指令碼類型、其是否在控制台上執行,以及是否為電腦提供認證,

此函式傳回的字串會包含用於 -ComputerName 和 -Credential 參數的適當字串。 它會傳回下列其中一行字串:

“-ComputerName $ST_ComputerName –Credential $ST_Credential”

“-ComputerName $ST_ComputerName”

“”

您可以在您的指令碼命令中使用而不需要考慮執行時的環境。 例如:

$cc = ST-ComputerAndCredential

$shares = Invoke-Expression "Get-WmiObject win32_Share $cc"

在執行命令之前,可使用 Invoke-Expression 以替代 $cc 的值。 此建構的問題在於您必須記得在指令中逸出特殊字元。 例如,以下指令需要逸出 "$" 和引號字元:

$ST_CC = ST-ComputerAndCredential

$registryObject = Invoke-Expression "Get-WmiObject -list

-namespace root\default $ST_CC |

where-object { `$_.name -eq `"StdRegProv`" }"

以下函式將此過程變得更加簡單。

ST-SubCC

此函式結合了前一個範例中顯示的兩個命令。 在第一次叫用時,它會將 ST-ComputerAndCredential 的結果置於名為 ST_CC 的 PowerShell 變數中。 然後它會將產生的命令傳送至 Invoke-Expression。 在使用 ST_SubCC 時請務必記得將命令置於單引號而非雙引號內。 前一個範例應為:

$shares = ST-SubCC ‘Get-WmiObject win32_Share $ST_CC’

 

$registryObject = ST-SubCC ‘Get-WmiObject -list

-namespace root\default $ST_CC |

where-object { $_.name -eq "StdRegProv" }’