在 Service Manager 撰寫工具中建立自定義活動的指導方針

重要

此版本的 Service Manager 已終止支援。 建議您升級至 Service Manager 2022

Service Manager 自動化各種資訊技術 (IT) 程式。 例如,針對事件管理程式,Service Manager 包含各種自動化步驟,例如在建立或解決事件時對使用者的自動通知,以及根據分類將事件自動路由傳送至各種佇列。 這項自動化的實作是利用針對各種解決方案定義的工作流程,並使用 Windows Workflow Foundation (WF) 功能來描述、執行與追蹤自動化作業。

客戶和合作夥伴可以透過定義並將新工作流程加入程序中,以擴充其包含的自動化功能。 工作流程可以設定成按照固定排程執行,或是在資料庫中發生指定的狀況時執行,例如在建立事件時,或是當事件變更為指定的狀態 (如 [作用中] 或 [已解決] ) 時。

Service Manager 撰寫工具提供建立新工作流程的簡單方法。 它提供一個程式庫,內含不同的工作流程活動,例如建立事件或更新事件,還有一個拖放式圖形設計工具,讓您用來將這些工作流程活動編排成工作流程順序。 接著,撰寫工具會將新的工作流程編譯成一組定義、程式代碼和管理元件內容。 當這項資訊匯入 Service Manager 時,會將新的工作流程整合到指定的解決方案中。

瞭解撰寫工具幕後發生什麼事,可讓更進階的使用者受益。 首先,客戶和合作夥伴可以使用這項資訊,透過套用至其特定程式的工作流程活動,在 Service Manager 中擴充工作流程活動連結庫。 其次,開發人員可以使用這項資訊來建置與 Service Manager 相容的自定義或進階工作流程,例如 Microsoft Visual Studio 開發系統。

工作流程活動和 WorkflowActivityBase 類別

Service Manager 工作流程使用 WF 活動。 若要順利使用 Authoring Tool,這些活動衍生自屬於 Microsoft.EnterpriseManagement.Workflow.Common 命名空間的基類 WorkflowActivityBaseWorkflowActivityBase 基類引進了 WF 活動的泛型 Activity 基類中無法使用的屬性和方法。 如需如何使用泛型 Activity 基類定義 WF 活動 的詳細資訊,請參閱 活動類別

使用 WorkflowActivityBase 類別的優點

使用者可以從 Visual Studio 活動連結庫匯入 WF 活動,而且可以在 [ 撰寫工具撰寫 ] 窗格中使用這些活動。 不過,這些活動的行為表現與在 Visual Studio 設計環境中一樣。 它們沒有內建在 Service Manager 活動連結庫中的自定義專案。

注意

並非所有 Visual Studio WF 活動都已測試與 Authoring Tool 的相容性,而且某些 Visual Studio WF 活動可能無法在撰寫工具中正確執行。

下表列出以 WorkflowActivityBase 基底類別為基礎的 WF 活動與以一般 Activity 基底類別為基礎的 WF 活動,其行為上的不同之處。

案例 撰寫工具 WF 活動 (WorkflowActivityBase 基類) Visual Studio WF 活動 (Activity 基底類別)
使用者 (將活動屬性系結至 Service Manager 對象屬性,或系結至其他活動) 的屬性。 呼叫 Bind 屬性至針對 Service Manager 使用者自定義的對話方塊。 呼叫 Bind 屬性至 適用於開發人員的對話框。
使用者會將活動新增到 [For-Each 迴圈] 活動。 新增內容 Propertytobind (迴圈索引) 和 CurrentItem,亦即參與迴圈特定作業所需的內容 (CurrentItem 是內部內容)。 針對迴圈的每個反覆項目,行為方式相同,而且不會與索引循環的屬性互動。

重要

由於 Authoring Tool 工作流程設計工具所需的自定義專案,因此以 WorkFlowActivityBase 類別為基礎的活動在 Visual Studio 工作流程設計環境中不會如預期般運作。

用戶可以在 Visual Studio 中建置自定義 WF 活動,以用於撰寫工具。 不過,若要利用 Authoring Tool 的自定義設計時間行為,自定義活動必須以 WorkflowActivityBase 類別為基礎,而不是 Activity 類別。

工作流程活動和 Service Manager 自動化活動

WF 活動可以與不同類型的活動互動,Service Manager 工作專案所使用的 Service Manager 活動。 工作專案是 Service Manager 使用的主要物件類型之一。 工作項目會追蹤工作單位,例如 [事件] 、[服務要求] 、[變更要求] ,以及其他工作單位。 大部分的工作項目都會組成一或多個 Service Manager 活動。 例如,[變更要求] 通常包括至少兩個活動:[檢閱] 活動和 [變更執行] 活動。 工作項目通常會依序執行這些活動。

