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