Dynamics CRM 2011 CRM ユーザー作成、管理のサンプル

みなさん、こんにちは。

今日は管理者の方と開発者の方ともに関連するトピックとして
CRM ユーザーの管理に関するサンプルを紹介します。

サンプルの概要

Microsoft Dynamics CRM 2011 SDK のサンプルでは、追加の
ユーザーが必要な場合があり、それらのユーザーを自動で
作成するサンプルが提供されています。このサンプルでは、

- Active Directory ユーザーの追加
- 対応する CRM ユーザーの追加
- 追加 CRM ユーザーのロール管理

を行います。今回このサンプルを実際に動かしてみて、動作
を確認していきます。

※このサンプルは Active Directory ユーザーおよび CRM ユーザーを作成するため、テスト環境で試してください。

SystemUserProvider クラス サンプル

サンプルは、以下のディレクトリにあります。
SDK\SampleCode\CS\HelperCode\SystemUserProvider.cs ``SDK\SampleCode\VB\HelperCode\SystemUserProvider.vb

このサンプルを利用したプログラムを開発します。

1. Visual Studio 2010 を起動します。

2. コンソール アプリケーションプロジェクトを作成します。今回は
UserManagement としました。

3. 作成されたプロジェクトを右クリックして、プロパティをクリックします。
対象のフレームワークより .NET Framework 4.0 を指定します。

4. 以下の参照を追加します。

Microsoft.Xrm.Sdk.dll
Microsoft.Crm.Sdk.Proxy.dll

System.Runtime.Serialization
System.Security
System.ServiceModel
System.DirectoryServices
System.DirectoryServices.AccountManagement

5. プロジェクトを右クリック | 追加 | 既存の項目より、以下の
ヘルパーファイルを追加します。

sdk\samplecode\cs\helpercode
crmservicehelpers.cs
deviceidmanager.cs
myorganizationcrmsdktypes.cs
systemuserprovider.cs

6. Program.cs ファイルを開き、コードを以下のものに差し替えます。
ユーザー作成サンプルを呼び出す箇所以外は、いつものサンプル
と同じ内容で、組織サービスを作成しているだけです。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Xrm.Sdk.Client;
using Microsoft.Crm.Sdk.Samples;

namespace UserManagement
{
    class Program
    {
        OrganizationServiceProxy _serviceProxy;

        static public void Main(string[] args)
        {
            ServerConnection serverConnect = new ServerConnection();
            ServerConnection.Configuration config = serverConnect.GetServerConfiguration();

            Program app = new Program();
            app.Run(config);
        }

        public void Run(ServerConnection.Configuration serverConfig)
        {
            using (_serviceProxy = ServerConnection.GetOrganizationProxy(serverConfig))
            {
                _serviceProxy.EnableProxyTypes();

                // ユーザー作成サンプルの呼び出し
                String ldapPath = String.Empty;
                // 営業課長の作成
                SystemUserProvider.RetrieveSalesManager(_serviceProxy, ref ldapPath);
                // 営業担当者の作成
                SystemUserProvider.RetrieveSalespersons(_serviceProxy, ref ldapPath);
                // 代理人の作成
                SystemUserProvider.RetrieveDelegates(_serviceProxy, ref ldapPath);
                // 営業担当副社長の作成
                SystemUserProvider.RetrieveVPSales(_serviceProxy, ref ldapPath);
                // マーケティング課長の作成
                SystemUserProvider.RetrieveMarketingManager(_serviceProxy, ref ldapPath);
            }
        }
    }
}

7. サンプルは英語環境で動作するよう開発されているため、
一部変更して日本語環境で動作するようにします。
systemuserprovider.cs を開きます。

8. 49 行目 および 53 行目にある Sales Manager という文字列を
営業課長に置き換えます。これは付与したいセキュリティロール名です。

9. 同様に以下のものを置き換えます。
60、61 行目の Salesperson を営業担当者に変更
71、72 行目の Delegate を代理人に変更
78 行目の Vice President of Sales を営業担当副社長に変更
89 行目の Marketing Manager をマーケティング課長に変更

10. F5 キーを押下して、プログラムを実行します。

11. 実行時に Microsoft Dynamics CRM に接続する認証情報と途中で
Active Direcotry の LDAP パスを適切に値を入力します。

動作の解説

SystemUserProvider クラスが提供するいくつかのメソッドを利用して、
サンプルは動作しています。

RetrieveSystemUser メソッド

サンプルを実行しているユーザーの情報からドメイン情報を取得し、
その後与えられたユーザー名が CRM ユーザーとして存在するか
確認しています。存在する場合は、指定されたセキュリティロールが
あるかを UserInRole メソッドで確認、存在しない場合は
CreateSystemUser メソッドでユーザーを作成します。

CreateSystemUser メソッド

CRM ユーザーを作成する前に、Active Directory を検索し指定した
ユーザーオブジェクトが存在するか確認します。存在しない場合は
Active Directory にユーザーを作成します。

その後、既定の組織、指定されたセキュリティロールを取得し
それらの情報を利用して CRM ユーザーを作成します。

ConsolePromptForLDAPPath メソッド

LDAP パスをユーザー入力から取得します。

UserInRole メソッド

ユーザーに指定されたセキュリティロールがアサインされているか
確認します。

RetrieveRoleByName メソッド

指定されたセキュリティロール名から、 RoleId を取得します。

追加の機能 - 部署の変更

このサンプルを利用すれば、サンプルユーザーの作成が容易に
行えますが、よくあるタスクに部署の変更があります。ここでは
部署の変更に利用できるコードも合わせて紹介します。実装は
サンプルになぞらえてみました。

メソッドの public/private は用途に応じて変更してください。
引数には、変更したい部署名とユーザー ID を渡しています。

public static void ChangeBUByName(OrganizationServiceProxy serviceProxy,
    String buStr, Guid userId)
{
    // 名前で部署を取得
    QueryExpression buQuery = new QueryExpression
    {
        EntityName = BusinessUnit.EntityLogicalName,
        ColumnSet = new ColumnSet("businessunitid"),
        Criteria =
        {
            Conditions =
        {
            new ConditionExpression("name", ConditionOperator.Equal, buStr)
        }
        }
    };

    // 部署の取得
    BusinessUnit bu = serviceProxy.RetrieveMultiple(buQuery).Entities[0].ToEntity<BusinessUnit>();

    // 割当先のユーザーを指定
    EntityReference target = new EntityReference(SystemUser.EntityLogicalName, userId);
    // 部署変更リクエストの作成
    SetBusinessSystemUserRequest request = new SetBusinessSystemUserRequest()
    {
        UserId = userId,
        BusinessId = bu.Id,
        ReassignPrincipal = target
    };
    // 部署の変更
    SetBusinessSystemUserResponse response = (SetBusinessSystemUserResponse)serviceProxy.Execute(request);
    // ToDo ロールの再割り当てが必要です
}

まとめ

Active Directory と連携した CRM ユーザー操作は一般的なタスクだと
思いますが、サンプル等を参考にして頂きつつ、自動化を試してください。

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