建立工作專案時,第一個 Service Manager 活動會變成作用中,並在 Service Manager (或使用者) 執行活動所代表的任何工作時保持作用中。 當該工作完成時,Service Manager 會將第一個活動標示為 Completed,並在序列中啟動下一個活動。 當序列中的最終活動標示為 Completed 時,Service Manager 會將整個工作項目標示為 Completed

某些 Service Manager 活動可以手動執行,例如變更要求的檢閱活動。 其他 Service Manager 活動可以自動化,例如傳送電子郵件給用戶的活動。 變更要求變更執行 活動可以自動化。 Service Manager 使用 WF 工作流程將 Service Manager 活動自動化。

範例:將活動狀態設定為已完成活動

Service Manager 中的 WF 工作流程活動範例會使用設定活動狀態為已完成 WF 活動。 此 WF 活動通常代表工作流程中實作自動化 Service Manager 活動的最後一個步驟,並將該活動的狀態設定為 Completed。 設定這個狀態會促使系統移到工作項目中的下一個活動,而且這個程序會不斷重複,直到工作項目中的最後一個活動完成為止。

[將活動狀態設定為已完成] 活動會接受一個輸入[活動標識符],以識別要採取動作 Service Manager 活動。WF 活動接著會連線到 Service Manager 管理伺服器、從資料庫擷取指定的 Service Manager 活動、將其狀態設定為 Completed,然後將它儲存回資料庫。 本範例中包含的程式碼範例大多來自 SetActivityStatusToCompleted.cs 檔案,亦即描述 [將 [活動狀態] 設定為「已完成」] 活動的基礎檔案。

初始化範例 WF 活動

SetActivityStatusToCompleted.cs 檔案的第一個區段包含宣告和初始化陳述式。 這個活動是以 WorkflowActivityBase 類別為基礎,並使用驗證類別 SetActivityStatusToCompletedValidator 和設計工具類別 WorkflowActivityBaseDesigner

WorkflowActivityBaseDesigner 類別包含上一節使用 WorkflowActivityBase 類別的優點中所述的自定義。 您可以進一步擴充並自訂這個類別。

此範例活動之活動定義的第一個區段包含下列程式碼:

namespace Microsoft.ServiceManager.WorkflowAuthoring.ActivityLibrary
{
    // ---------------------------------------------------------------------
    /// <summary>
    /// Activity to set an activity's status to complete
    /// </summary>
    // ---------------------------------------------------------------------
    [ToolboxItem(typeof(ActivityToolboxItem))]
    [ActivityValidator(typeof(Validators.SetActivityStatusToCompletedValidator))]
    [Designer(typeof(WorkflowActivityBaseDesigner))]
    public sealed partial class SetActivityStatusToCompleted : WorkflowActivityBase
    {

範例 WF 活動的輸入屬性

此程式碼會將一個內容 ( ActivityId) 宣告為相依性內容。 這表示這個內容可以繫結到在工作流程層級定義的參數。 在此情況下,Service Manager 活動的標識符會以工作流程參數的形式傳入工作流程,並以輸入的形式流入此活動。

  // --------------------------------------------------------------------------------
  /// <summary>
  /// Dependency Property for ActivityId property
  /// </summary>
  // --------------------------------------------------------------------------------
  public static DependencyProperty ActivityIdProperty =
      DependencyProperty.Register("ActivityId", typeof(String), typeof(SetActivityStatusToCompleted));

