Разработка
25
Ноя
0

PowerShell и Microsoft.Xrm.Tooling

Microsoft.Xrm.Tooling это отдельная библиотека выпущенная Microsoft содержащая ряд дополнительных классов и методов для взаимодействия с CRM. Помимо прочего эта библиотека включает в себя PowerShell-оснастку Microsoft.Xrm.Tooling.Connector посредством которой можно взаимодействовать с CRM через PowerShell.

Microsoft.Xrm.Tooling.Connector содержит два cmdlet’а, через которые осуществляется подключение к CRM:

  • Get-CrmOrganizations – возвращает организации CRM, к которым у текущего пользователя есть доступ;
  • Get-CrmConnection – устанавливает соединение с организацией CRM.

Регистариця

Прежде чем воспользоваться библиотекой необходимо установить оснастку Microsoft.Xrm.Tooling.Connector на клиентский компьютер. Чтобы сделать это, из папки /Bin скопируйте три файла в папку текущего пользователя (например, C:\Users\administrator):

  • RegisterXRMTooling.ps1
  • Microsoft.Xrm.Tooling.CrmConnector.Powershell.dll
  • Microsoft.Xrm.Tooling.PackageDeployment.Powershell.dll

Выполните скрипт RegisterXRMTooling.ps1 от имени администратора, чтобы зарегистрировать оснастку.

Подключение к организации CRM

Далее необходимо установить подключение к организации CRM. Делается это так:

Add-PSSnapin -Name Microsoft.Xrm.Tooling.Connector;
Add-Type -Path "C:\SDK\Bin\Microsoft.Xrm.Sdk.dll";

$ServerUrl = "http://crm2015/";
$OrganizationName = "superfirma";
$SecurePassword = [Microsoft.Xrm.Tooling.Connector.CrmServiceClient]::MakeSecureString("1qaz@WSX");

#$Credentials = Get-Credential
$Credentials = New-Object -TypeName 'System.Management.Automation.PSCredential' -ArgumentList "Administrator", $SecurePassword;
$CrmConnection = Get-CrmConnection –ServerUrl $ServerUrl -Credential $Credentials -OrganizationName $OrganizationName;
# $CrmOrganizations = Get-CrmOrganizations -Credential $Credentials -DeploymentRegion EMEA –OnlineType Office365

if ($CrmConnection.IsReady)
{
    $message = $("Connected to CRM organization: {0} - {1}" -f $CrmConnection.ConnectedOrgFriendlyName, $CrmConnection.ConnectedOrgVersion)
    Write-Output -InputObject $message
 
    # Your code...
}
else
{
    Write-Error "An error occurred: " $CrmConnection.LastCrmError
    Write-Error $CrmConnection.LastCrmException.Message
    Write-Error $CrmConnection.LastCrmException.Source
    Write-Error $CrmConnection.LastCrmException.StackTrace
} 

Здесь мы делаем следующее:

  • Подключаем оснастку Microsoft.Xrm.Tooling, а также стандартные типы CRM к текущему сеансу PowerShell;
  • Затем формируем логин/пароль;
  • Получив их устанавливаем соединение с CRM и возвращаем объект подключения.

После этого через «переменную» $CrmConnection можно осуществлять различные операции в CRM…

В отличие от стандартных сборок CRM библиотека Microsoft.Xrm.Tooling.Connector предоставляет как базовые функции (тип CRUD) так и некоторые специфичные «высокоуровневые» (например, публикация объекта CRM и т.д.). Получить полный список доступных методов можно так:

$CrmConnection | Get-Member -MemberType Method

Также с полным списком методов можно ознакомится здесь: https://msdn.microsoft.com/ru-ru/library/microsoft.xrm.tooling.connector.crmserviceclient_methods.aspx


GUID текущего пользователя

Документация: https://msdn.microsoft.com/ru-ru/library/microsoft.xrm.tooling.connector.crmserviceclient.getmycrmuserid.aspx

$userId = $CrmConnection.GetMyCrmUserId()
Write-Host "Current user id:" $userId

