特定の名前のロールの検索、特定のユーザにロールを割り当てる、削除する方法および、特定のユーザに割り当てられている全てのロールを検索する方法を掲載します。
- 動作環境: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));
}
}
}
}
今回は以上です。間違い、指摘点等がありましたらご連絡ください。