  // --------------------------------------------------------------------------------
  /// <summary>
  /// Activity ID
  /// </summary>
  // --------------------------------------------------------------------------------
  [Browsable(true)]
  [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
  public string ActivityId
  {
      get
      {
          return (string)this.GetValue(ActivityIdProperty);
      }
      set
      {
          this.SetValue(ActivityIdProperty, value);
      }
}

範例 WF 活動中的執行行為

Execute 方法會執行這個 WF 活動的實際工作。 在 Execute 方法的範圍內,WF 活動會執行下列工作:

  • 偵測其是否在 For-Each 循環 活動內運作,如果是的話,請設定適當的 WF 活動屬性。

  • 連接到指定的 Service Manager 管理伺服器,並建立 EnterpriseManagementGroup 物件。

  • 使用 ActivityId 屬性,從資料庫取得已識別 Service Manager 活動。

  • 尋找 Service Manager 活動的類別定義、取得擷取 Service Manager 活動的 Status 屬性,並將 屬性設定為 Completed 列舉清單值。

  • 認可 Service Manager 活動的變更。

  • 使用 TrackData 方法 (WF 基礎結構的一部分) 記錄有關 WF 活動之執行和狀態的追蹤資訊。

        // --------------------------------------------------------------------------------
        /// <summary>
        /// The execute method will have the implementation to set the activity status to complete.
        /// </summary>
        // --------------------------------------------------------------------------------
        protected override ActivityExecutionStatus Execute(ActivityExecutionContext executionContext)
        {
            try
            {
                // Initialize the current item if the activity contained within the For-Each loop
                base.Execute(executionContext);

                // Validate Parameters
                if (String.IsNullOrEmpty(ActivityId))
                {
                    throw new ArgumentNullException("ActivityId");
                }

                string SMServer = "localhost";

                Guid TaskGuid = new Guid(ActivityId);
                EnterpriseManagementGroup _mg = new EnterpriseManagementGroup(SMServer);

                EnterpriseManagementObject Activity = _mg.EntityObjects.GetObject
                    <EnterpriseManagementObject>(TaskGuid, ObjectQueryOptions.Default);

                ManagementPack SystemMP = _mg.ManagementPacks.GetManagementPack(
                    SystemManagementPack.System);
                ManagementPack ActivityMP = _mg.ManagementPacks.GetManagementPack(
                    Resources.ActivityManagementMP, SystemMP.KeyToken, SystemMP.Version);

                ManagementPackClass activityClass = _mg.EntityTypes.GetClass(
                    Resources.WorkItemActivityClass, ActivityMP);

                ManagementPackProperty status = activityClass.PropertyCollection["Status"];
                ManagementPackEnumeration Completed =
                    _mg.EntityTypes.GetEnumeration("ActivityStatusEnum.Completed", ActivityMP);

                Activity[status].Value = Completed;
                Activity.Commit();
            }
            catch (ArgumentNullException argNullException)
            {
                // Log to Tracking Service
                TrackData(argNullException.ToString());

                throw;
            }
            catch (EnterpriseManagementException mgmtException)
            {
                TrackData(mgmtException.ToString());
                throw;
            }

            return ActivityExecutionStatus.Closed;
        }
    }
}

範例 WF 活動中的驗證行為

SetActivityStatusToCompletedValidator.cs 檔案可定義 WF 活動的驗證行為。 這項行為定義設計工具如何指出此 WF 活動是否已完整定義或是仍需要定義一或多項輸入。 撰寫工具使用紅色驚嘆號 () 工作流程活動在 [撰寫 ] 窗格中的 圖示,指出與Visual Studio類似的驗證錯誤。

namespace Microsoft.ServiceManager.WorkflowAuthoring.ActivityLibrary.Validators
{
    // --------------------------------------------------------------------------------
    /// <summary>
    /// Validator for the SetActivityStatusToCompleted activity
    /// </summary>
    // --------------------------------------------------------------------------------
    internal class SetActivityStatusToCompletedValidator : ActivityValidator
    {
        // --------------------------------------------------------------------------------
        /// <summary>
        /// Validator for the SetActivityStatusToCompleted activity
        /// </summary>
        // --------------------------------------------------------------------------------
        public override ValidationErrorCollection Validate(ValidationManager manager, object obj)
        {
            // Performing default validation
            ValidationErrorCollection errorColl = base.Validate(manager, obj);

            SetActivityStatusToCompleted setActivityStatusToCompletedObj =
                (SetActivityStatusToCompleted)obj;

            // Check if validation is happening during compilation of activity and
            // not during the hosting of an activity
            if (setActivityStatusToCompletedObj.Parent == null)
            {
                return errorColl;
            }

            string propertyName = Common.GetPropertyName(setActivityStatusToCompletedObj);

            // Add validation error if ActivityId is null or empty
            if (setActivityStatusToCompletedObj.ActivityId == null
                &&
                setActivityStatusToCompletedObj.GetBinding(SetActivityStatusToCompleted.ActivityIdProperty) == null
                &&
                String.Compare(propertyName, "ActivityId", false, CultureInfo.InvariantCulture) != 0)
            {
                errorColl.Add(new ValidationError(
                    Resources.SetActivityStatusToCompleted_ActivityId_DesignTimeValidation, 10, false));
            }

            return errorColl;
        }
    }
}

在工作流程中使用範例 WF 活動

[撰寫工具] 預設 [活動工具箱] 窗格中包含 [將活動狀態設定為已完成] 活動。 如需將自定義活動新增至 [ 活動工具箱] 窗格的詳細資訊,請參閱 如何安裝自定義活動元件

您可以使用 [撰寫工具] 的 [撰寫] 窗格,以類似使用 Visual Studio 工作流程設計介面的方式來撰寫工作流程。 不過,撰寫工具提供下列優點:

  • 沒有開發技能的使用者可以建置工作流程;他們不需要直接使用程序代碼。

  • 當使用者將工作流程儲存在撰寫工具中時,此工具會產生對應的 Visual C# 和 XOML 程式代碼,並將它編譯成 .dll 檔案。 此工具也會將工作流程與可直接與 Service Manager 互動的管理元件整合。

工作流程的 Visual C# 程式代碼

下列範例顯示撰寫工具針對使用 設定活動狀態為已完成 活動的範例工作流程所產生的Visual C# 程式代碼。 此程式代碼會宣告具有一個工作流程參數的簡單循序工作流程 SetActivityStatusToCompleteWF ,也就是 Dependency 屬性 ActivityIdActivityID 的值是由本範例後面顯示的管理組件定義決定。 當工作流程執行時,Service Manager識別值,並將其傳遞至工作流程。

namespace WorkflowAuthoring
{
    using System;
    using System.ComponentModel;
    using System.ComponentModel.Design;
    using System.Workflow.ComponentModel.Design;
    using System.Workflow.ComponentModel;
    using System.Workflow.ComponentModel.Serialization;
    using System.Workflow.ComponentModel.Compiler;
    using System.Drawing;
    using System.Collections;
    using System.Workflow.Activities;
    using System.Workflow.Runtime;

    public partial class SetActivityStatusToCompleteWF : System.Workflow.Activities.SequentialWorkflowActivity
    {

        public static DependencyProperty ActivityIdProperty = DependencyProperty.Register("ActivityId", typeof(string), typeof(SetActivityStatusToCompleteWF));

