PowerShell から、 Dynamics CRM のWebサービスを使用する覚書のサンプルスクリプトを掲載します。

OnPremise 型認証(AD認証) の Crm サーバ上で実行することを前提としています。そのため、それ以外のサーバで実行する場合は、sdk に付属する dll (microsoft.crm.sdk.dll, microsoft.crm.sdktypeproxy.dll ) をロードするようにスクリプトを修正する必要がありますので注意してください。

サンプルの実行環境は次のとおり

  • 対象CRM:Dynamics CRM 4.0 Rollup 5
  • CRMサーバと同じサーバ上で実行
  • OnPremise (AD認証)
  • PowerShell 1.0 を使用

1. CrmService を作成するGet-CrmService.ps1

Dynamics CRM に Webサービス経由でアクセスするために、CrmService を作成する必要があります。下記のようにGet-CrmService.ps1 というスクリプトを作成しました。

#########################
# Get-CrmService.ps1
# CrmService を作成する
# AD 認証のみ
# Crmサーバ上で実行
#########################
param( [string] $orgName=$(throw "組織名を指定してください") 
     , [string] $serverUrl="http://localhost")

## Crm に必要なアセンブリの準備を行う
[void] [System.Reflection.Assembly]::LoadWithPartialName("microsoft.crm.sdk")
[void] [System.Reflection.Assembly]::LoadWithPartialName("microsoft.crm.sdktypeproxy")

## CrmService を作成する
## OnPremise(AD認証)にのみ対応
function Get-CrmService
{
   param( [string] $orgName=$(throw "組織名を指定してください") 
	, [string] $serverUrl="http://localhost"
   )

   # 認証用のトークン作成
   Write-Debug "認証用のトークン作成"
   $token = New-Object Microsoft.Crm.Sdk.CrmAuthenticationToken
   $token.psbase.OrganizationName = $orgName
   # AD 認証
   $token.AuthenticationType = 0

   # CrmService 作成
   Write-Debug "CrmService 作成"
   $service = New-Object Microsoft.Crm.SdkTypeProxy.CrmService
   $service.Url = "{0}/mscrmservices/2007/crmservice.asmx" -F $serverUrl
   $service.CrmAuthenticationTokenValue = $token
   $service.UseDefaultCredentials = $true

   $service
}

function Main{
  Get-CrmService $orgName $serverUrl
}

Main

使い方はシンプルです。下の例では、 組織名にorg1, CRM サーバーのURL に http://localhost を指定してCrmService を初期化しています。

C:>$service = .\GetCrmService.ps1 "org1" "http://localhost"

2. ユーティリティメソッドを定義する

CrmService を作成したら、C#で作成するようにサービスを呼び出すだけです。サンプルとして、WhoAmI と SetState メッセージを使用するスクリプトを記載します。

2.1 Invoke-WhoAmI.ps1

CrmService のユーザ情報を取得する WhoAmI メッセージを使用する Invoke-WhoAmI.ps1 を次のように定義しました。

## Invoke-WhoAmI.ps1
## WhoAmIRequest を発行します
param([Microsoft.Crm.SdkTypeProxy.CrmService] $service=$(throw "CrmServiceは必須です"))

$request = New-Object Microsoft.Crm.SdkTypeProxy.WhoAmIRequest

$response = $service.Execute($request)

$response

次のように使用します。

C:>$service = .\GetCrmService.ps1 "org1" "http://localhost"
C:>$response = .\Invoke-WhoAmI.ps1 $service
C:>$response | Format-List

UserId         : ...
BusinessUnitId : ...
OrganizationId : ...

2.2 Invoke-SetStateContact.ps1

取引先担当者の状態を有効/無効にするサンプルスクリプトInvoke-SetStateContact.ps1を次のように作成しました。

#########################################################################
#
# 機能:contact (取引先担当者) の状態を変更します
# $entityId 取引先担当者Entity レコードのGUID
# $state = 状態(Active or InActive) (既定でActive)
# $status  ステータス(既定で-1:状態に従って適切なステータスをセット)
#
#########################################################################

param([Microsoft.Crm.SdkTypeProxy.CrmService] $service=$(throw "CrmServiceは必須です")
     ,[guid] $entityId=$(throw "idを指定してください")
     ,[string] $state="Active"
     ,[int] $status= -1
)

$request = New-Object Microsoft.Crm.SdkTypeProxy.SetStateContactRequest
$request.EntityId = $entityId
$request.ContactState = $state
$request.ContactStatus = $status

$response = $service.Execute($request)

$response

下に使用例を記載します。対象とする取引対象者エンティティのGUIDを無効化します。有効にする場合は、 "Active" を引数に指定します。

C:>.\Invoke-SetStateContact.ps1 $service "e6d3f580-8ae2-4e27-9349-3a9a09640d8c" "InActive"

3.まとめ

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

Get-CrmService.ps1 を使用して、CrmService を作成することで、PowerShell からCRM の Entity に対して操作を行えるようになります。