J’utilise régulièrement le même modèle pour mes scripts de remédiation.

Ce modèle est divisé en 3 parties avec les avantages suivants :

  • Un en-tête d’informations sur le script et les paramètres à appliquer sur Intune
  • Journaux de transcription enregistrés au même emplacement que les journaux Intune (si le script est exécuté avec les droits d’administrateur)
  • Un code de détection/remédiation structuré pour avoir un fichier unique

Première partie : en-tête avec les informations importantes

  • Date de création
  • Auteur
  • Société
  • Nom de fichier
  • Description
  • Paramètres à appliquer sur Intune
<#
    .NOTES
    ===========================================================================
    Created on:		2024/03/25 - 22:44
    Created by:		Dude From IT
    Organization:	The Dude Company
    Filename:		Untitled-1
    ===========================================================================
    .DESCRIPTION
    Enter a description

    .SETTINGS
    Detection script								Yes
    Remediation script								Yes
    Run this script using the logged-on credentials	No
    Enforce script signature check					No
    Run script in 64-bit PowerShell					No
#>

Deuxième partie : journaux de transcription

Définition de l’emplacement des logs de transcription en fonction des droits d’exécution du script. Si les autorisations sont suffisantes, les journaux seront enregistrés dans l’emplacement des journaux Intune.

$scriptName = 'Untitled-10'

$currentPrincipal = New-Object Security.Principal.WindowsPrincipal([Security.Principal.WindowsIdentity]::GetCurrent())
$isAdmin = $currentPrincipal.IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)

if ($isAdmin) {
    $logPath = "$env:ProgramData\Microsoft\IntuneManagementExtension\Logs"
} else {
    $logPath = "$env:LOCALAPPDATA\_IME\Logs"
}

if (!(Test-Path -Path $logPath -ErrorAction SilentlyContinue)) {
    New-Item -Path $logPath -ItemType Directory -Force -ErrorAction SilentlyContinue | Out-Null
}

$mode = $MyInvocation.MyCommand.Name.Split('.')[0] # detect or remediate
Start-Transcript -Path "$logPath\$($scriptName)_$($mode).log" -ErrorAction SilentlyContinue

Troisième partie : code de remédiation

La structure du code permet à un seul fichier de gérer à la fois la détection et la correction.

Le script s’exécute une première fois (détection).

  • Soit la détection est conforme et la remédiation ne sera pas effectuée.
  • Soit la détection n’est pas conforme et la correction est directement exécutée (toujours pendant la phase de détection). La remédiation est ensuite effectuée par Intune mais n’ayant plus rien à corriger peut directement sortir conforme.
#region
try {
    if ($test -eq 'Compliant') {
        Write-Output 'Compliant'
    } else {
        $exitCode = 1 # Remediation
        Write-Output 'Not compliant'

        # Remediation
        # code, code, code
    }
} catch {
    Write-Error $_.Exception.Message
}
#endregion

Ci-dessous le script complet

<#
    .NOTES
    ===========================================================================
    Created on:		2024/03/25 - 22:44
    Created by:		Dude From IT
    Organization:	The Dude Company
    Filename:		Untitled-1
    ===========================================================================
    .DESCRIPTION
    Enter a description

    .SETTINGS
    Detection script								Yes
    Remediation script								Yes
    Run this script using the logged-on credentials	No
    Enforce script signature check					No
    Run script in 64-bit PowerShell					No
#>

$exitCode = 0 # no remediation

$scriptName = 'Untitled-1'

$currentPrincipal = New-Object Security.Principal.WindowsPrincipal([Security.Principal.WindowsIdentity]::GetCurrent())
$isAdmin = $currentPrincipal.IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)

if ($isAdmin) {
    $logPath = "$env:ProgramData\Microsoft\IntuneManagementExtension\Logs"
} else {
    $logPath = "$env:LOCALAPPDATA\_IME\Logs"
}

if (!(Test-Path -Path $logPath -ErrorAction SilentlyContinue)) {
    New-Item -Path $logPath -ItemType Directory -Force -ErrorAction SilentlyContinue | Out-Null
}

$mode = $MyInvocation.MyCommand.Name.Split('.')[0] # detect or remediate
Start-Transcript -Path "$logPath\$($scriptName)_$($mode).log" -ErrorAction SilentlyContinue

#region
try {
    if ($test -eq 'Compliant') {
        Write-Output 'Compliant'
    } else {
        $exitCode = 1 # Remediation
        Write-Output 'Not compliant'

        # Remediation
        # code, code, code
    }
} catch {
    Write-Error $_.Exception.Message
}
#endregion


Stop-Transcript | Out-Null

Exit $exitCode