指定 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-ComputerAndCredential 和 ST-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" }’