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 サポート 中村 憲一郎