AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск Все разделы прочитаны

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 22.11.2018, 11:53   #1  
pedrozzz is offline
pedrozzz
Молодой, подающий надежды
Аватар для pedrozzz
MCBMSS
Лучший по профессии 2015
 
160 / 210 (8) ++++++
Регистрация: 18.02.2010
Адрес: Омск
D365FO: PowerShell + DIXF
Всем доброго времени суток.

Пытаюсь загрузить в D365FO данные из package, хранящегося в Azure blob storage, через PowerShell, но получаю постоянно

X++:
Invoke-RestMethod : The remote server returned an error: (401) Unauthorized.

Нашел пример скрипта авторизации через OAuth2, но попытки переделать его применительно к D365FO пока безуспешны.
Текст найденного примера, для тех кому лень переходить по ссылкам
X++:
Function Grant-OAuth2PermissionsToApp{
    Param(
        [Parameter(Mandatory=$true)]$Username, #global administrator username
        [Parameter(Mandatory=$true)]$Password, #global administrator password
        [Parameter(Mandatory=$true)]$azureAppId #application ID of the azure application you wish to admin-consent to
    )

    $secpasswd = ConvertTo-SecureString $Password -AsPlainText -Force
    $mycreds = New-Object System.Management.Automation.PSCredential ($Username, $secpasswd)
    $res = login-azurermaccount -Credential $mycreds
    $context = Get-AzureRmContext
    $tenantId = $context.Tenant.Id
    $refreshToken = $context.TokenCache.ReadItems().RefreshToken
    $body = "grant_type=refresh_token&refresh_token=$($refreshToken)&resource=74658136-14ec-4630-ad9b-26e160ff0fc6"
    $apiToken = Invoke-RestMethod "https://login.windows.net/$tenantId/oauth2/token" -Method POST -Body $body -ContentType 'application/x-www-form-urlencoded'
    $header = @{
    'Authorization' = 'Bearer ' + $apiToken.access_token
    'X-Requested-With'= 'XMLHttpRequest'
    'x-ms-client-request-id'= [guid]::NewGuid()
    'x-ms-correlation-id' = [guid]::NewGuid()}
    $url = "https://main.iam.ad.ext.azure.com/api/RegisteredApplications/$azureAppId/Consent?onBehalfOfAll=true"
    Invoke-RestMethod Uri $url Headers $header Method POST -ErrorAction Stop
}

Может кто-нибудь сталкивался уже с аналогичной задачей и может поделиться некоторыми наработками?
__________________
Кононов Пётр

Последний раз редактировалось pedrozzz; 22.11.2018 в 11:56.
Старый 22.11.2018, 14:27   #2  
pedrozzz is offline
pedrozzz
Молодой, подающий надежды
Аватар для pedrozzz
MCBMSS
Лучший по профессии 2015
 
160 / 210 (8) ++++++
Регистрация: 18.02.2010
Адрес: Омск
Сам вопрос задал, сам решил. Если вдруг кому пригодится.
Сначала некоторые подготовительные работы

Цитата:
Step 1. Authentication. For authentication, it is required to create an azure based application. Once this application creation is done, then you will get your ‘Client ID’ (or it is known as Application ID as well in azure portal for the application) and then you can generate (& Save) Client secret key as well. Both ‘ClientID’ and ‘Client Secret Key’ is required

Step 2. Registering and authorizing this application ID (or client ID) in Dynamics environment. Ensure that this ‘Client ID’ exist in Dynamics environment: Modules > System administration > Setup > Azure active directory applications. If record does not exist on the form, create a new one with details about Client ID, name:, and user Id. Ensure User ID = Admin.
И сам скрипт

X++:
$axBaseURL = "https://YOUR_NAME.cloudax.dynamics.com"

function D365-LoadPackage {
    [cmdletbinding()]
    param(
        [Parameter(Mandatory=$true)]$tenantId,
        [Parameter(Mandatory=$true)]$client_id,
        [Parameter(Mandatory=$true)]$client_Secret_key
    )

    $body = "resource=" + $axBaseURL + "&client_id=" + $client_id +"&client_secret=" + $client_Secret_key + "&grant_type=client_credentials"
    $url = "https://login.windows.net/" + $tenantId + "/oauth2/token"
    $apiToken = Invoke-RestMethod Uri $url -Method POST -Body $body -ContentType 'application/x-www-form-urlencoded'
    
    $url = "$axBaseURL/data/DataManagementDefinitionGroups/Microsoft.Dynamics.DataEntities.ImportFromPackage"

    $header = @{
    'Authorization' = 'Bearer ' + $apiToken.access_token
    }
        
    $body = @"
    {
        "packageUrl":"https://YOUR_ADDRESS.blob.core.windows.net/BLOB_NAME/FileName.zip",
        "definitionGroupId":"pk test",
        "executionId":"",
        "execute":"true",
        "overwrite":"true",
        "legalEntityId":"DAT"
    }
"@
    
    Invoke-RestMethod –Uri $url –Method POST –Headers $header -Body $body -ContentType "application/json" -ErrorAction Stop
    
}
__________________
Кононов Пётр
За это сообщение автора поблагодарили: sukhanchik (2), Vadik (1), Alex_KD (3).
Старый 27.11.2018, 11:16   #3  
Alex_KD is offline
Alex_KD
Участник
AxAssist
MCBMSS
Соотечественники
 
522 / 358 (13) ++++++
Регистрация: 06.07.2006
Адрес: Melbourne, Down Under
Спасибо.
А как AX блоб читает? Отдельно надо SAS token и тп настраивать?
__________________
AxAssist 2012 - Productivity Tool for Dynamics AX 2012/2009/4.0/3.0
Старый 27.11.2018, 16:18   #4  
pedrozzz is offline
pedrozzz
Молодой, подающий надежды
Аватар для pedrozzz
MCBMSS
Лучший по профессии 2015
 
160 / 210 (8) ++++++
Регистрация: 18.02.2010
Адрес: Омск
Цитата:
Сообщение от Alex_KD Посмотреть сообщение
А как AX блоб читает? Отдельно надо SAS token и тп настраивать?
На текущий момент с безопасностью BLOB пока не заморачивались, файл доступен на скачивание всем желающим по ссылке. Данный скрипт пока лишь "proof of work" для дальнейшей автоматизации некоторых процессов.
__________________
Кононов Пётр
Старый 24.12.2018, 12:52   #5  
vmoskalenko is offline
vmoskalenko
Участник
Аватар для vmoskalenko
 
69 / 134 (5) +++++
Регистрация: 25.01.2007
Адрес: Kyiv
Цитата:
Сообщение от pedrozzz Посмотреть сообщение
Сам вопрос задал, сам решил. Если вдруг кому пригодится.
JFI Мой блог с примером PowerShell скрипта который читает данные через OData + Авторизация https://vmoskalenkoblog.wordpress.co...-dynamics-365/
За это сообщение автора поблагодарили: Vadik (1).
Теги
data management, dyn365fo, odata, powershell, интеграция

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
goshoom: Find D365FO labels in Powershell Blog bot DAX Blogs 0 28.10.2018 17:11
D365FO - Как обновить изображение баннера в юридическом лице используя SQL и PowerShell MarinaAX DAX: Администрирование 8 22.10.2018 22:06
yetanotherdynamicsaxblog: List hotfixes using PowerShell in D365FO (AX7) Blog bot DAX Blogs 0 13.01.2018 20:21
jaestevan: PowerShell para la administración automática de Dynamics AX 2012 (PS-II) Blog bot DAX Blogs 0 28.06.2016 17:11
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 23:02.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.