Modèle de script de remédiation Intune

Un modèle PowerShell unique pour la détection et la remédiation Intune : en-tête documenté, journaux de transcription et code structuré, prêt à l’emploi.

Introduction

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

Cet article vous a plu ?

Avec un compte gratuit, vous aimez, vous commentez et vous recevez des suggestions « Pour vous ». Connexion en un clic avec Google ou GitHub, sans mot de passe.

Commentaires

Connectez-vous en un clic pour rejoindre la discussion.

Chargement des commentaires…

Masquer ce commentaire ?

Il ne sera plus visible du public. Son texte est conservé et vous pourrez le rétablir. Ses réponses restent visibles.

Signaler ce commentaire

Pourquoi ?