Создание записи

# Possible CrmFieldType values are displayed using the following command:
# [Enum]::GetNames([Microsoft.Xrm.Tooling.Connector.CrmFieldType])

$namefield  = New-Object -TypeName 'Microsoft.Xrm.Tooling.Connector.CrmDataTypeWrapper' -ArgumentList "Sample Account Name", $([Microsoft.Xrm.Tooling.Connector.CrmFieldType]::String)
$cityField  = New-Object -TypeName 'Microsoft.Xrm.Tooling.Connector.CrmDataTypeWrapper' -ArgumentList "Redmond", $([Microsoft.Xrm.Tooling.Connector.CrmFieldType]::String)
$phoneField = New-Object -TypeName 'Microsoft.Xrm.Tooling.Connector.CrmDataTypeWrapper' -ArgumentList "555-0160", $([Microsoft.Xrm.Tooling.Connector.CrmFieldType]::String)

$inData = New-Object -TypeName 'System.Collections.Generic.Dictionary[string, Microsoft.Xrm.Tooling.Connector.CrmDataTypeWrapper]'
$inData.Add("name", $namefield);
$inData.Add("address1_city", $cityField);
$inData.Add("telephone1", $phoneField);

$accountId = $CrmConnection.CreateNewRecord("account", $inData, $applyToSolution, $enabledDuplicateDetection, "00000000-0000-0000-0000-000000000000" 
)

# Verify if the account is created.
if ($accountId -ne [guid]::empty)
{
	Write-Host "Account created with id:" $accountId
}
else
{
	# Write the last error
	Write-Error "An error occurred:" $CrmConnection.LastCrmError

	# Write the CRM exception details
	Write-Error $CrmConnection.LastCrmException.Message
	Write-Error $CrmConnection.LastCrmException.Source
	Write-Error $CrmConnection.LastCrmException.StackTrace
}

Документация: https://msdn.microsoft.com/ru-ru/library/microsoft.xrm.tooling.connector.crmserviceclient.createnewrecord.aspx

Возвращение записи

Function RetrieveAccount
{
	Param (
		[Parameter(Mandatory=$true)]
		[ValidateNotNullOrEmpty()]
		[guid]$accountId
	)

	# Specifies field list
	$fields = New-Object -TypeName 'System.Collections.Generic.List[string]'
	$fields.Add("name")

	$account = $CrmConnection.GetEntityDataById("account", $accountId, $fields, "00000000-0000-0000-0000-000000000000")
	foreach ($property in $account.GetEnumerator())
	{
		if ($property.Key -eq "name")
		{
			Write-Host "Name of the account is:" $property.Value
		}
	}
}

# Retrieve account
RetrieveAccount "341607E9-B03B-E511-80B7-000C291AFB9D" 

Документация: https://msdn.microsoft.com/ru-ru/library/microsoft.xrm.tooling.connector.crmserviceclient.getentitydatabyid.aspx

Обновление Организации

$namefield = New-Object -TypeName 'Microsoft.Xrm.Tooling.Connector.CrmDataTypeWrapper' -ArgumentList "Sample Account Name - Updated!", $([Microsoft.Xrm.Tooling.Connector.CrmFieldType]::String)

$updateData = New-Object -TypeName 'System.Collections.Generic.Dictionary[string, Microsoft.Xrm.Tooling.Connector.CrmDataTypeWrapper]'
$updateData.Add("name", $namefield);
 
$isUpdated = $CrmConnection.UpdateEntity("account", "accountid", "AA1B1346-2192-E511-80C1-000C291AFB9D", $updateData, $applyToSolution, $enabledDuplicateDetection, "00000000-0000-0000-0000-000000000000")
if ($isUpdated)
{
	Write-Host "Account updated!"
}

Документация: https://msdn.microsoft.com/ru-ru/library/microsoft.xrm.tooling.connector.crmserviceclient.updateentity.aspx

Удаление записи

