Dynamics CRM 2011 サンプル紹介 監査履歴の取得

みなさん、こんにちは。

今回は SDK 5.0.5 で提供された監査に関連するサンプルを紹介します。
このサンプルでは以下の機能を紹介しています。

‐ 組織レベルの監査の有効化/無効化
‐ エンティティレベルの監査の有効化/無効化
-  監査レコードの取得

またサンプルは以下のフォルダにあります。
sdk\samplecode\cs\datamanagement\auditing

早速サンプルの中身を確認しましょう。

サンプルのファイル構成

サンプルは以下のファイルで構成されています。

‐ CrmServiceHelpers.cs : Dynamics CRM サーバー接続用ヘルパーファイル
‐ DeviceIdManager.cs : デバイス ID 作成用ヘルパーファイル
‐ MyOrganizationCrmSdkTypes.cs : 事前バインド用ファイル
‐ Program.cs : メインプログラム

MyOrganizationCrmSdkTypes.cs ファイルに関しては、CrmSvcUtil.exe を利用して
独自環境のファイルに置き換え、カスタムエンティティの情報を利用することも可能です。

Program.cs

サービスの作成部分は他のサンプルと同じであるため、説明は割愛します。

以下の手順で処理が行われています。

1. 75 行目で WhoAmIRequest を実行して、現在のユーザーの組織 ID を取得します。

Guid orgId = ((WhoAmIResponse)_service.Execute(new WhoAmIRequest())).OrganizationId;

2. 82行目で、現在の監査設定を保存します。

bool organizationAuditingFlag = org.IsAuditEnabled.Value;

2. 次に 83 行目で監査設定を有効にし、次の行で更新します。

org.IsAuditEnabled = true;
_service.Update(org);

3. そして 87 行目で取引先企業の監査を有効にするメソッドを呼び出します。

bool accountAuditingFlag = EnableEntityAuditing(Account.EntityLogicalName, true);

4. EnableEntityAuditing メソッド内では、180 行目で現在の設定を取得、187 行目で設定を保存し、
192 行目で監査を有効にしています。

private bool EnableEntityAuditing(string entityLogicalName, bool flag)
{
    // エンティティの情報を取得.
    RetrieveEntityRequest entityRequest = new RetrieveEntityRequest
    {
        LogicalName = entityLogicalName,
        EntityFilters = EntityFilters.Attributes
    };

    RetrieveEntityResponse entityResponse =
        (RetrieveEntityResponse)_service.Execute(entityRequest);

    // 結果から EntityMetadata を取得
    EntityMetadata entityMetadata = entityResponse.EntityMetadata;

    // 現在の監査設定を保存し、新しい監査設定を設定
    bool oldValue = entityMetadata.IsAuditEnabled.Value;
    entityMetadata.IsAuditEnabled = new BooleanManagedProperty(flag);

    UpdateEntityRequest updateEntityRequest = new UpdateEntityRequest { Entity = entityMetadata };

    // エンティティの情報を更新
    UpdateEntityResponse updateEntityResponse =
        (UpdateEntityResponse)_service.Execute(updateEntityRequest);

    return oldValue;
}

5. 92 行目で、監査のレコードを作製するために取引先企業の作成および更新を
行うメソッドを呼び出します。

6. 100 行目より、監査のレコードを取得します。

// RetrieveRecordChangeHistoryRequest を作成。取引先企業エンティティであることと
// 監査レコードを取得したい取引先企業の GUID を引数として設定
RetrieveRecordChangeHistoryRequest changeRequest = new RetrieveRecordChangeHistoryRequest();
changeRequest.Target = new EntityReference(Account.EntityLogicalName, _newAccountId);

RetrieveRecordChangeHistoryResponse changeResponse =
    (RetrieveRecordChangeHistoryResponse)_service.Execute(changeRequest);

// 結果から AuditDetailCollection を保存
AuditDetailCollection details = changeResponse.AuditDetailCollection;

7. 109 行目で、取得した AuditDetailCollection を AttributeAuditDetail にキャストします。

8. それ以降で中身を確認して、画面に表示します。

9. 152 行目以降で監査の設定を保存しておいた元の設定に戻し、作成したレコードを削除します。

まとめ

今回はシンプルなサンプルの紹介でしたが、監査のログは管理者が定期的に確認する必要があり、
また他のサーバー等へ情報をコピーしておきたいといった要望もあると思います。

こちらのサンプルを活用することで、柔軟な監査管理が行えそうですね。

監査に関係するサンプルは他にも、 DeleteAuditDataRequest を利用したパーティションの
削除や RetrieveAuditPartitionListRequest を利用したパーティションの取得が SDK 内、
DeleteAuditDataRequest Class のページ に紹介されています。

- Dynamics CRM サポート 中村 憲一郎