Bonjour, je dois mettre en place un script powershell qui s'assure du bon fonctionnement de l'agent OCS. Ce script sera exécuté à partir d'Intune et indiquera la non-conformité de l'agent en fonction de deux axes de vérification.
Je conviens que ce script n'est probablement pas parfait, et j'aimerais avoir vos commentaires et suggestions pour l'améliorer. Cordialement,
################################################################################################################
# Vérifie l'état de l'agent ocs inventory. Utilisé dans Intune via la fonction custom compliance script
#
# Version 0.4
# Par Patrick Gagné
#################################################################################################################
# Chemin du fichier de log
$logFilePath = "C:\ProgramData\OCS Inventory NG\Agent\ocsinventory.log"
# Chemin du fichier de log des erreurs
$errorLogFilePath = "c:\Outils\customcompliance_ocsinventory_error.log"
# Fonction pour journaliser les erreurs
function Log-Error {
param (
[string]$errorMessage
)
Add-Content -Path $errorLogFilePath -Value "$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss') - $errorMessage`r`n"
}
# Vérification du service OCS Inventory Service
$ocsServiceOutput = Invoke-Expression -Command "C:\Windows\System32\sc.exe query 'OCS Inventory Service'"
# Extraction des codes de sortie à l'aide de Select-String
$win32ExitCode = $ocsServiceOutput | Select-String 'WIN32_EXIT_CODE\s+:\s+(\d+)' | ForEach-Object { $_.Matches.Groups[1].Value }
$serviceExitCode = $ocsServiceOutput | Select-String 'SERVICE_EXIT_CODE\s+:\s+(\d+)' | ForEach-Object { $_.Matches.Groups[1].Value }
# Vérification de l'état du service
if ($win32ExitCode -eq 0 -and $serviceExitCode -eq 0) {
$AGENT_SERVICE_STATUS = $true
} else {
$AGENT_SERVICE_STATUS = $false
}
# Si le fichier de log existe et des erreurs
if (Test-Path $logFilePath -PathType Leaf) {
try {
# Lecture du contenu du fichier
$logContent = Get-Content $logFilePath -Raw
# Recherche du dernier bloc d'informations débutant par "="
$lastBlock = $logContent -split "={2,}" | Select-Object -Last 1
# Recherche d'erreurs dans le dernier bloc
$errorLines = $lastBlock -split "`r`n" | Where-Object { $_ -match "^ERROR \*\*\*" }
# ...
# Vérification s'il y a des erreurs dans le dernier bloc
if ($lastBlock -match "ERROR \*\*\*") {
$errorLines = $lastBlock -split "`r`n" | Where-Object { $_ -match "^ERROR \*\*\*" }
$errorFound = $false
foreach ($errorLine in $errorLines) {
# Vérification spécifique pour l'erreur "ERROR *** AGENT => Failed to send Prolog <Couldn't resolve host name>"
if ($errorLine -match "^ERROR \*\*\* AGENT => Failed to send Prolog <Couldn't resolve host name>") {
Write-Host "Erreur détectée : $errorLine. Ignorer la vérification de la communication réseau."
$errorFound = $true
break # Sortir de la boucle dès qu'on a détecté cette erreur spécifique
}
# Log de l'erreur dans les autres cas
Log-Error $errorLine
$errorFound = $true
}
if ($errorFound) {
$AGENT_COMMUNICATION_STATUS = $true # Correction : définir à true car l'erreur spécifique est ignorée
} else {
$AGENT_COMMUNICATION_STATUS = $false
}
} else {
$AGENT_COMMUNICATION_STATUS = $true
}
# ...
} catch {
Log-Error "An exception occurred during script execution: $_"
}
}
# Création du tableau associatif
$hash = @{
AgentServiceStatus = $AGENT_SERVICE_STATUS
AgentCommunicationStatus = $AGENT_COMMUNICATION_STATUS
}
# Conversion du tableau associatif en format JSON compressé
return $hash | ConvertTo-Json -Compress