IFD構成のDynamics CRM 4.0 サーバに接続してすべてのCRMのユーザを列挙してみます。

開発環境

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

1. すべてのCRMユーザ(systemuserエンティティ)を列挙する

本サンプルはコンソールアプリケーションとして開発します。動作には、DynamicsCRMSDK に付属する、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

1.2 システムユーザを列挙するプログラム

IFD構成で全てのCRMユーザを検索しるサンプルを掲載します。1.1で作成したプロキシファイルをプロジェクトに追加するのを忘れないでください。

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

namespace CrmManageUser
{
    /// <summary>
    /// プログラムの実行には、microsoft.crm.sdk.dll と microsoft.crm.sdktypeproxy
    /// と、System.Web.Servicesへの参照が必要
    /// </summary>
    class Program
    {
        static void Main(string[] args)
        {
            CrmService service = GetCrmServiceByIFD("crmserver", "org01");
            RetrieveSystemUsers(service);
            Console.ReadLine();
        }
        // discoverServerUrl : CrmDiscoveryService
// organizationName : 組織名 public static CrmService GetCrmServiceByIFD(string discoverServerUrl, string organizationName) { string userid = @"domain\crmuser01"; 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; } /// <summary> /// 全てのシステムユーザを取得する /// </summary> /// <param name="service"></param> public static void RetrieveSystemUsers(CrmService service) { QueryExpression query = new QueryExpression(); query.EntityName = EntityName.systemuser.ToString(); query.ColumnSet = new AllColumns(); // SYSTEM, INTEGRATIONを除外する場合 //ConditionExpression condition1 = new ConditionExpression(); //condition1.AttributeName = "fullname"; //condition1.Operator = ConditionOperator.NotEqual; //condition1.Values = new object[]{ "SYSTEM"}; //ConditionExpression condition2 = new ConditionExpression(); //condition2.AttributeName = "fullname"; //condition2.Operator = ConditionOperator.NotEqual; //condition2.Values = new object[] { "INTEGRATION" }; //query.Criteria = new FilterExpression(); //query.Criteria.Conditions.Add(condition1); //query.Criteria.Conditions.Add(condition2); // ここまで BusinessEntityCollection crmusers = service.RetrieveMultiple(query); foreach (BusinessEntity entity in crmusers.BusinessEntities) { systemuser crmuser = (systemuser)entity; Console.WriteLine(crmuser.fullname); } } } }

本サンプルでは、 IFD 構成で CrmService を作成しています。配置型の場合は、CrmService の作成方法が異なりますので、SDKのサンプルなどをみて適宜変更します。DiscoveryService に使用するユーザ、パスワードは接続できるユーザ(Dynamics CRMのユーザ)情報を指定してください。 

説明は以上です。誤り、指摘点等がありましたら、ご連絡ください。