Dynamics CRM 4.0 でインポートを実施すると次のエラー理由でインポートが失敗することがあります。

ログオン中のユーザーには、これらのレコードを表示したり、特定の操作を実行する適切なセキュリティのアクセス許可がありません。

インポートの失敗を確認すると、上記エラーメッセージを確認できます。

 

このようなエラーがでるのは、インポートファイルにレポート作成日列が設定しているためです。上記エラーを対処する方法についてKBが公開されているので紹介します。

Error message when you start the report wizard or when you perform the Bulk Import activity in Microsoft Dynamics CRM 4.0: "The logged on user does not have the appropriate security permissions to view these records or perform the specific action" 
http://support.microsoft.com/kb/950886/en-us

Error message in Microsoft Dynamics CRM: "The logged-on user does not have the appropriate security permissions to view these records or perform the specific action"
http://support.microsoft.com/kb/953962/en-us

KBを確認するとわかりますが、レコード作成日を指定してインポートできるのは、システム管理者セキュリティロールを持つユーザのみです。それ以外のロールやスクラッチで作成したセキュリティロールは隠し権限である prvOverrideCreatedOnCreatedBy を持たないためです。そのため対処方法は次のようになります。

  • システム管理者セキュリティロールを持たないユーザはレコード作成日を設定してインポートしない。
  • システム管理者セキュリティロールをコピーし、そのロールをユーザに付与する。コピーしたセキュリティーロールは削除できる権限は削除して問題ない。
  • 個別修正プログラムを適用する(上述の最初のKBのリンク"View and request hotfix downloads" から入手。個別修正プログラムのKBは Microsoft Dynamics CRM 4. 0 の更新プログラムおよび修正プログラム の "配布が制限されている修正プログラム" の中のKB950886のリンク先と同じです。
  • prvOverrideCreatedOnCreatedBy をプログラム的に付与する

動作確認したところ、システム管理者セキュリティロールをコピーしたロールを付与することで、レコード作成日を指定したインポートが可能になりました。

本記事では4番目のプログラムからprvOverrideCreatedOnCreatedByのPrivilegeId(固定値:D48CF22F-F8C2-4E16-89EB-49F8281DE4EA)をロールに付与する方法を紹介します

1. prvOverrideCreatedOnCreatedByを任意のロールに付与、削除するプログラム

prvOverrideCreatedOnCreatedBy の PrivilegeId は固定値(D48CF22F-F8C2-4E16-89EB-49F8281DE4EA)です。固定のGUIDを持つ権限については、 SDK や MSDN などを参照してください(例:Customization Privileges )

参考プログラムを記載します。 AddPrivilegeToRole はロールにprvOverrideCreatedOnCreatedBy 権限を付与するメソッド。RemovePrivilegeFromRoleは権限を取り除くメソッドです。すでに権限んを持つロールに対して再度 AddPrivilegesRoleRequest  を実行してもエラーは発生しません。

namespace AddPrivilegeToRole
{
    class Program
    {
        /// <summary>
        /// 作成日を指定してインポートを行える権限を
        /// ロールに追加/削除するサンプルプログラム
        /// </summary>
        /// <param name="args"></param>
        static void Main(string[] args)
        {
            CrmService service = CreateCrmService();
            AddPrivilegeToRole(service);
            //RemovePrivilegeFromRole(service);
        }

        static void AddPrivilegeToRole(CrmService service)
        {
            // prvOverrideCreatedOnCreatedBy の PrivilegeId
            Guid privilegeid = new Guid("d48cf22f-f8c2-4e16-89eb-49f8281de4ea");

            // 権限を付与するロールのGUID
            Guid roleid = new Guid("99C95A68-436E-E011-9677-001DD8B81DD7");

            AddPrivilegesRoleRequest request = new AddPrivilegesRoleRequest();
            RolePrivilege[] roleprivileges = new RolePrivilege[1];
            roleprivileges[0] = new RolePrivilege();
            roleprivileges[0].PrivilegeId = privilegeid;
            roleprivileges[0].Depth = PrivilegeDepth.Global;
            request.Privileges = roleprivileges;
            request.RoleId = roleid;

            AddPrivilegesRoleResponse response = service.Execute(request) as AddPrivilegesRoleResponse;

        }
        static void RemovePrivilegeFromRole(CrmService service)
        {
            // prvOverrideCreatedOnCreatedBy の PrivilegeId
            Guid privilegeid = new Guid("d48cf22f-f8c2-4e16-89eb-49f8281de4ea");

            // 権限を付与するロールのGUID
            Guid roleid = new Guid("99C95A68-436E-E011-9677-001DD8B81DD7");

            RemovePrivilegeRoleRequest request = new RemovePrivilegeRoleRequest();
            request.PrivilegeId = privilegeid;
            request.RoleId = roleid;

            RemovePrivilegeRoleResponse response = service.Execute(request) as RemovePrivilegeRoleResponse;
        }
        static CrmService CreateCrmService()
        {
            CrmService service = new CrmService();
            service.Url = "http://localhost/mscrmservices/2007/crmservice.asmx";
            service.Timeout = 100000;
            service.UseDefaultCredentials = true;

            // 認証トークン作成
            CrmAuthenticationToken token = new CrmAuthenticationToken();
            token.AuthenticationType = 0; // AD
            token.OrganizationName = "dynorg";
            service.CrmAuthenticationTokenValue = token;

            service.UnsafeAuthenticatedConnectionSharing = true;
            service.PreAuthenticate = true;

            return service;
        }

    }
} 

2. スクラッチからロールを作成した場合に付与されない権限

参考に、スクラッチから作成した場合に付与されない権限のKBのリンクを記載します。

Some privileges are missing from a security role that you create from scratch in Microsoft Dynamics CRM 4.0
http://support.microsoft.com/kb/957976/en-us

3. インポートエラーの突き止め方

インポートで失敗すると、インポートのエラー一覧で内容を確認してもよくわからないメッセージが表示されることがあります。今回のエラーで、権限不足であることを突き止めた方法の手順のメモを記載します。まず、FilteredImportLogからインポート時のエラーの付随情報を調べます。

select TOP 10 additionalinfo, *
  from dbo.FilteredImportLog
 order by createdon desc

上記クエリでadditionalinfo に次のエラーメッセージが設定されていることが確認できました。

SecLib::CrmCheckPrivilege failed. Returned hr = -2147220960 on UserId: XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX and PrivilegeId: d48cf22f-f8c2-4e16-89eb-49f8281de4ea

PrivilegeId d48cf22f-f8c2-4e16-89eb-49f8281de4ea が不足しているとなっているので、素直に PrivilegeBase を調べました。

select Name,  * from PrivilegeBase where PrivilegeId = 'd48cf22f-f8c2-4e16-89eb-49f8281de4ea'

クエリの結果 prvOverrideCreatedOnCreatedBy という名前の権限であることが確認できます。

4.まとめ

説明は以上です。誤り、指摘点などありましたらご連絡ください。