指令碼中繼資料
為能在 Security Controls 中使用指令碼,指令碼必須包含能唯一識別其本身的中繼資料,以及說明其本身的功能和輸入參數。 本節將說明如何建立該中繼資料。
讓我們先從具有一個輸入參數的簡易單行指令碼開始:
Get-Service $serviceName -ComputerName "$ST_ComputerName"
具有 Security Controls 所需中繼資料的完整指令碼如下所示。 某些資訊是選擇性的,稍後將詳細說明每個元素。
<#
<stScript uid="d0d3c64c-19a3-4879-9396-ac8769d60c9c">
<name>GetServices</name>
<version>1.0.0.0</version>
<author>My Company</author>
<scriptType type="any" />
<minEngineVersion>8.0.0.0</minEngineVersion>
<modifiesTarget>false</modifiesTarget>
<options>
<option name="OutputMachineResults" value="true" />
<option name="OutputRunResults" value="true" />
<option name="CombineOutputFiles" value="false" />
<option name="DeleteMachineFiles" value="false" />
</options>
<concurrency default="16" />
<description>
<category>Information</category>
<purpose>Get the services on the target machine</purpose>
<inputs>Wildcard of service name</inputs>
<outputs>List of installed services</outputs>
</description>
<parameters>
<parameter>
<name>serviceName</name>
<description> Wildcard service(s) to query </description>
<default>”*”</default>
</parameter>
</parameters>
</stScript>
#>
Get-Service $serviceName -ComputerName "$ST_ComputerName"
中繼資料區塊
中繼資料是指令碼註解內部的一個 XML 片段。
指令碼註解分隔符號為「<#」和「#>」。基於我們的目的,這些分隔符號必須獨自位於一行並從資料行 1 開始。
XML 文件的根元素為 "stScript"。 其具有一項屬性,就是指令碼的唯一識別碼。 這是全域唯一識別碼 (GUID)。 GUID 是由 32 個十六進位字元所指定,格式為 "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"。 有許多的標準工具可用來產生 GUID。
開始和結束元素都必須獨自位於一行,並從資料行 1 開始。 因此,Security Controls 中使用的所有指令碼都應以這兩行開始 (每個指令碼都取代一個不同的 GUID):
<#
<stScript uid="d0d3c64c-19a3-4879-9396-ac8769d60c9c">
並以這兩行結束:
</stScript>
#>
其他元素應依照以下所述順序出現。
name
這個必要元素提供顯示在 Security Controls 中的指令碼名稱。 名稱必須介於 1 到 100 個字元之間。 名稱可包含空格和特殊字元。
範例:
<name>GetServices</name>
version
這個必要的元素會指定指令碼的版本。 版本是由四個整數數字所指定,並以句號區隔。 當您修改指令碼時,較新的版本必須大於您之前已使用的任何版本。
範例:
<version>1.0.0.0</version>
author
這個必要的元素可用來識別指令碼的作者。 依慣例,它會使用作者的名稱或公司的名稱。 此欄位必須介於 1 至 256 個字元之間且不得為空白。
範例:
<author>My Company</author>
scriptType
這個必要的元素會指定指令碼執行的類型。 它具有一個必要的屬性 "type" 且其必須包含下列其中一項:
- type=“any” 表示指令碼會針對一個或多個目標電腦執行,但不需要 PowerShell 遠端。 這是最常見的指令碼類型,同時也是未指定 scriptType 元素時的預設值。
- type=”consoleOnly” 表示指令碼不會針對一組目標電腦執行。 此類型的指令碼無法針對電腦群組或選取的電腦執行。 只有當您在 Security Controls 功能表中選取「工具 > 執行控制台 ITScript」時,這類指令碼才會出現在可用的指令碼中。
- type=”remote” 表示指令碼會針對一個或多個目標電腦執行,且 PowerShell 遠端必須在目標電腦上可用及進行設定。
- type=”esxServer” 表示指令碼將針對 ESXi Server 或 vCenter Server 執行。 此類型的指令碼僅針對包含 ESXi Server 的電腦群組執行。 如果電腦群組包含其他任何電腦,則此指令碼執行時,將忽略這些電腦。
範例:
<scriptType type="any" />
minEngineVersion
這個選擇性元素會指定執行此指令碼所需的最低 ITScript 引擎版本。 若未指定,則應寫入指令碼以執行任何版本的 ITScript 引擎。
範例:
<minEngineVersion>8.0.0.0</minEngineVersion>
modifiedTarget
這個選擇性元素表示指令碼是否對目標電腦進行任何修改。 若未指定,則會預設為 "false",表示指令碼只會收集資訊但不會修改目標電腦。 這僅做為說明文件用途。 該值並不保證指令碼不會修改目標電腦。
範例:
<modifiesTarget>false</modifiesTarget>
options
這個選擇性元素與其四個子元素會告訴 ITScript 引擎應產生哪些標準輸出檔案。 依預設,引擎將會產生下列標準輸出檔案:
- runoutput.txt: 若產生任何執行輸出,表示一個檔案代表整個執行
- runerror.txt: 若偵測到錯誤,表示一個檔案代表整個執行
- machineoutput.txt: 若產生任何電腦輸出,表示一個檔案代表每個目標電腦
- machineerror.txt: 若偵測到錯誤,表示一個檔案代表每個目標電腦
若您在中繼資料中指定如下項目,則不會產生 runoutput.txt 和 runerror.txt 檔案:
<option name="OutputRunResults" value="false" />
若您在中繼資料中指定如下項目,則不會產生 machineoutput.txt 和 machineerror.txt 檔案:
<option name="OutputMachineResults" value="true" />
若您想要將所有電腦的 machineoutput.txt 檔案串連至 runoutput.txt 檔案,並將所有 machineerror.txt 檔案串連至 runerror.txt,可指定此選項:
<option name="CombineOutputFiles" value="true" />
若您選擇結合個別電腦輸出和錯誤檔案,可選擇透過指定如下項目刪除個別檔案:
<option name="DeleteMachineFiles" value="true" />
範例:
<options>
<option name="OutputMachineResults" value="true" />
<option name="OutputRunResults" value="true" />
<option name="CombineOutputFiles" value="false" />
<option name="DeleteMachineFiles" value="false" />
</options>
concurrency
這個選擇性元素可指定在針對一組目標電腦執行指定碼時,要使用的預設最高並行層級。 您可以建立一個 ITScript 範本並指定不同的並行值以覆寫 Security Controls 中的值。 若未指定,則預設的最大並行數會設為 32。
範例:
<concurrency default="16" />
description
"description" 元素與其四個子元素都是必要元素。 在此輸入的資訊將會顯示於 Security Controls 中。
category
必要的 "category" 元素是 description 元素的子系。 category 可協助您組織指令碼。 類別必須介於 1 到 50 個字元之間。 標準類別包括:「組態」、「群組原則」、「資訊」、「維護」、「監視」和「支援」。
purpose
必要的 "purpose" 元素也是 description 元素的子系。 其必須包含 1 到 1024 個字元。 它應精準且正確地描述指令碼的用途。
inputs
必要的 "inputs" 元素也是 description 元素的子系。 其必須包含 1 到 1024 個字元。 它應正確地描述指令碼所需的輸入參數。 如果沒有任何輸入參數,也可以直接指定 "None"。
outputs
必要的 "outputs" 元素也是 description 元素的子系。 其必須包含 1 到 1024 個字元。 它應正確地描述指令碼所產生的輸出。
範例:
<description>
<category>Information</category>
<purpose>Get the services on the target machine</purpose>
<inputs>Wildcard of service name</inputs>
<outputs>List of installed services</outputs>
</description>
parameters
若指令碼需要任何輸入參數,則必須指定 "parameters" 元素。 每個輸入參數都必須有一個 "parameters" 子元素。 每個 "parameters" 元素都必須有三個子元素:
- name: 沒有前置 '$' 的輸入參數名稱。 該名稱必須是在指令碼中使用的有效 PowerShell 變數名稱。
- description: 此描述將顯示在 Security Controls 中。
- default: 此元素會指定將用於參數的預設參數值,除非使用者已在範本中指定替代的值,或者目前正在啟動或排程指令碼執行。 若預設值為字串,則使用撇號或引號將其括住。 撇號可讓字串包含在 PowerShell 中具有特殊意義的字元,例如 $ 和引號。 若要在引號中嵌入字元,請在前方加上 (`) 字元。
範例:
<parameters>
<parameter>
<name>serviceName</name>
<description>Wildcard service(s)to find</description>
<default>”*”</default>
</parameter>
</parameters>