Usando PowerShell para fazer backup de uma tabela do Dataverse

Traduzido do original em espanhol. Ler em espanhol

Para fazer uma cópia de segurança de uma tabela do Dataverse e salvá-la como arquivo CSV no SharePoint usando PowerShell, siga os passos abaixo. Este tutorial supõe que você tem as permissões necessárias e configurou corretamente as credenciais do aplicativo no Azure AD para que ele tenha acesso tanto ao Dataverse quanto ao SharePoint.

iStock AI Generator

Configurar variáveis

Primeiro, defina as variáveis que contêm as credenciais do seu aplicativo e os identificadores necessários para a autenticação.

# Set variables
$TenantId = 'xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx' #Directory (tenant) ID
$AppId = 'xxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx' #Application (client) ID
$ClientSecret = Get-AutomationVariable -Name [Client Secret Variable Placeholder]  #ClientSecretValue - Encrypted
$PowerPlatformOrg = '[OrgID Placeholder]'   #OrgID
$PowerPlatformEnvironmentUrl = "https://$($PowerPlatformOrg).crm.dynamics.com"
$oAuthTokenEndpoint = "https://login.microsoftonline.com/$($TenantId)/oauth2/v2.0/token"

Solicitar o token de acesso

Para interagir com a API do Dataverse, você precisa de um token de acesso. Use o bloco de código a seguir para obtê-lo.

$authBody = @{
    client_id = $AppId;
    client_secret = $ClientSecret;
    scope = "$($PowerPlatformEnvironmentUrl)/.default"
    grant_type = 'client_credentials'
}

$authParams = @{
    URI = $oAuthTokenEndpoint
    Method = 'POST'
    ContentType = 'application/x-www-form-urlencoded'
    Body = $authBody
}

$authResponseObject = Invoke-RestMethod @authParams -ErrorAction Stop

Extrair dados de uma tabela do Dataverse

Com o token de acesso em mãos, você pode fazer uma requisição GET à API do Dataverse para extrair os dados da tabela desejada.

$getDataRequestUri = 'zero_db';

$getApiCallParams = @{
    URI = "$($PowerPlatformEnvironmentUrl)/api/data/v9.1/$($getDataRequestUri)"
    Headers = @{
        "Authorization" = "$($authResponseObject.token_type) $($authResponseObject.access_token)"
        "Accept" = "application/json"
        "OData-MaxVersion" = "4.0"
        "OData-Version" = "4.0"
    }
    Method = 'GET'
}

$getApiResponseObject = Invoke-RestMethod @getApiCallParams -ErrorAction Stop

$getApiResponseObject.value | export-csv testing.csv

Armazenar o arquivo CSV no SharePoint

Por fim, conecte-se ao SharePoint e envie o arquivo CSV recém-gerado. O script também vai procurar e excluir arquivos com mais de 30 dias na biblioteca especificada.

$tenant='zerogap.onmicrosoft.com'
$SiteUrl='https://zerogap.sharepoint.com/sites/zerosite'
$LibraryName="Shared Documents/Dataverse Backup"
$NewFileName=Get-Date -Format "dddd_MM_dd_yyyy_HH_mm"
$NewFileName=$NewFileName.toString() + ".csv"
$null=Connect-PnPOnline -Url $SiteUrl -ManagedIdentity

Add-PnPFile -Path 'testing.csv' -Folder $LibraryName -NewFileName $NewFileName | Out-Null

$Files = Get-PnPFolderItem -FolderSiteRelativeUrl $LibraryName

$today_date=Get-Date

ForEach($File in $Files)
{
    if (($today_date-$File.TimeLastModified).Days -ge 30) {
        $Listid=Get-PnPListItem -List $LibraryName  -UniqueId $File.UniqueId
        Move-PnPListItemToRecycleBin -List $LibraryName -Identity  $Listid.id  -Force
    }
}

Código completo

A seguir, o código completo do processo descrito acima:

# Set variables
$TenantId = 'xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx' #Directory (tenant) ID
$AppId = 'xxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx' #Application (client) ID
$ClientSecret = Get-AutomationVariable -Name [Client Secret Variable Placeholder]  #ClientSecretValue - Encrypted
$PowerPlatformOrg = '[OrgID Placeholder]'   #OrgID
$PowerPlatformEnvironmentUrl = "https://$($PowerPlatformOrg).crm.dynamics.com"
$oAuthTokenEndpoint = "https://login.microsoftonline.com/$($TenantId)/oauth2/v2.0/token"

$authBody = @{
    client_id = $AppId;
    client_secret = $ClientSecret;
    scope = "$($PowerPlatformEnvironmentUrl)/.default"
    grant_type = 'client_credentials'
}

$authParams = @{
    URI = $oAuthTokenEndpoint
    Method = 'POST'
    ContentType = 'application/x-www-form-urlencoded'
    Body = $authBody
}

$authResponseObject = Invoke-RestMethod @authParams -ErrorAction Stop

$getDataRequestUri = 'zero_db';

$getApiCallParams = @{
    URI = "$($PowerPlatformEnvironmentUrl)/api/data/v9.1/$($getDataRequestUri)"
    Headers = @{
        "Authorization" = "$($authResponseObject.token_type) $($authResponseObject.access_token)"
        "Accept" = "application/json"
        "OData-MaxVersion" = "4.0"
        "OData-Version" = "4.0"
    }
    Method = 'GET'
}

$getApiResponseObject = Invoke-RestMethod @getApiCallParams -ErrorAction Stop

$getApiResponseObject.value | export-csv testing.csv

$tenant='zerogap.onmicrosoft.com'
$SiteUrl='https://zerogap.sharepoint.com/sites/zerosite'
$LibraryName="Shared Documents/Dataverse Backup"
$NewFileName=Get-Date -Format "dddd_MM_dd_yyyy_HH_mm"
$NewFileName=$NewFileName.toString() + ".csv"
$null=Connect-PnPOnline -Url $SiteUrl -ManagedIdentity

Add-PnPFile -Path 'testing.csv' -Folder $LibraryName -NewFileName $NewFileName | Out-Null

$Files = Get-PnPFolderItem -FolderSiteRelativeUrl $LibraryName

$today_date=Get-Date

ForEach($File in $Files)
{
    if (($today_date-$File.TimeLastModified).Days -ge 30) {
        $Listid=Get-PnPListItem -List $LibraryName  -UniqueId $File.UniqueId
        Move-PnPListItemToRecycleBin -List $LibraryName -Identity  $Listid.id  -Force
    }
}

Maximiliano Díaz Doglia

AI Platform Engineer & Full-Stack Developer
Building Enterprise Integrations & Automations