Function DeleteAccount
{
    Param (
        [Parameter(Mandatory=$true)]
        [ValidateNotNullOrEmpty()]
        [guid]$accountId
    )
 
    $isDeleted = $CrmConnection.DeleteEntity("account", $accountId, "00000000-0000-0000-0000-000000000000");
    if ($isDeleted)
    {
        Write-Host "Account deleted!"
    }
}
 
# Delete an account
DeleteAccount "48bf7cd8-dc92-e511-80c1-000c291afb9d"

Документация: https://msdn.microsoft.com/ru-ru/library/microsoft.xrm.tooling.connector.crmserviceclient.deleteentity.aspx

Подсчет количества записей

# Define FetchXML query
$fetchXML = 
"<fetch mapping='logical' returntotalrecordcount='true'>
	<entity name='account'>
		<attribute name='accountid' />
	</entity>
</fetch>"

$queryResult = $CrmConnection.GetEntityDataByFetchSearchEC($fetchXML, "00000000-0000-0000-0000-000000000000");
if ($queryResult -ne $null)
{
    Write-Host "Accounts records count:" $queryResult.TotalRecordCount
}

Документация: https://msdn.microsoft.com/ru-ru/library/dn742115.aspx

Смена Статуса записи

# statecode = 1 ( Inactive ) 
# statuscode = 2 ( Inactive ) 
$isUpdated = $CrmConnection.UpdateStateAndStatusForEntity("account", $accountId, 1, 2, "00000000-0000-0000-0000-000000000000")
 
# the same command using the second form of the method
#$isUpdated = $CrmConnection.UpdateStateAndStatusForEntity("account", $accountId, "Inactive", "Inactive", $batchId)
  
if ($isUpdated)
{
    Write-Host "Account deactivated!"
}

Документация: https://msdn.microsoft.com/ru-ru/library/microsoft.xrm.tooling.connector.crmserviceclient.updatestateandstatusforentity.aspx

Возвращение множества записей

$accountsQuery = New-Object -TypeName 'Microsoft.Xrm.Sdk.Query.QueryExpression' -ArgumentList "account"
$accountsQuery.ColumnSet.AllColumns = $true
$retrieveRequest = New-Object -TypeName 'Microsoft.Xrm.Sdk.Messages.RetrieveMultipleRequest'
$retrieveRequest.Query = $accountsQuery
 
$response = $CrmConnection.ExecuteCrmOrganizationRequest($retrieveRequest)
    
$entities = $response.EntityCollection.Entities
Write-Host "First account name:" $entities[0].Attributes["name"]

Документация: https://msdn.microsoft.com/ru-ru/library/microsoft.xrm.tooling.connector.crmserviceclient.executecrmorganizationrequest.aspx

Публикация объекта

Function PublishEntity
{
    Param (
        [Parameter(Mandatory=$true)]
        [ValidateNotNullOrEmpty()]
        [string]$entityLogicalName
    )
 
    $CrmConnection.PublishEntity($entityLogicalName)
    Write-Host "entity published:" $entityLogicalName
}
 
# Publish entity
PublishEntity "account"

Документация: https://msdn.microsoft.com/ru-ru/library/microsoft.xrm.tooling.connector.crmserviceclient.publishentity.aspx

Возвращение возможных значений пиклиста

Function GetPickListElements
{
    Param (
        [Parameter(Mandatory=$true)]
        [ValidateNotNullOrEmpty()]
        [string]$entityLogicalName,
        [Parameter(Mandatory=$true)]
        [ValidateNotNullOrEmpty()]
        [string]$attributeLogicalName
    )
 
    $picklist = $CrmConnection.GetPickListElementFromMetadataEntity($entityLogicalName, $attributeLogicalName)
    foreach($item in  $picklist.Items)
    {
        Write-Host "Item:" $item.DisplayLabel $item.PickListItemId
    }
}
 
# Get state values for account
GetPickListElements "account" "statecode"

Документация: https://msdn.microsoft.com/ru-ru/library/microsoft.xrm.tooling.connector.crmserviceclient.getpicklistelementfrommetadataentity.aspx

Комментарии (0)

*

code