特定の名前のロールの検索、特定のユーザにロールを割り当てる、削除する方法および、特定のユーザに割り当てられている全てのロールを検索する方法を掲載します。

  • 動作環境:Windows 2003 Server, Dynamics CRM 4.0 (IFD構成)
  • 開発環境:Visual Studio 2008 Professional
  • .NET 3.5 (.NET 2.0でOKのはず)

1. 環境の準備

本サンプルはコンソールアプリケーションとして開発します。動作には、Dynamics CRM 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. 特定の名前のロール(role)を全て検索する。

営業担当者という名前のロールを検索するサンプルを掲載します。サンプルのままだと、複数の部署に同じロールがある場合、その数だけ検索されます。プログラム中のコメントを解除することで、部署名まで考慮してロールを検索できます。

public static void AssignUserRoles()
{
    CrmService service = GetCrmServiceByIFD("vs2k30102", "crmorg01");
    PrintSalesPerson(service);
}
/// <summary>
/// すべての組織の役割"営業担当者"を表示する。
/// </summary>
/// <param name="service"></param>
public static void PrintSalesPerson(CrmService service)
{
    QueryExpression query = new QueryExpression();
    query.EntityName = EntityName.role.ToString();
    query.ColumnSet = new AllColumns();

    ConditionExpression condition = new ConditionExpression();
    condition.AttributeName = "name";
    condition.Operator = ConditionOperator.Equal;
    condition.Values = new object[]{"営業担当者"};

    query.Criteria.AddCondition(condition);

    // 部署が第一営業部の営業担当者ロールのみ取得する場合
    //ConditionExpression condition2 = new ConditionExpression();
    //condition2.AttributeName = "businessunitidname";
    //condition2.Operator = ConditionOperator.Equal;
    //condition2.Values = new object[] { "第一営業部" };
    //query.Criteria.AddCondition(condition2);
    // ここまで

    BusinessEntityCollection roles = service.RetrieveMultiple(query);
    foreach (BusinessEntity entity in roles.BusinessEntities)
   {
        role rl = (role)entity;
        Console.WriteLine(rl.businessunitid.name);
        Console.WriteLine(rl.name);
    }
}

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; }

CrmService の作成方法はIFD構成用となっていますが、SDKをみれば設置型用のCrmService の作成方法がわかると思います。

3. ユーザへのロールの割り当て、ロールの削除、割り当てられているロールの検索

営業担当者ロールを検索 (GetSalesPerson) しユーザへのロールの割り当て(AssignRolesToUser), 割り当てられているロールの検索(RetrieveLinkID) を行い、ユーザからロールを削除(RemoveRolesFromUser) するサンプルを掲載します。CrmService を作成するメソッドは、 前述のサンプルと同じものです。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Crm.Sdk.Discovery;
using Microsoft.Crm.Sdk;
using Microsoft.Crm.SdkTypeProxy;
using Microsoft.Crm.Sdk.Query;

namespace CrmManageUser
{
    class AssignRole
    {
        public static void AssignUserRoles()
        {
            CrmService service = GetCrmServiceByIFD("vs2k30102", "crmorg01");
            role salesPersonRole = GetSalesPerson(service);
            AssignRolesToUser(service, salesPersonRole);
            RetrieveLinkID(service);
            RemoveRolesFromUser(service, salesPersonRole);
        }
        public static role GetSalesPerson(CrmService service)
        {
            QueryExpression query = new QueryExpression();
            query.EntityName = EntityName.role.ToString();
            query.ColumnSet = new AllColumns();

            ConditionExpression condition = new ConditionExpression();
            condition.AttributeName = "name";
            condition.Operator = ConditionOperator.Equal;
            condition.Values = new object[] { "営業担当者" };


            query.Criteria.AddCondition(condition);

            // 組織が第一営業部の営業担当者ロールのみ取得する場合
            ConditionExpression condition2 = new ConditionExpression();
            condition2.AttributeName = "businessunitidname";
            condition2.Operator = ConditionOperator.Equal;
            condition2.Values = new object[] { "crmorg01" };
            query.Criteria.AddCondition(condition2);

            BusinessEntityCollection roles = service.RetrieveMultiple(query);
            foreach (BusinessEntity entity in roles.BusinessEntities)
            {
                role rl = (role)entity;
                return rl;
            }
            return null;
        }
        /// <summary>
        /// 役割を削除する
        /// </summary>
        public static void RemoveRolesFromUser(CrmService service, role salesPersonRole)
        {
            // ロールを削除するシステムユーザのGuid
            // このユーザはsalesPersonRoleが所属する部署のユーザ
            Guid sytemUserId = new Guid("f099992c-a0ea-dd11-a30f-0003ffba2d57");

            Guid roleId = salesPersonRole.roleid.Value;
            RemoveUserRolesRoleRequest request = new RemoveUserRolesRoleRequest();
            request.UserId = sytemUserId;
            request.RoleIds = new Guid[] { roleId };

            RemoveUserRolesRoleResponse response = (RemoveUserRolesRoleResponse)service.Execute(request);
        }
        /// <summary>
        /// ロールをアサインする
        /// </summary>
        public static void AssignRolesToUser(CrmService service, role salesPersonRole)
        {
            // ロールをアサインするシステムユーザのGuid
            // このユーザはsalesPersonRoleが所属する部署のユーザ
            Guid sytemUserId = new Guid("f099992c-a0ea-dd11-a30f-0003ffba2d57");

            Guid roleId = salesPersonRole.roleid.Value;

            AssignUserRolesRoleRequest request = new AssignUserRolesRoleRequest();
            request.UserId = sytemUserId;
            request.RoleIds = new Guid[] { roleId };

            AssignUserRolesRoleResponse response = (AssignUserRolesRoleResponse)service.Execute(request);
        }
// 特定のユーザに割り当てられたロールを検索する public static void RetrieveLinkID(CrmService service) { QueryExpression query = new QueryExpression(); query.EntityName = EntityName.role.ToString(); query.ColumnSet = new AllColumns(); LinkEntity linkRole = new LinkEntity(); linkRole.LinkFromEntityName = EntityName.role.ToString(); linkRole.LinkFromAttributeName = "roleid"; linkRole.LinkToEntityName = "systemuserroles"; linkRole.LinkToAttributeName = "roleid";
// 対象のユーザID Guid sytemUserId = new Guid("f099992c-a0ea-dd11-a30f-0003ffba2d57"); ConditionExpression condition = new ConditionExpression(); condition.AttributeName = "systemuserid"; condition.Operator = ConditionOperator.Equal; condition.Values = new object[] { sytemUserId }; linkRole.LinkCriteria = new FilterExpression(); linkRole.LinkCriteria.AddCondition(condition); query.LinkEntities.Add(linkRole); BusinessEntityCollection roles = service.RetrieveMultiple(query); foreach (BusinessEntity entity in roles.BusinessEntities) { role rl = (role)entity; string format = "部署:{0}, 役割:{1}"; Console.WriteLine(string.Format(format, rl.businessunitid.name, rl.name)); } } } }

今回は以上です。間違い、指摘点等がありましたらご連絡ください。