Dynamics CRM のシステムのユーザをプログラムから作成し更新するサンプルを掲載します。動作確認はIFD構成で行っていますが、CrmServiceを作成するところを除けば設置型の場合も大きな違いはないと思います。

動作確認環境

  • 動作環境:Windows 2003 Server , Dynamics CRM 4.0, IFD構成
  • 開発環境:Visual Studio 2008 Professional
  • .NET 3.5

1. 環境の準備

本サンプルはコンソールアプリケーションとして開発します。動作には、DynamicsCRM SDK に付属する、microsoft.crm.sdk.dll、microsoft.crm.sdktypeproxy.dllおよび、System.Web.Service.dll の参照が必要ですので、プロジェクトの参照で追加してください。

1.1 CrmDiscoveryService 用プロキシクラスの作成

CrmDiscoveryServiceを使用するため、Dynamics CRM SDK に付属するwsdlフォルダのcrmdiscoveryservice.wsdlからプロキシクラスを作成します。

プロキシクラスは次のSDKのwsdlフォルダに移動して次のコマンドで作成しました。

wsdl /namespace:Microsoft.Crm.Sdk.Discovery  crmdiscoveryservice.wsdl

2. CRMシステムユーザ(systemuser)の作成と更新

作成するサンプルを掲載します。Createメソッドが、処理のエントリポイントです。CreateUser でユーザを作成し、作成したユーザのID (Guid) を使用して、UpdateUserメソッドを呼びだし、systemuserの更新をしています。

    public class CreateSystemUser
    {
        /// <summary>
        /// SystemUser の作成と更新
         /// systemuserは削除はできない
         /// </summary>
        public static void Create()
        {
            CrmService service = GetCrmServiceByIFD("vs2k30102", "crmorg01");
            Guid id = CreateUser(service);
            UpdateUser(service, id);
        }
        public static Guid CreateUser(CrmService service)
        {
            WhoAmIRequest whoAmIRequest = new WhoAmIRequest();
            WhoAmIResponse whoAmIResponse = (WhoAmIResponse)service.Execute(whoAmIRequest);

            systemuser user = new systemuser();
            user.domainname = @"crm1\crmuser03";
            user.firstname = "crmuser03";
            user.lastname = "fromBatch";
            // 所属組織はCrmServiceへの接続ユーザと同じ値を設定
              user.businessunitid = new Lookup();
            user.businessunitid.type = EntityName.businessunit.ToString();
            user.businessunitid.Value = whoAmIResponse.BusinessUnitId;

            TargetCreateSystemUser targetCreateUser = new TargetCreateSystemUser();
            targetCreateUser.SystemUser = user;

            CreateRequest request = new CreateRequest();
            request.Target = targetCreateUser;

            CreateResponse response = (CreateResponse) service.Execute(request);
            return response.id;

        }
        public static void UpdateUser(CrmService service, Guid id)
        {
            systemuser user = new systemuser();
            // 更新対象のシステムユーザのGUID
            user.systemuserid = new Key();
            user.systemuserid.Value = id;
            // 更新したい場所の値を設定
            user.firstname = "fromBatch";
            user.lastname = "crmuser03";


            TargetUpdateSystemUser targetUpdateUser = new TargetUpdateSystemUser();
            targetUpdateUser.SystemUser = user;

            UpdateRequest request = new UpdateRequest();
            request.Target = targetUpdateUser;

            UpdateResponse updated = (UpdateResponse)service.Execute(request);

        }

        public static CrmService GetCrmServiceByIFD(string discoverServerUrl, string organizationName)
        {
            string userid = @"crm1\crmadmin";
            string password = "password";

            UriBuilder uriBuilder = new UriBuilder(discoverServerUrl);
            uriBuilder.Path = "/MSCRMServices/2007/SPLA/CrmDiscoveryService.asmx";
            CrmDiscoveryService disco = new CrmDiscoveryService();
            disco.Url = uriBuilder.Uri.ToString();

            disco.Credentials = System.Net.CredentialCache.DefaultCredentials;
            disco.UseDefaultCredentials = true;

            RetrieveOrganizationsRequest orgRequest = new RetrieveOrganizationsRequest();
            orgRequest.UserId = userid;
            orgRequest.Password = password;
            RetrieveOrganizationsResponse orgResponse =
                (RetrieveOrganizationsResponse)disco.Execute(orgRequest);

            bool found = false;
            string serviceUrl = string.Empty;
            foreach (OrganizationDetail orgdetail in orgResponse.OrganizationDetails)
            {
                if (orgdetail.OrganizationName == organizationName)
                {
                    found = true;
                    serviceUrl = orgdetail.CrmServiceUrl;
                }
            }
            if (found == false) return null;

            RetrieveCrmTicketRequest ticketRequest = new RetrieveCrmTicketRequest();
            ticketRequest.OrganizationName = organizationName;
            ticketRequest.UserId = userid;
            ticketRequest.Password = password;
            RetrieveCrmTicketResponse ticketResponse =
                (RetrieveCrmTicketResponse)disco.Execute(ticketRequest);

            CrmAuthenticationToken token = new CrmAuthenticationToken();
            token.AuthenticationType = 2; // IFD
            token.OrganizationName = organizationName;
            token.CrmTicket = ticketResponse.CrmTicket;

            CrmService service = new CrmService();
            service.Credentials = System.Net.CredentialCache.DefaultCredentials;
            service.CrmAuthenticationTokenValue = token;
            service.UseDefaultCredentials = true;
            service.Url = serviceUrl;

            return service;

        }

    }

サンプルは以上です。問題点、誤りなどがありましたら、ご連絡ください。

では。