        [System.ComponentModel.DesignerSerializationVisibilityAttribute(DesignerSerializationVisibility.Visible)]
        [System.ComponentModel.BrowsableAttribute(true)]
        [System.ComponentModel.CategoryAttribute("Misc")]
        public string ActivityId
        {
            get
            {
                return ((string)(this.GetValue(ActivityIdProperty)));
            }
            set
            {
                this.SetValue(ActivityIdProperty, value);
            }
        }
    }
}

工作流程的 XOML 程式代碼

WF 使用 XOML 格式處理某些工作流程定義。 針對範例工作流程,撰寫工具會使用下列內容建立 SetActivityStatusToCompleteWF.xoml 檔案:

<SequentialWorkflowActivity x:Class="WorkflowAuthoring.SetActivityStatusToCompleteWF" x:Name="SetActivityStatusToCompleteWF" xmlns:ns0="clr-namespace:Microsoft.ServiceManager.WorkflowAuthoring.ActivityLibrary;Assembly=Microsoft.ServiceManager.WorkflowAuthoring.ActivityLibrary, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml" xmlns="https://schemas.microsoft.com/winfx/2006/xaml/workflow">
<ns0:SetActivityStatusToCompleted ActivityId="{ActivityBind SetActivityStatusToCompleteWF,Path=ActivityId}" x:Name="setActivityStatusToCompleted1" PropertyToBind="{x:Null}" />
</SequentialWorkflowActivity>

SetActivityStatusToCompleteWF.xoml 宣告工作流程 SetActivityStatusToCompleteWF 會執行一個工作流程活動, 將活動狀態設定為已完成。 該活動具有一個輸入參數, ActivityId,而這個參數會從工作流程的 ActivityId 內容取得值。

在管理元件中宣告工作流程及其觸發條件

Service Manager 無法使用隔離的工作流程 .dll 檔案;工作流程必須與管理元件整合。 管理組件會定義工作流程應執行的時機,以及所要使用的輸入值。 同時產生工作流程程式代碼並編譯工作流程 .dll 檔案,撰寫工具會將工作流程相關信息新增至管理元件。

範例工作流程 SetActivityStatusToCompleteWF與範例管理組件相關聯,名為 Woodgrove.AutomatedActivity.AddComputerToGroupMP.xml。 此管理元件會使用新的自動化 Service Manager 活動來擴充變更管理程式。 當新活動在變更管理作業中變成作用中時,它會觸發 SetActivityStatusToCompleteWF 工作流程。

當新的 Service Manager 活動變更狀態) 時,管理元件會定義工作流程 (的觸發程式,並定義要用於 ActivityId 屬性的值, (新 Service Manager 活動的唯一標識符) 。 工作流程執行時,會將新 Service Manager 活動的狀態變更為 [已完成]。 請注意,在一般工作流程中,這會是工作流程中其他 WF 活動執行的其他某項工作後的最後一個步驟。

管理組件的 Monitoring 區段包含工作流程的 Rule 定義, 而 Rule 定義具有兩個組件: DataSource 元素和 WriteAction 元素。

針對範例工作流程,DataSource 元素包含 Subscription 元素,指定當 AddComputerToGroup 類別的實例 (自定義 Service Manager 類別) 狀態變更為 Active 時,工作流程應該執行。

<Monitoring>
    <Rules>
        <Rule ID="SetActivityToCompleteRule" Enabled="true" Target="SystemCenterLibrary!Microsoft.SystemCenter.SubscriptionWorkflowTarget" ConfirmDelivery="false" Remotable="true" Priority="Normal" DiscardLevel="100">
            <Category>Notification</Category>
            <DataSources>
                <DataSource ID="DS" TypeID="Subscriptions!Microsoft.SystemCenter.CmdbInstanceSubscription.DataSourceModule">
                    <Subscription>
                        <InstanceSubscription Type="$MPElement[Name='AddComputerToGroup']$">
                            <UpdateInstance><Criteria><Expression><SimpleExpression>
                                <ValueExpression>
                                    <Property State="Post">$Context/Property[Type='Activity!System.WorkItem.Activity']/Status$</Property>
                                </ValueExpression>
                                <Operator>Equal</Operator>
                                <ValueExpression>
                                    <Value>$MPElement[Name='Activity!ActivityStatusEnum.Active']$</Value>
                                </ValueExpression>
                            </SimpleExpression></Expression></Criteria></UpdateInstance>
                        </InstanceSubscription>
                        <StartWatermark>1</StartWatermark>
                        <PollingIntervalInSeconds>60</PollingIntervalInSeconds>
                        <BatchSize>100</BatchSize>
                    </Subscription>
                </DataSource>
            </DataSources>
        </Rule>
    </Rules>
</Monitoring>

WriteAction 元素 (即 Microsoft.EnterpriseManagement.SystemCenter.Subscription.WindowsWorkflowTaskWriteAction) 定義符合觸發條件時應執行的工作。 在此元素內, Subscription 元素可識別所要執行的工作流程組件 (SetActivityStatusToCompleteWF.dll),以及此組件中代表工作流程 WorkflowTypeName的類別。

Subscription 元素也包含 WorkflowParameter 元素,它會定義 ActivityId 屬性,並使用語法 $Data/BaseManagedEntityId$,將它系結至 DataSource 元素中所記錄之 Service Manager 活動的唯一標識符。

WriteAction 元素也會儲存工作流程的選擇性設定詳細數據,例如工作流程失敗時要執行的重試次數、重試的頻率,以及工作流程在關閉前應該執行的最大時間。

<WriteActions>
    <WriteAction ID="WA" TypeID="Subscriptions!Microsoft.EnterpriseManagement.SystemCenter.Subscription.WindowsWorkflowTaskWriteAction">
        <Subscription>
            <WindowsWorkflowConfiguration>
                <AssemblyName>SetActivityStatusToCompleteWF</AssemblyName>
                <WorkflowTypeName>WorkflowAuthoring.SetActivityStatusToCompleteWF</WorkflowTypeName>
                <WorkflowParameters>
                    <WorkflowParameter Name="ActivityId" Type="string">
                        $Data/BaseManagedEntityId$
                    </WorkflowParameter>
                </WorkflowParameters>
                <RetryExceptions></RetryExceptions>
                <RetryDelaySeconds>60</RetryDelaySeconds>
                <MaximumRunningTimeSeconds>300</MaximumRunningTimeSeconds>
            </WindowsWorkflowConfiguration>
        </Subscription>
    </WriteAction>
</WriteActions>

匯入管理元件

若要讓工作流程在特定 Service Manager 管理伺服器上執行,與工作流程相關的所有檔案都必須位於該伺服器上。 這些檔案包括下列各項:

  • WF 活動組件檔。 如果您只使用 Service Manager WF 活動,則預設會安裝適當的檔案。 如果您使用自定義活動,請參閱 如何安裝自定義活動元件

  • 工作流程組件檔,即本案例中的 SetActivityStatusToCompleteWF.dll。 您必須手動將此檔案複製到 Service Manager 管理伺服器。

  • 管理組件檔案,即本案例中的 Woodgrove.AutomatedActivity.AddComputerToGroupMP.xml。 您必須手動將此檔案複製到 Service Manager 管理伺服器。

當所有檔案都就緒時,請將管理元件匯入 Service Manager。 您可以使用命令列工具或 Service Manager 主控台 mpimport.exe 來執行此動作。 匯入管理元件之後,每當定義為其觸發程式的條件符合時,工作流程即可執行。

下一步