Group Policy Analytics: Importer ou supprimer des rapport de GPO on-prem dans Intune avec PowerShell

Dans cet article, nous allons voir comment utiliser PowerShell et l’API Graph afin d’importer des report de GPO au format XML, de vos environnements on-prem, directement dans Intune afin de trouver les CSP appropriés.

Dans mon article précédent, j’ai expliqué comment utiliser la nouvelle fonctionnalité de Intune nommée Group Policy Analytics.
Il est donc intéressant de voir maintenant comment automatiser le process à l’aide de PowerShell.

Exporter vos GPO on-prem

La 1ère étape consistera à exporter le contenu de vos GPOs ou d’une seule au format XML.
Nous pourrons par la suite importer ce XML dans Intune.
Pour cela, nous allons utiliser le module GroupPolicy qui est installé par défaut sur vos serveurs AD.
Ci-dessous la commande pour exporter une GPO spécifique, à partir de son nom:

Get-GPOReport -Name "GPO_Computer_Network" -ReportType XML -Path "C:\GPO_Computer_Network.xml"

Ci-dessous la commande pour exporter toutes les GPOs de votre domaine:

Get-GPOReport -All -Domain "systanddeploy.lab.local" -Server "SYSTANDDEPLOY" -ReportType XML -Path "C:\All_GPOs.xml"

Maintenant, que nous savons comment exporter les GPOs, importons leur contenu dans Intune.

PowerShell et le module Graph

Pour pouvoir intéragir avec Intune et importer le contenu de nos GPOs, nous allons utiliser le module Graph Intune.
Vous trouverez ici un article détaillant l’utilisation de ce module.
Nous procéderons comme ci-dessous:

  1. Installer le module
function Get-IntuneModule { 
   If (!(Get-Module -listavailable | where {
      $_.name -like "*Microsoft.Graph.Intune*"
})) 
{ Install-Module Microsoft.Graph.Intune -ErrorAction SilentlyContinue } 
Else { Import-Module Microsoft.Graph.Intune -ErrorAction SilentlyContinue } }

2. Se connecter à votre tenant en utilisant la commande suivante:

Connect-MSGraph

3. Saisissez vos identifiants puis connectez-vous

Il n’existe pas encore, dans le module, de cmdlet permettant de gérer les stratégies de groupes on-prem.
Nous allons donc utiliser la cmdlet permettant d’exécuter des requêtes aléatoires: Invoke-MSGraphRequest

Lister le rapport principal de vos GPOs

Que voulons-nous ?
Nous souhaitons accéder au contenu de la page ci-dessous :
Pour cela, la ressource Graph à utiliser est la suivante : groupPolicyMigrationReport
Vous trouverez davantage d’informations ici.

Pour lister le contenu, nous utiliserons la méthode: GET
Le lien complet de la ressource sera le suivant :
https://graph.microsoft.com/beta/deviceManagement/groupPolicyMigrationReports

Ci-dessous la commande permettant d’obtenir le rapport de notre page via PowerShell:

$Get_GPO_Reports = (Invoke-MSGraphRequest -Url "https://graph.microsoft.com/beta/deviceManagement/groupPolicyMigrationReports" -HttpMethod Get).Value

Si vous souhaitez obtenir les mêmes informations pour une GPO spécifique, il suffira de filtrer par son nom.
Dans l’exemple suivant, nous listons le rapport pour la GPO WinRM.

$get_winrm_GPO = $Get_GPO_Reports | where {$_.ouDistinguishedName -like "*WinRM*"}

Supprimer un rapport de GPO

Que voulons-nous ?
Nous souhaitons supprimer un des rapports importé via XML.
Pour cela, deux ressources peuvent être utilisées:

– groupPolicyMigrationReport
– groupPolicyObjectFiles

La méthode à utiliser sera: DELETE
Le lien complet de la ressource sera le suivant:
https://graph.microsoft.com/beta/deviceManagement/groupPolicyMigrationReports

Il faudra ajouter à ce lien, l’ID du rapport de GPO à supprimer.
Pour obtenir cet ID, utilisez la commande suivante:

Invoke-MSGraphRequest -Url "https://graph.microsoft.com/beta/deviceManagement/groupPolicyObjectFiles/$Get_GPO_ID" -HttpMethod DELETE -ErrorAction Stop

Ci-dessous la commande permettant de supprimer ce rapport:

Invoke-MSGraphRequest -Url "https://graph.microsoft.com/beta/deviceManagement/groupPolicyMigrationReports/$Get_GPO_ID" -HttpMethod DELETE -ErrorAction Stop

Lister le détails GPO vs CSP

Que voulons-nous ?
Nous souhaitons accéder au contenu de la page ci-dessous:

Pour cela, la ressource Graph à utiliser est la suivante: groupPolicyObjectFiles
Ci-dessous la commande permettant de faire cela:

$Get_GPO_Details = (Invoke-MSGraphRequest -Url "https://graph.microsoft.com/beta/deviceManagement/groupPolicyObjectFiles" -HttpMethod Get).Value

Ci-dessous le résultat obtenu:

Listons maintenant, uniquement les détails pour la GPO WinRM.

$Get_winrm_GPO_Details = $Get_GPO_Details | where {$_.ouDistinguishedName -like "*WinRM*"}

Ci-dessous le résultat obtenu:

Le contenu de la GPO, est localisé dans l’attribut Content.
Cependant, comme vous pouvez le constater, cela n’est pas vraiment exploitable.
En effet la propriété Content est en format Base64, il nous suffira donc de convertir cela.
Nous allons d’abord ajouter le contenu de Content dans une variable, tel que ci-dessous:

$get_winrm_GPO_Content = $Get_winrm_GPO_Details.Content

Pour décoder le format Base64, utilisez le code suivant:

$Base64_Decode =[Convert]::FromBase64String($get_winrm_GPO_Content)
[System.Text.Encoding]::UTF8.GetString($Base64_Decode)

Ci-dessous le résultat obtenu:

Uploader un rapport XML dans Intune

Que voulons-nous ?
Nous avons dans un 1er temps, exporter nos GPOs on-prem en format XML.
L’étape suivante est d’intégrer le contenu de ce XML dans Intune.

Encoder le XML en B64

La 1ère étape consiste à encoder le contenu du XML en Base64.
Ci-dessous la commande permettant de faire cela:

$File_Path = "D:\GPO_Intune\GPO_Computer_WinRM.xml"
$get_GPO_XML_Content = (get-content $File_Path)
$Get_GPO_Name = $get_GPO_XML_Content.GPO.name
$GPO_XML_Content = [convert]::ToBase64String((Get-Content $File_Path -Encoding byte))

Uploader le rapport dans Intune

La seconde étape est d’uploader ce contenu dans Intune.
Pour cela, la ressource Graph à utiliser est la suivante: createMigrationReport
Le lien complet de cette ressource est le suivant:
https://graph.microsoft.com/beta/deviceManagement/groupPolicyMigrationReports/createMigrationReport
La méthode à utiliser est: POST
Il faudra dans un 1er temps créer le JSON de notre GPO, en y intégrant un nom ainsi que le contenu en base64, comme ci-dessous :

$MyProfile = @"
{
  "groupPolicyObjectFile": {
    "ouDistinguishedName": "$Get_GPO_Name",
	"content": "$GPO_XML_Content"
  }
}
"@

Puis uploader le JSON dans Intune, à l’aide de la commande suivante :

Invoke-MSGraphRequest -Url "https://graph.microsoft.com/beta/deviceManagement/groupPolicyMigrationReports/createMigrationReport" -HttpMethod POST -Content $MyProfile -ErrorAction Stop

A propos de l'auteur

Damien VAN ROBAEYS

Ingénieur Systèmes travaillant principalement sur ce qui tourne autour du poste de travail (MDT, SCCM, Intune) et l’automatisation avec PowerShell. MVP Microsoft et auteur pour ENI, il publie régulièrement sur son blog et gère différents groupes Facebook, PowerShell et WPF (~4000 membres), Windows Autopilot (~3000 membres).

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *