Utiliser PowerShell pour sauvegarder une table Dataverse

Traduit de l'original en espagnol. Lire en espagnol

Pour sauvegarder une table Dataverse et l’enregistrer comme fichier CSV dans SharePoint avec PowerShell, suivez les étapes ci-dessous. Ce tutoriel suppose que vous disposez des autorisations nécessaires et que vous avez correctement configuré les identifiants de l’application dans Azure AD afin qu’elle ait accès à la fois à Dataverse et à SharePoint.

iStock AI Generator

Configurer les variables

Commencez par définir les variables qui contiennent les identifiants de votre application et les identifiants nécessaires à l’authentification.

# 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"

Demander le token d’accès

Pour interagir avec l’API Dataverse, vous avez besoin d’un token d’accès. Utilisez le bloc de code suivant pour l’obtenir.

$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

Extraire les données d’une table Dataverse

Une fois le token d’accès obtenu, vous pouvez envoyer une requête GET à l’API Dataverse pour extraire les données de la table souhaitée.

$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

Stocker le fichier CSV dans SharePoint

Enfin, connectez-vous à SharePoint et téléversez le fichier CSV qui vient d’être généré. Le script recherchera et supprimera aussi les fichiers de plus de 30 jours dans la bibliothèque indiquée.

$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
    }
}

Code complet

Voici le code complet du processus décrit ci-dessus :

# 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