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